Excel 访问VBA-触发器组合框更改事件

Excel 访问VBA-触发器组合框更改事件,excel,ms-access,vba,ms-access-2010,Excel,Ms Access,Vba,Ms Access 2010,我一直在玩弄表单设计,现在我已经构建了一个表单,几乎完成了,只剩下一个问题。让我先解释一下: 表单绑定到一个“联接表”,该表只有两个字段——来自“Table1”的ID和来自“Table2”的ID。在这两个字段的基础上,我以相同的形式添加了“Table1”和“Table2”中的字段。然后我添加了2个选项按钮、1个组合框和2个子窗体 这使我能够从每个角度观察连接的两个不同表中的记录——“Table1”或“Table2”视图。我使用选项按钮选择此视图,这将更改Combobox行源,以便您可以从Comb

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

表单绑定到一个“联接表”,该表只有两个字段——来自“Table1”的ID和来自“Table2”的ID。在这两个字段的基础上,我以相同的形式添加了“Table1”和“Table2”中的字段。然后我添加了2个选项按钮、1个组合框和2个子窗体

这使我能够从每个角度观察连接的两个不同表中的记录——“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中选择combobox Listindex,代码将再次工作

所以基本上-我需要的代码,将触发组合框的变化时,选项按钮被点击。当您在组合框中单击时,它工作,但在选项按钮中单击时不工作


我知道这很难理解,请看一下代码,并询问任何问题。感谢您的帮助。

在选项按钮单击事件中调用combobox 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

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

现在,在这种情况下,您每次引用选择选项时都会键入“click”。我想我会支持你的。就我个人而言,我有时会使用
选项卡
和箭头键,这是一个稍微复杂一些的答案,但在理解上面的文本框示例后,您将能够更好地自行解决这个问题。但是,如果您将上面的
AfterUpdate
更改为
单击
,您应该会很好


也就是说,除了鼠标点击之外,还有一些事件可以激活
点击事件。通常不是问题,但由于您正在更改窗体的外观,特别是宽度,您可能需要注意,在使用工具时,子窗体宽度有时可能会来回闪烁。不经常,可能不会太麻烦,但我可能会重新考虑为什么我需要改变宽度,或者是否有更好的触发器。另一个选择:我有一个类似的问题:没有绑定的组合框。在组合框中的'*_Change'事件中,如果我从下拉列表中选择一个值,该值就在那里;但如果删除现有值,则仍会显示先前的值

我在表单上有一个过滤器下拉列表:选择一个值意味着设置(或清除)过滤器。当我选择一个值时,它起作用,但如果我删除它,它就不清楚了

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

Me.dirty = false 

当清除组合框时,代码现在识别空值。这在我的情况下是有效的-当然,如果您不想将任何更新的字段写入数据库,这将是一个问题。

因此基本上-我需要在单击选项按钮时触发组合框更改的代码
我认为,在用户窗体VBA编辑器中设计组合框时,如果您单击选项按钮或执行任何可以触发一些代码,您将被带到该
Sub
,然后您可以在那里输入代码。如果我没有错的话,我想这就是你需要的。我真的很难解释,但底线是-我正在查看一条记录>然后我单击其他选项按钮并查看其他子表单>然后我单击第一个选项按钮,第一个子表单仍然显示相同的记录,尽管Combobox Listindex不再相同。但若我点击Combo下拉列表,代码会再次工作。有什么方法可以触发这个组合框选择吗?
Me.Filter = Mid(lstrMetric, 5)
Me.dirty = false