我是这个论坛的第一次用户。这是我的方案:在用户表单上,我有一个组合框,两个文本框和一个' OK'按钮。当用户从组合框的下拉列表中进行选择时,组合框的改变事件被触发,并且事件处理代码基于用户选择用来自工作表的信息填充文本框。然后,用户可以编辑一个或两个文本框中的信息。然后用户点击“确定”。然后,“确定”按钮的单击事件将修改后的信息从文本框写回工作表中的单元格。似乎相当直接。这是我的问题:组合框的更改事件似乎在每次引用其属性时触发。具体来说,下面的cb_CustomersUpdateOK_Click()子例程中的三个实例引用了组合框的ListIndex属性。我在更改事件代码中放置了一个Msgbox,以指示事件何时触发。在OK单击事件代码中的三个assign语句中的每一个上使用断点,组合框在三个语句中的每一个上触发(Msgbox显示)。触发发生时,它会使用组合框选择中的初始数据覆盖文本框中的已编辑信息。 (1)为什么组合框更改事件触发它的方式? (2)我应该做些什么来防止这种情况发生?
过去几个小时我一直在研究这个问题,但我找不到任何非常有用的东西。任何帮助将不胜感激。如果需要更多信息,请告诉我。
Private Sub combo_CustomersUpdateLastName_Change()
MsgBox "combobox changed" 'For debug purposes
With Sheets("Customers")
tb_CustomersUpdateFirstName.Value = .Cells(combo_CustomersUpdateLastName.ListIndex + 2, 2).Value
tb_CustomersUpdatePhone.Value = .Cells(combo_CustomersUpdateLastName.ListIndex + 2, 3).Value
End With
End Sub
...
Private Sub cb_CustomersUpdateOK_Click()
'Copy the updated customer data from the controls to the Customers sheet
With Sheets("Customers")
.Cells(combo_CustomersUpdateLastName.ListIndex + 2, 1).Value = combo_CustomersUpdateLastName.Value
.Cells(combo_CustomersUpdateLastName.ListIndex + 2, 2).Value = tb_CustomersUpdateFirstName.Value
.Cells(combo_CustomersUpdateLastName.ListIndex + 2, 3).Value = tb_CustomersUpdatePhone.Value
'Sort the customer data in case the last name or first name was updated
Range("CustomerInfo").Sort Key1:=.Columns("A"), Key2:=.Columns("B")
End With
MsgBox "Customer data updated."
Unload form_CustomersUpdate
End Sub
答案 0 :(得分:3)
组合框项目的来源是什么?如果它链接到一个范围,则触发更改事件,因为写入工作表会更改链接的源,这反过来意味着组合框会自行刷新。
如果你不希望这种情况发生,那么你需要缓存'范围内的值到数组中并用它们填充combox。