首页 > 解决方案 > Access VBA调用函数在运行时什么都不做

问题描述

我有一个正在尝试在 Access 中构建的宏,它将更改一组查询的源表。这是我构建的(基于我在论坛上找到的已经编写的代码):

Function ReplaceSources()

Call SourceQueries

End Function

Sub SourceQueries()

Call UpdateSource("YYYY_Count_of_items_by_floor", Building_Audit_2021, Building_Audit_YYYY)

End Sub

Sub UpdateSource(QueryName, CurrentSourceTable, NewSourceTable)

Dim strQryName, strCTbl, strNTbl, strCsql, strNsql As String
Dim defqry As DAO.QueryDef

strQryName = QueryName
strCTbl = CurrentSourceTable
strNTbl = NewSourceTable

Set defqry = CurrentDb.QueryDefs(strQryName)

strCsql = defqry.SQL
strNsql = Replace(strCsql, strCTbl, strNTbl)
defqry.SQL = strNsql
defqry.Close

End Sub

当我在宏生成器中使用函数名 ReplaceSources() 使用 RunCode 选项时,没有任何反应。我没有收到任何错误,我可以毫无问题地单步执行代码,并且在整个函数和 subs 中添加 Debug.Print 行什么都不做。是什么阻止了这个函数做任何事情?

ETA:如果我添加我正在拼凑的其他两部分代码,也许会有所帮助。在上面的代码之前,我运行:

Function Copy_audit_table()
On Error GoTo Copy_audit_table_Err

    Dim strPath As String
    strPath = CurrentProject.FullName
    DoCmd.TransferDatabase acImport, "Microsoft Access", strPath, acTable, "Building_Audit_2021", "Building_Audit_YYYY", True
    DoCmd.CopyObject "", "YYYY_Count_of_items_by_floor", acQuery, "2021_Count_of_items_by_floor"
    
Copy_audit_table_Exit:
    Exit Function

Copy_audit_table_Err:
    MsgBox Error$
    Resume Copy_audit_table_Exit

End Function

然后在有问题的代码之后,我运行:

Function Copy_audit_table_rename()
On Error GoTo Copy_audit_table_rename_Err

    Dim AuditYear As Variant
    AuditYear = InputBox("Enter audit year (YYYY)")
    Dim strPath As String
    strPath = CurrentProject.FullName
    DoCmd.Rename "Building_Audit_" & AuditYear, acTable, "Building_Audit_YYYY"
    DoCmd.Rename AuditYear & "_Count_of_items_by_floor", acQuery, "YYYY_Count_of_items_by_floor"
    
Copy_audit_table_rename_Exit:
    Exit Function

Copy_audit_table_rename_Err:
    MsgBox Error$
    Resume Copy_audit_table_rename_Exit

End Function

我对 VBA 不太熟悉,所以其中大部分是我在其他地方找到的可以拼凑起来的代码。我知道我可以使用宏生成器来运行每个函数,但我真的不知道任何其他方式。如果有任何推荐的教程可以帮助我编写我想做的代码,我想阅读它们。

标签: vbafunctionms-access

解决方案


您必须执行查询才能发生某些事情。

并跳过宏和函数。您只需拨打以下电话:

Sub UpdateSource(QueryName As String, CurrentSourceTable As String, NewSourceTable As String)

    Dim strCsql As String
    Dim defqry  As DAO.QueryDef

    Set defqry = CurrentDb.QueryDefs(QueryName)

    strCsql = defqry.SQL
    strNsql = Replace(strCsql, CurrentSourceTable, NewSourceTable)
    
    defqry.SQL = strNsql
    defqry.Execute
    defqry.SQL = strCsql
    defqry.Close

End Sub

推荐阅读