【问题标题】:VBA code works in Access 2007 but doesn't work in Access 2010. Any ideas?VBA 代码在 Access 2007 中有效,但在 Access 2010 中无效。有什么想法吗?
【发布时间】:2020-07-13 22:06:36
【问题描述】:

我的妻子编写了以下代码,当她的组织使用 Access 2007 时,它曾经对她正常工作。他们刚刚更新到 Access 2010,它不再工作。我对 Access 一点也不熟悉,但我建议我将它展示给 Stack,看看你们是否可以直接看到在 Access 2010 中不起作用的任何内容。提前感谢您提供的任何见解。

Private Sub Originating_Zone_AfterUpdate()

Dim EscortDB As DAO.Database

Dim rstBldgs As DAO.Recordset

Set EscortDB = CurrentDb()
Set rstBldgs = EscortDB.OpenRecordset("SELECT BuildingName FROM" & _
" ZoneBldgLookup WHERE ZoneLocation = '" & _
Forms!DateID!EscortIDSubform.Form.[Originating Zone] & _
"' ORDER BY BuildingName", [dbOpenDynaset])


rstBldgs.MoveLast

rstBldgs.MoveFirst

Do Until rstBldgs.EOF
Forms!DateID!EscortIDSubform.Form.[Pick Up Location].AddItem rstBldgs!BuildingName
rstBldgs.MoveNext
Loop

rstBldgs.Close


End Sub

更新:她使用以下代码让它工作。感谢您的帮助!

Private Sub Originating_Zone_AfterUpdate()

Dim sBuildList As String

sBuildList = ("SELECT BuildingName FROM" & _
" ZoneBldgLookup WHERE ZoneLocation = '" & _
Forms!DateID!EscortIDSubform.Form.[Originating Zone] & _
"' ORDER BY BuildingName")

Forms!DateID!EscortIDSubform.Form.[Pick Up Location].RowSource = sBuildList
Forms!DateID!EscortIDSubform.Form.[Pick Up Location].Requery

End Sub

【问题讨论】:

  • 显然该函数用于使用基于上一个下拉列表 (ZoneBldgLookup) 中的输入的表创建的记录集填充下拉菜单。一个链式选择器。第二个下拉菜单根本不再填充。它不会引发任何错误。它是 32 位的。
  • 这是一个 Access 应用程序 -- 连接字符串没有意义。

标签: ms-access vba ms-access-2010 ms-access-2007


【解决方案1】:

这是糟糕的代码。通过遍历记录集和 .AddItem 来填充下拉列表或列表框是非常低效的。只需将 SQL 字符串分配给组合框/列表框的 Rowsource 属性,整个过程无需代码即可完成。

现在,很明显,列表会根据附加此 AfterUpdate 事件的控件中的选择而更改,但这意味着您在此事件中分配了 Rowsource。大概,上面所有的代码都可以用这个替换:

  Forms!DateID!EscortIDSubform.Form.[Pick Up Location].Rowsource = "SELECT BuildingName FROM" & _
     " ZoneBldgLookup WHERE ZoneLocation = '" & _
     Forms!DateID!EscortIDSubform.Form.[Originating Zone] & _
     "' ORDER BY BuildingName"

我不能说代码无法正常工作有什么问题(我怀疑存在沙盒模式/宏安全问题),但代码行数比需要的多。

【讨论】:

    【解决方案2】:

    除了@David-W-Fenton 的建议之外,我认为您应该使用字符串变量来保存 SELECT 语句。然后您可以 Debug.Print 将其打印到即时窗口,将其复制到新查询(在 SQL 视图中),并确保它实际返回行。

    Dim strSql As String
    strSql = "SELECT BuildingName FROM" & _
        " ZoneBldgLookup WHERE ZoneLocation = '" & _
        Forms!DateID!EscortIDSubform.Form.[Originating Zone] & _
        "' ORDER BY BuildingName"
    Debug.Print strSql
    Forms!DateID!EscortIDSubform.Form.[Pick Up Location].Rowsource = strSql
    

    此外,如果这是名为 DateID 的表单模块中的代码,您可以将 Forms!DateID 替换为关键字 Me (这是“此表单”的简写......包含您的代码的表单跑步)。这并没有显着缩短,但如果表单被重命名,Me 将不需要更改。仍然不是什么大不了的事......只是少了一个你不必在路上摆弄的细节。

    【讨论】:

    • 她说:“我在页面上使用了第二个人的建议,但我必须更改行源类型才能使其正常工作。可能需要行源类型在 2010 年或其他地方设置不同,但不是构建记录集,而是将列表定义为字符串。此外,您需要在完成后重新查询,以便它不会继续添加(我认为。没有尝试不去做)。”感谢您的帮助!
    • 是的,当您分配组合框/列表框的行源并且它是一个 SQL 字符串时,它必须是与使用 .AddItem 时不同的类型。不过,我不确定重新查询——设置 Rowsource 会使重新查询完全多余。
    猜你喜欢
    • 2016-01-14
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    相关资源
    最近更新 更多