在VBA中,为什么将一个文本框的值放入一个单元格触发另一个用户表单子程序中的for循环?

我创build了2个文本框,3个button和一个带有两列的列表框。 如果我点击列表框中的一个条目,被选中的列表条目被转移到两个不同的文本框。

请参阅下面的代码:

Private Sub NewSourceListBox_Click() Dim i As Integer 'Show the selected data in the corresponding text boxes For i = 0 To NewSourceListBox.ListCount - 1 If NewSourceListBox.Selected(i) Then 'Hide the add button and show the change button NewSourceBtnChange.Top = 168 NewSourceBtnChange.Visible = True NewSourceBtnAdd.Visible = False NewSourcesIDTxtBox.Value = NewSourceListBox.List(i, 0) NewSourcesSourceTxtBox.Value = NewSourceListBox.List(i, 1) 'Pass on the selected item row to another subroutine selectedItem = i Exit For End If Next i End Sub 

selectedItem是在另一个模块中创build的全局variables,我需要在另一个子例程中使用它。 如果我更改了用户窗体中的文本框中的条目,并单击更改button,下面的代码被执行。

此代码:

 Private Sub NewSourceBtnChange_Click() Dim row As Integer row = 6257 + selectedItem 'Change the selected data in the list box to the corresponding data in the text boxes Sheets("Datensätze").Range("A" & row).Value = NewSourcesIDTxtBox.Value Sheets("Datensätze").Range("B" & row).Value = NewSourcesSourceTxtBox.Value 'Another duplicate entry to make vLookup work Sheets("Datensätze").Range("C" & row).Value = NewSourcesIDTxtBox.Value Unload Me 'Unload the new entry user form to repopulate the comboboxes Unload NewEntryUserForm NewEntryUserForm.Show End Sub 

如果我通过F8逐步观察,则会发生以下情况:只要单击“NewSourceBtnChange”button,相应的子程序NewSourceBtnChange_Click()启动。 当我到达Sheets("Datensätze").Range("A" & row).Value = NewSourcesIDTxtBox.Value程序跳转到NewSourcesListBox_Click()例程,执行两次并跳回到Sheets("Datensätze").Range("B" & row).Value = NewSourcesSourceTxtBox.Value ,然后执行另外两次NewSourcesListBox_Click()例程并跳回到最后一个Sheets("Datensätze").Range("C" & row).Value = NewSourcesIDTxtBox.Value并执行NewSourceBtnChange_Click()例程的其余部分。

这使得不可能从文本框中获得新的数据到其指定的单元格中。

编辑:

为了简化重构所描述的行为,我导出了用户表单及其代码并上传了它。

这里是你的代码正在经历(只是重要的部分):

1)初始化用户窗体时,它填充列表框:

.RowSource = "Datensätze!A6257:B" & 6257 + Sheets("Datensätze").Range("F2").Value - 1

2)当你点击列表框项目,你触发NewSourceListBox_Click代码,填充文本框与选定的项目和设置项目索引编号为selectedItemvariables。 (这是错误的,你需要将selectedItem声明为公共variables。)

3)然后你点击NewSourceBtnChange触发NewSourceBtnChange_Click 。 它设置您select的项目的行号:

row = 6257 + selectedItem

然后你改变这个非常细胞使用:

Sheets("Datensätze").Range("A" & row).Value = NewSourcesIDTxtBox.Value

你已经用它来填充你的列表框:

.RowSource = "Datensätze!A6257:B" & 6257 + Sheets("Datensätze").Range("F2").Value - 1

此时,列表框再次被填充,但是这次它已经被选中,所以它触发NewSourceListBox_Click代码。

无论何时更改行来源范围,如果select列表框,它将performance如下。 所以你需要取消select列表框项目来解决这个问题。

TL; DR:

后:

 row = 6257 + selectedItem 

插:

 NewSourceListBox.Selected(NewSourceListBox.ListIndex) = False 

另外为了能够在其他潜艇中获得selectedItem值,你需要将其声明为公共variables。 在子目录之外,在最上面插入:

 Public selectedItem As Long