2017-06-19 23 views
0

私は動的に作成したコンボボックスとリストボックスを必要とするExcelのフォームを持っています。つまり、各リストボックスはコンボボックスにリンクされています。最初のものはデフォルトで設定されており、別のコンボ+リストボックスを追加する必要がある場合、ユーザーは「追加」ボタンを押すことができます。だから、「追加」のコードは、ボタンは以下の通りである:動的に作成されたvbaフォームコントロールにOnChangeイベントを追加する

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 

アイデアは、コンボボックスがこれに+1するたびに追加されます(名称「CountryList」と番号を持つことになりますしなければならない、それは目に見えないラベルに格納されていること、ですボタンが押されているため)、CountryList1、CountryList2などになります。リストボックスも同じです。

ということは、コンボボックスが作成され、値(国名)が正しく追加されているということです。しかし、私はそれを後にそれらを使用する方法を取得していない?私が必要とするのは、コンボボックスが変更されたとき(ユーザーが別の国を選択した場合)、下のリストボックスには特定の値(各国ごとに異なる)を入力する必要があります。

私は、問題はコンボ/リストボックスの名前を定義することにあります。動的な名前(CountryList1、CountryList2など)を追加して、何らかの形でOnChangeイベントを追加することは可能ですか?前もって感謝します。

+1

'ListBox Events'と' ComboBox Events'を含むクラスモジュールが必要です –

+0

この質問をご覧ください:https://stackoverflow.com/questions/44409871/dynamic-created-user-form- 2依存のコンボボックス/ 44410821#44410821 - 私はここでそれを解決しました。 @ShaiRadoが既に言ったように、あなたは余分なクラスが必要です。あなたは私がそこに置くcComboBoxクラスのようなものの後ろにいます。 –

答えて

0

ここにComboBoxの例があります。原理はまったく同じなので、リストボックスの基にすることができます。

まず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を追加し、ちょうどあなたがすでに追加しているコンボボックスを置くことができますが:

'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 

もちろん、名前の付け方にかかわらず、必要な数だけ割り当てることができます。ただし、追加したComboBoxの値を変更すると、p_ComboBoxEvents_Changeがトリガーされます。

+0

?あなたのクラスプロパティで 'Let'を' Set'し、Subの最後の行で 'Set'を必要とします。 –

+0

VBAでは、SetプロパティをLetキーワードで記述します。 「パートを作成する」の部分はすでにこのセットを実行しているので、このプロパティを設定するときにSetを使用する必要はありません。それを試してみてください。 –

+0

こんにちは、私はそれをやったことはありませんでしたが、あなたが言うように、それはうまく動作します。ポインタありがとう。 –

関連する問題