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 &lt;&gt; 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.RefreshMe.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.ValueAward_CBox(正如 HansUp 建议的那样)都适用于 RowSource 查询。我选择后者是因为它更简单,但Award_CBox.value 仍然有效,即使我的绑定列没有显示......即它以 0" 列宽隐藏。

以上是关于Access VBA Listbox.Requery 命令清除列表项的主要内容,如果未能解决你的问题,请参考以下文章

在access中用vba如何把SQL语句查询到的一个值赋给变量?

Access + VBA:货币变化。区域设置

ACCESS 2007 - 如何从 VBA 打开选择窗口对话框

如何在VBA中用ADO连接远程的access数据库

VBA (Ms-Access) 从宏调用成员函数

使用 VBA 在 Access 数据库中处理外部 Access 数据库?