2017-06-24 34 views
0

我用2個文本框,3個按鈕和一個帶有兩列的列表框創建了一個用戶窗體。如果我點擊列表框中的一個條目,所選的列表條目將被轉移到兩個不同的文本框。在VBA中,爲什麼將文本框值放入單元格會觸發另一個用戶窗體子例程中的for循環?

請參見下面的代碼:

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是另一個模塊,我需要在另一個子程序使用創造了一個全局變量。如果我更改了用戶窗體中文本框的條目並單擊更改按鈕,則會執行以下代碼。

此代碼:

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」按鈕,相應的子程序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()例程的其餘部分。

這使得無法從文本框中獲取新數據到其目標單元格。

編輯:

只是爲了更容易地重建所描述的行爲,我導出用戶窗體及其代碼和uploaded它。

+1

在工作簿中是否有任何'Worksheet_Change'事件處理程序? –

+1

我試過你的代碼,並沒有你提到的行爲。它必須與您已有的其他代碼相關。正如joseph4tw提到的,「Worksheet_Change」或「Worksheet_SelectionChange」可能會觸發它。再次檢查您的代碼。 – Tehscript

+0

@ joseph4tw和Tehscript。我唯一擁有的是一個'Worksheet_SelectionChange',它將評論框重新放置到可見屏幕的中間。我評論了整個代碼塊,但行爲仍然相同。我會上傳整個用戶表單,也許這將有助於解決問題。 – d3x

回答

1

這裏是你的代碼是通過(只是重要的部分)會:

1)當初始化用戶窗體,它填充列表框搭配:

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

2)當您單擊列表框項目時,您將觸發NewSourceListBox_Click代碼,使用選定項目填充文本框並將項目索引編號設置爲selectedItem變量。 (這是處理錯誤的。你需要聲明selectedItem作爲公共變量。)

3)然後單擊NewSourceBtnChange觸發NewSourceBtnChange_Click。它設置所選項目的行號:

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

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

您已使用填充您的列表框:

row = 6257 + selectedItem

然後你使用改變這種很細胞

此時,listbox被重新填充,但是這個t ime它已被選中,因此它觸發了NewSourceListBox_Click代碼。

無論何時更改「行來源」範圍,如果選擇了列表框,它的行爲將如此。所以你需要取消選擇列表框項目來解決這個問題。

TL; DR:

後:

row = 6257 + selectedItem 

插入:

NewSourceListBox.Selected(NewSourceListBox.ListIndex) = False 

也能得到其他潛艇selectedItem價值,你需要聲明爲公共變量。在子目錄之外,插入:

Public selectedItem As Long 
+0

非常感謝您的解釋!我不認爲'Sheets(「Datensätze」)。Range(「A」&row).Value = NewSourcesIDTxtBox.Value'會觸發一個代碼塊,我認爲它只在我第一次激活用戶表單時觸發。現在,爲什麼NewSourceBtnChange觸發for循環2次(因爲有2列),以及爲什麼最後一次更改不會觸發for循環(因爲它不用於填充列表框)。這非常有幫助!爲什麼不改變'Userform_Initialize()'也可以工作? – d3x

相關問題