2017-06-19 79 views
0

我在Excel中,在那裏我需要動態創建組合框和列表框的形式。所以,這個想法是,每個列表框都鏈接到組合框。第一個是默認設置的,如果需要添加另一個組合+列表框,用戶可以按「添加」按鈕。因此,對於「添加」按鈕的代碼是以下幾點:添加OnChange事件VBA窗體控件

Private Sub AddCountry_Click() 
aaa = "a" 
Set comb = Controls.Add("Forms.Combobox.1", "CountryList" & Val(CountryLabel.Caption) + 1) 
With comb 
.Top = CountryList1.Top 
.Width = CountryList1.Width 
.Height = CountryList1.Height 
.Left = (CountryList1.Width + 3) * Val(CountryLabel.Caption) + CountryList1.Left 
.AddItem ("--Choose country--") 
For i = 3 To 20 
.AddItem Worksheets("Countries").Range("B" & i).Value 
Next i 
.Text = "--Choose country--" 
End With 

Set listb = Controls.Add("Forms.Listbox.1", "Countries" & Val(CountryLabel.Caption) + 1) 
With listb 
.Top = Countries1.Top 
.Width = Countries1.Width 
.Height = Countries1.Height 
.Left = (Countries1.Width + 3) * Val(CountryLabel.Caption) + Countries1.Left 
.ColumnCount = 2 
.MultiSelect = 1 
End With 
CountryLabel.Caption = Val(CountryLabel.Caption) + 1 
End Sub 

的想法是,該組合框必須將名稱「CountryList」和一個數字,存儲在無形標籤(其中添加每次+1該按鈕被打包),所以它將是CountryList1,CountryList2等。列表框相同。

所以事情是,組合框是由和值(國名)的正確添加。但是我沒有得到,如何在它之後使用它們?的事情,我需要的是 - 當一個組合框被改變(用戶選擇不同的國家),列表框下面必須用一定的值(每個國家不同)。

我認爲,這個問題可能是爲組合/列表框中定義的名稱。那麼是否可以添加動態名稱(CountryList1,CountryList2等),然後以某種方式添加OnChange Events?提前致謝。

+1

你需要有一個Class模塊,帶有'ListBox Events'和'ComboBox Events' –

+0

看看這個問題:https://stackoverflow.com/questions/44409871/dynamic-created-user-form- with-2-dependent-combo-boxes/44410821#44410821 - 我在這裏解決了它。你已經說過,你需要額外的Class作爲@ShaiRado。你跟在我放置的cComboBox類之後。 –

回答

0

下面是組合框的例子。你可以基於它的列表框,因爲原理完全相同。

首先創建一個類名爲cComboBox,並把這個代碼在那裏:

Private WithEvents p_ComboBoxEvents As MSForms.ComboBox 
Private Sub p_ComboBoxEvents_Change() 
    'Here you can handle the events. 
End Sub 
Public Property Let Box(value As MSForms.ComboBox) 
    Set p_ComboBoxEvents = value 
End Property 
Public Property Get Box() As MSForms.ComboBox 
    Set Box= p_ComboBoxEvents 
End Property 

其次,在現有的代碼,你可以添加此cComboBox,只是把你已經添加了ComboBox:

'Add the custom box! 
Private customBox as cComboBox 
Private Sub AddCountry_Click() 
    aaa = "a" 
    Set comb = Controls.Add("Forms.Combobox.1", "CountryList" & Val(CountryLabel.Caption) + 1) 

    With comb 
     .Top = CountryList1.Top 
     .Width = CountryList1.Width 
     .Height = CountryList1.Height 
     .Left = (CountryList1.Width + 3) * Val(CountryLabel.Caption) + CountryList1.Left 
     .AddItem ("--Choose country--") 
     For i = 3 To 20 
      .AddItem Worksheets("Countries").Range("B" & i).Value 
     Next i 
     .Text = "--Choose country--" 
    End With 

Set customBox = New cComboBox 
customBox.Box = comb 

End Sub 

當然,你可能想要創建這些數組,所以你可以有你想要的,不管他們是如何命名的。但是:你會看到,如果你改變了添加組合框值p_ComboBoxEvents_Change將觸發。

+0

?需要'Set'不'Let'你的類屬性和'Set'在小組的最後一行。 –

+0

在VBA中,您使用Let關鍵字編寫set屬性。由於Let部分已經完成了設置,所以在設置此屬性時不需要使用Set。繼續,測試它。 –

+0

呵呵,我從來沒有這樣做,但正如你所說的那樣,它工作得很好。感謝指針。 –