将代码分配给Combobox的_Change方法

下面的代码在工作表的单元格A3中添加一个ComboBox 。 它还会写入代码,以便在ComboBox更改值时,单元格A2将更新为该值。 这里是代码:

 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 Center中select了Trust access to the VBA project object model 。 我的问题是,是否有另一种方法来解决这个问题,使用户不必改变他们的PC上的设置? 也许只是在一个Class模块中分配一个macros。 我确实给了这个尝试,但我需要能够将ComboBox的名称传递给被调用的UDF,但不知道该怎么做,或者如果甚至可以用这种方法呢? 我想传递ComboBox名称的原因是: ComboBox的命名约定会给我创buildComboBox的单元格地址。 我需要这个,因为工作表中的每一行都有多个ComboBoxes (dynamic创build),工作表中会有多行

信托中心是有原因的。

为了解决这个问题,你可以把xl-vba文件放在一个特定的文件夹中。 然后将此文件夹添加为受信任位置,通过如下信任设置:信任中心>信任中心设置>受信任的位置

但我不确定这是否会比确保信任访问被选中的工作less。 但是,这是一个选项。