【问题标题】:Access VBA calling function does nothing when runAccess VBA调用函数在运行时什么都不做
【发布时间】:2021-07-15 19:26:36
【问题描述】:

我有一个正在尝试在 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 行什么都不做。是什么阻止了这个函数做任何事情?

预计到达时间: 如果我添加与此部分拼凑的其他两部分代码,也许会有所帮助。在上面的代码之前,我运行:

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

【问题讨论】:

  • 请在您执行任何其他操作之前,将Option Explicit 放在每个模块的顶部。它强制执行变量声明并在编译时报告未声明或拼写错误的变量/常量。要在新模块中自动启用此功能,请在 VBA 编辑器中设置 Require Variable Declaration 选项。这确实是 VBA 开发的必备。
  • 为什么要使用宏?无法复制问题。
  • 添加选项显式后,我在两个表名上收到“变量未定义”的消息。我将这些用引号括起来,以防止错误再次弹出,但运行时它仍然没有任何作用。

标签: vba function ms-access


【解决方案1】:

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

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

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

【讨论】:

  • 我不确定这是我正在寻找的解决方案。我正在做的重点是,这是一个 3 步宏的一部分,它复制一个表及其关联的查询,用新的查询替换所有查询的源表,然后重命名所有部分以替换“YYYY”使用询问当前年份的消息框。我正在尝试将其构建到一个宏中,以便单击一次按钮将获得每年设置的表和查询。不,我不想将所有年份合并到一张表中,我希望将它们分开。
  • 好吧,我们只有您发布的信息和问题。对于更广泛的场景,根据需要调整/扩展代码。但是一定要摆脱宏的东西,这是一条死胡同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-21
  • 1970-01-01
  • 2019-01-14
  • 2018-02-11
  • 2014-11-30
  • 2018-12-15
相关资源
最近更新 更多