我的妻子编写了以下代码,当她的组织使用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
答案 0 :(得分:3)
这是可怕的代码。通过遍历记录集和.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"
我不能说代码不能正常工作有什么问题(我怀疑沙箱模式/宏安全问题正在发生),但它的代码行数比需要的多。
答案 1 :(得分:1)
除了@ 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
。仍然没有什么大不了的......只需少一个细节,你就不必在路上捣乱。