2016-10-31 30 views
1

以下代碼在工作表的單元格A3中添加了一個ComboBox。它還會寫入代碼,以便在ComboBox中更改值時,將使用該值更新單元格A2。下面是代碼:
將代碼分配給組合框的_Change方法

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(動態創建),並且工作表中會有多行

+0

這裏的問題是試圖動態插入新的VBA。您可以重新使用共享事件,而不是爲每個控件創建新事件。看到這[問題](http://stackoverflow.com/questions/1083603/vba-using-withevents-on-userforms/1923457#1923457)爲一個良好的解決方案。 –

+0

@ destination-data這正是我想要做的。我會放棄它。謝謝 – Zac

回答

0

信任中心在那裏是有原因的。

爲了解決它,你可以把xl-vba文件放在一個特定的文件夾中。然後通過如下信任設置將此文件夾添加爲受信任位置: 信任中心>信任中心設置>受信任位置

但我不確定這是否會比確保選擇信任訪問。但是,這是一個選項。

+1

感謝Vityata的回覆。不幸的是,這種方法不適用於我,因爲用戶無法訪問與我相同的文件夾。我完全同意並理解信託中心背後的推理,因此我還可以使用另一種方法。 – Zac

+0

@Zac,如果找到答案,給我加標籤。 – Vityata

相關問題