コードの_Changeメソッドにコードを割り当てると、ワークシートのセルA3
にComboBox
が追加されます。 ComboBox
で値が変更されると、セルA2
がその値で更新されるようにコードを書き込みます。ここでは、コードは次のようになります。
Combobox
Sub AddComboBox()
Dim oWS As Worksheet: Set oWS = ThisWorkbook.Worksheets("Sheet7")
Dim oRN As Range: Set oRN = oWS.Range("A3")
Dim oCB As Object
Dim sCode As String
Dim iLR As Integer
' Get last row for column D (holds the values for combobox)
With oWS
iLR = .Cells(.Rows.Count, "D").End(xlUp).Row
End With
' Create Combobox
With oRN
Set oCB = oWS.OLEObjects.Add("Forms.Combobox.1", Left:=.Left, Top:=.Top, Height:=.Height, Width:=.Width)
oCB.ListFillRange = "Sheet7!D1:D" & iLR
oCB.Name = "cmbTest1"
oCB.Object.Font.Size = 8
End With
' Set code to add for the Combobox
sCode = "Private Sub " & oCB.Name & "_Change()" & Chr(13) & _
" ThisWorkbook.Worksheets(" & Chr(34) & oWS.Name & Chr(34) & ").Range(" & Chr(34) & "A2" _
& Chr(34) & ").Value = Me." & oCB.Name & ".Value" & _
"End Sub"
' Add the code for Combobox
With ThisWorkbook.VBProject.VBComponents(oWS.Name).CodeModule
.InsertLines .CountOfLines + 1, sCode
End With
End Sub
コードが正常に動作しますが、それが機能するため、ユーザーはTrust access to the VBA project object model
がセキュリティセンターで選択されていることを確認する必要があります。私の質問は、ユーザーが自分のPCの設定を変更する必要がないように、この問題に近づく別の方法がありますか?つまり、クラスモジュールでマクロを割り当てるだけかもしれません。私はthisを試してみましたが、私はComboBox
の名前をUDFに渡すことができる必要がありますが、これを行うにはどうしたらいいのでしょうか、それともこの方法でも可能でしょうか?私がComboBox
の名前を渡したい理由は、ComboBox
の命名規則が私にComboBox
が作成されたセルアドレスを与えるからです。シートの各行に複数のComboBoxes
(動的に作成された)があり、シートに複数の行があります。
ここでの問題は、新しいVBAを動的に挿入しようとしていることです。各コントロールに新しいイベントを作成する代わりに、共有イベントを再利用することができます。十分に提示されたソリューションについては、この[質問](http://stackoverflow.com/questions/1083603/vba-using-withevents-on-userforms/1923457#1923457)を参照してください。 –
@ destination-dataこれはまさに私がやりたいことです。私はそれを行こう。お返事ありがとう – Zac