Access VBA - 触发组合框更改事件

Posted

技术标签:

【中文标题】Access VBA - 触发组合框更改事件【英文标题】:Access VBA - Trigger combobox change event 【发布时间】:2016-04-02 17:19:12 【问题描述】:

我一直在玩表单设计,现在我构建了一个表单,它几乎完成了,只剩下一个问题。我先解释一下:

Form 绑定到一个“Join Table”,它只有 2 个字段 - 来自“Table1”的 ID 和来自“Table2”的 ID。基于这两个字段,我在同一表单上添加了来自“Table1”和“Table2”的字段。然后我添加了 2 个选项按钮,1 个 Combobox 和 2 个 Subforms。

这使我可以从每个角度(“Table1”或“Table2”视图)查看连接的两个不同表中的记录。我正在使用选项按钮选择此视图,这会更改 Combobox 行源,因此您可以从 Combobox 导航到记录。

代码如下:

Private Sub OptButton0_Click()
        If Me.OptButtonO.Value = True Then

        Me.OptButton1.Value = False

       Me.Cmbox.RowSource = "SELECT [Table1].[Field1], [Table1].[Field2], [Table1].[Field3] FROM Table1 ORDER BY [Field1];"

      Me.Cmbox.SetFocus
      Me.Cmbox = Me.Cmbox.ItemData(0)

        End If

 End Sub

 Private Sub Cmbox_AfterUpdate()   
   If Me.OptButton0.Value = True Then

    If IsNull(Me!Cmbox) Then Exit Sub

    With Me.RecordsetClone
      .FindFirst "[Field1] = " & Me!Cmbox
      If Not .NoMatch Then
         If Me.Dirty Then Me.Dirty = False
         Me.MySubform.Width = 8280
         Me.MySubform.SourceObject = "MySubform"
         Me.Bookmark = .Bookmark
      Else
         Me.MySubform.Width = 8000
         Me.MySubform.SourceObject = ""
      End If

    End With

Me.Cmbox.SetFocus
DoCmd.Requery

End If

End Sub

这个贴出的代码只针对一个选项按钮,第二个是一样的,正好相反。现在有什么问题?

问题是,当我通过 Combobox 浏览记录时,单击第二个选项按钮以查看另一个视图,然后返回到同一视图,我的子表单结果与单击另一个选项按钮时保持相同,尽管 Combobox listIndex 为 0。如果我从 Combobox 中选择了组合框 Listindex,代码又可以工作了。

所以基本上 - 我需要在单击选项按钮时触发组合框更改的代码。它在您单击组合框时有效,但在单击选项按钮时无效。

我知道理解起来很复杂,请看代码,有什么问题可以问。任何帮助表示赞赏。

【问题讨论】:

SO BASICALLY - I NEED CODE THAT WILL TRIGGER COMBOBOX CHANGE WHEN OPTION BUTTONS ARE CLICKED 我认为在用户窗体 VBA 编辑器中设计组合框时,如果您单击选项按钮或执行任何可能触发某些代码的操作,您将被带到 Sub 然后您可以在那里输入代码。如果我没记错的话,我想这就是你需要的。 这对我来说真的很难解释,但底线是 - 我正在查看一条记录>然后我单击其他选项按钮并查看其他子表单>然后单击第一个选项按钮并第一个子表单仍然显示相同的记录,尽管 Combobox Listindex 不再相同。但是,如果我单击 Combo 下拉列表,代码将再次起作用。有什么方法可以触发这个组合框选择吗? 【参考方案1】:

另一种选择:我遇到了类似的问题:未绑定的组合框。在组合框中的“* _Change”事件中,如果我从下拉列表中选择一个值,则该值就在那里;但是如果我删除现有的值,之前的值仍然会显示出来。

...

If Me.series_filter > "" Then
    lstrMetric = lstrMetric & "and X.series_name = '" & Me.series_filter & "' "
End If

...

Me.Filter = Mid(lstrMetric, 5)

...

我在表单上有一个过滤器下拉菜单:选择一个值意味着设置(或清除)过滤器。当我选择一个值时它可以工作,但如果我删除它就不会清除。

我在代码开头添加了一行来提交更新:

Me.dirty = false 

当组合框被清除时,代码现在可以识别空值。这适用于我的情况 - 当然,如果您不希望将任何更新的字段写入数据库,这将是一个问题。

【讨论】:

【参考方案2】:

在选项按钮点击事件中调用组合框afterupdate事件:

private sub optbutton0_click()
    ...
    cmbox_afterupdate()
end sub

PS:您应该将它们放在一个框架中,而不是直接为选项按钮设置事件,(即使您必须使框架透明以阻止它出现)并使用框架的 afterupdate 或 click 事件,从而您可以通过选项值获取选定的选项按钮:

private sub frame0_click()
    select case frame0
        case 0 'option button 0 is selected
            ...
        case 1 
        ...
    end select
end sub

【讨论】:

【参考方案3】:

在 Access 中,控件可能很有趣。我的意思是,当您更改选项时,您会看到它发生了变化,它在屏幕上发生了变化……但控件并不总是立即更改其.value……这意味着它不会立即更改Update。为了更简单地说明此原理,请创建一个文本框,在其中输入一些内容,然后查看即时窗口中的 textbox.value。然后,光标仍在文本框中,退格其中的一些。再次检查该值。多做几次。开始在您的测试中包含textbox.text。有多种方法可以解决此问题,但最重要的是了解控件何时实际更新,以便您更好地了解何时以及使用哪些变通方法。

现在,在这种情况下,您每次在提及选择选项时都输入“点击”。我想我会坚持你的。就个人而言,我有时会使用Tab 和箭头键,这将是一个稍微复杂一点的答案,但是在理解了上面的文本框示例之后,你会更好地解决自己的问题。但是,如果您将上面的AfterUpdate 更改为Click,您应该会很好。

也就是说,除了鼠标点击之外,还有一些事件可以激活Click 事件。通常不是问题,但由于您正在更改表单的外观,特别是宽度,您可能需要注意子表单的宽度有时可能会在使用您的工具时来回闪烁。不经常,可能不会太烦人,但我可能会重新考虑为什么我需要改变宽度,或者是否有更好的触发器。

【讨论】:

以上是关于Access VBA - 触发组合框更改事件的主要内容,如果未能解决你的问题,请参考以下文章

Access 2010 组合框事件根本不会触发

Access VBA中不稳定的组合框比较

从访问 vba 中的多值组合框中获取值

如何在 MS Access 2010 中使用 VBA 选择多值组合框的值?

组合框更改事件正在触发工作表中的任何更改

Flash/Actionscript2 - 无法触发组合框“更改”事件