Access VBA Listbox.Requery 命令清除列表项
Posted
技术标签:
【中文标题】Access VBA Listbox.Requery 命令清除列表项【英文标题】:Access VBA's Listbox.Requery command clears ListItems 【发布时间】:2017-10-20 22:55:10 【问题描述】:我有一个访问表单,我希望用户在其中选择一个 AwardNumber。当他们选择奖项时,该奖项的相关文档会显示在“未完成”或“完成”列表框中。然后我希望他们能够将项目从一个列表移动到另一个列表。列表框是单选的。
这是后端:
不完整的列表框(在设计中说未绑定)有 3 列。 Bound 列是 1,但第 1 列和第 3 列的宽度为 0,因此被隐藏。该列表框还具有以下 RowSource:SELECT DocTbl.DocID, DocTbl.DocTitle, DocTbl.DocLink
FROM DocTbl
WHERE ((DocTbl.Complete <> Yes) AND (DocTbl.AwardNumber = Forms!Select_Doc_To_Code!Award_CBox.Text))
ORDER BY DocTbl.DocID
(完整的 ListBox 具有相同的功能,除了 DocTbl.Complete <> Yes
而不是 DocTbl.Complete = Yes
。)
当他们在 ComboBox 中选择 AwardNumber 时,有一些 VBA 会运行以下命令来填充列表,这会按预期工作:Me.Incompletes.Requery
Me.Completes.Requery
这两个按钮触发代码“移动”项目。这是顶部按钮的代码,用于将文档从“未完成”列表框“移动”到“完成”列表框(即将文档的“完成”值设置为“是”,然后重新查询列表框)。指示的行是出错的地方:
Sub Move_To_Complete_Click()
docID = Incompletes.Column(0, Incompletes.ListIndex)
Set Tbl = CurrentDb.TableRefs("DocTbl")
Set db = CurrentDb
db.Execute = "UPDATE DocTbl " & _
" SET DocTbl.Complete = Yes " & _
" WHERE DocTbl.DocID = " & docID
---->Me.Incompletes.Requery
---->Me.Completes.Requery
End Sub
换句话说,UPDATE 查询有效(我在表中看到更新的数据),但是当我尝试重新查询两个 ListBox 以刷新它们时,所有项目都消失了!此外,如果我从组合框中选择另一个奖项,然后重新选择 相同 奖项,列表会再次正确填充,只需运行相同的 .Requery 命令!
我试过Me.Refresh
、Me.Recalc
。我也尝试过再次设置 RowSource。我想知道它是否过早地重新查询;我已经放置了断点和 DoEvents,所以我认为这不是时间问题,但可能更多的是代码需要停止运行以重新查询工作。这没有任何意义,因为重新查询 is 代码。
我知道还有其他方法可以做到这一点(我已经尝试过但失败了),但我真的很想知道为什么这种方法不起作用。
提前致谢!!
【问题讨论】:
为什么在列表框行源中使用组合框的 .text 属性而不是 .value?尝试使用 .value 重写它。如果 .value 不起作用,请尝试使用 .column(0) 我在某个地方发现了这个问题并且查询有效。即,列表框填充了正确的信息。他们只是在重新查询后不填充。对于它的价值,我试过 .value (没用)。您可以在行源查询中使用 .Column 语法吗?我该怎么写? 当您通过将Forms!Select_Doc_To_Code!Award_CBox.Text
更改为简单的Forms!Select_Doc_To_Code!Award_CBox
来修改查询时会发生什么?那么Requery
步骤是否正常工作?
@AlexSilverman .Text 与 vba 中的 .Value:***.com/questions/2844193/…
谢谢,DataWriter。我很困惑,因为您似乎在建议修改我的 VBA 代码。但是我只在ListBox控件的RowSource中引用了Award_CBox.Text,在VBA代码中没有引用。
【参考方案1】:
您正在使用 .Text
属性,就像 DataWriter 建议的那样,您不应该这样做。
.Text
属性仅在字段具有焦点时可用(请参阅MSDN)。
因为您在OnClick
事件中为Move_To_Complete
按钮调用它,所以该按钮具有焦点,因此.Text
属性不可用。
两种解决方法:
-
在重新查询之前使用
Award_CBox.SetFocus
使用Forms!Select_Doc_To_Code!Award_CBox.Value
来使用value 属性。请注意,这假定绑定的列与正在显示的列相同。
【讨论】:
非常感谢您的解释。我以为我之前尝试过 .value 但它没有用。Award_CBox.Value
和 Award_CBox
(正如 HansUp 建议的那样)都适用于 RowSource 查询。我选择后者是因为它更简单,但Award_CBox.value
仍然有效,即使我的绑定列没有显示......即它以 0" 列宽隐藏。以上是关于Access VBA Listbox.Requery 命令清除列表项的主要内容,如果未能解决你的问题,请参考以下文章
在access中用vba如何把SQL语句查询到的一个值赋给变量?