将代码分配给组合框的{更改方法

时间:2016-10-31 10:26:46

标签: excel vba combobox

下面的代码会在工作表的单元格ComboBox中添加A3。它还会编写代码,以便在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 access to the VBA project object model。我的问题是,有没有其他方法来解决这个问题,以便用户不必更改他们的PC上的设置?也许只是在Class模块中分配一个宏。我确实尝试了this但是我需要能够将ComboBox的名称传递给被调用的UDF,但是不知道如何做到这一点,或者这种方法是否可行?我想传递ComboBox名称的原因是:ComboBox的命名约定将为我提供创建ComboBox的单元格地址。我需要这个,因为工作表中的每一行都有多个ComboBoxes(动态创建),并且工作表中会有多行

1 个答案:

答案 0 :(得分:0)

信托中心是有原因的。

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

但我不确定这是否比确保选择Trust访问权限要少。但是,这是一个选择。