2016-09-29 111 views
0

我想重用一些代碼,從而使控制器在調用函數獲得不同的結果。問題似乎是要參考我想要更新的不同控制器。使用Excel VBA命令與變量

Function populate(num1, num2) 

Dim index As Integer 
index = ComboBox1.ListIndex 

ComboBox2.Clear 

Select Case index 
    Case Is = 0 
     With ComboBox2 
      ComboBox2.List = Worksheets("Sheet1").Range("A1:A10").Value 
     End With 
    Case Is = 1 
     With ComboBox2 
      ComboBox2.List = Worksheets("Sheet2").Range("A1:A10").Value 
     End With 
    Case Is = 2 
     With ComboBox2 
      ComboBox2.List = Worksheets("Sheet3").Range("A1:A10").Value 
     End With 
End Select 

End Function 

Private Sub ComboBox1_Change() 
Call populate(1, 2) 
End Sub 

Private Sub ComboBox3_Change() 
Call populate(3, 4) 
End Sub 

Private Sub ComboBox5_Change() 
Call populate(5, 6) 
End Sub 

當然,對於我調用的每個組合框(奇數),它應該更新第二個組合框(偶數)的值。但不是將代碼複製到每個奇數編號的組合框中,而是喜歡將某些代碼實際上通過函數調用重用,如上所示。

不幸的是,我不確定如何在VBA中完成這項工作。不用說,我想它是這樣的(不工作):

Function populate(num1, num2) 

Dim index As Integer 
index = ComboBox + num1 + .ListIndex 

ComboBox + num1 + .Clear 

Select Case index 
    Case Is = 0 
     With ComboBox + num2 
      ComboBox + num2 + .List = Worksheets("Sheet1").Range("A1:A10").Value 
     End With 
    Case Is = 1 
     With ComboBox + num2 
      ComboBox + num2 + .List = Worksheets("Sheet2").Range("A1:A10").Value 
     End With 
    Case Is = 2 
     With ComboBox + num2 
      ComboBox + num2 + .List = Worksheets("Sheet3").Range("A1:A10").Value 
     End With 
End Select 

End Function 

也看了一下可能的重複問題,堅韌沒有解決不了我的問題。事實上,即使這個問題似乎是重複的,我也不認爲這個問題是。我試圖結合一個部分命令和一個變量來創建我想要使用的命令,而可能的重複似乎想要稍微不同的東西......我可能是錯的,但這就是我所看到的。

+1

的可能的複製[引用Excel的用戶窗體控件名稱值從字符串(VBA)(http://stackoverflow.com/questions/24083717 /引用-Excel-userform-control-name-value-from-string-vba) – GSerg

回答

1

不是傳遞一個號碼給您populate子程序,傳遞您想過程中組合框:

Sub populate(cb1 As ComboBox, cb2 As ComboBox) 
    Dim index As Integer 
    index = cb1.ListIndex 

    With cb2 
     .Clear 

     Select Case index 
      Case 0 
       .List = Worksheets("Sheet1").Range("A1:A10").Value 
      Case 1 
       .List = Worksheets("Sheet2").Range("A1:A10").Value 
      Case 2 
       .List = Worksheets("Sheet3").Range("A1:A10").Value 
     End Select 
    End With 
End Sub 

Private Sub ComboBox1_Change() 
    populate ComboBox1, ComboBox2 
End Sub 

Private Sub ComboBox3_Change() 
    populate ComboBox3, ComboBox4 
End Sub 

Private Sub ComboBox5_Change() 
    populate ComboBox5, ComboBox6 
End Sub 
1

您可以參考您的組合框,並使用Sheet.Drawingobjects收集其他控件,如:

ActiveSheet.DrawingObjects("ComboBox" & num2) 
1

假設你有用戶窗體組合框,然後你的代碼可以縮短到:

Option Explicit 

Sub populate(num1, num2) 
    Dim shtName As String 

    shtName = "Sheet" & (Me.Controls("Combobox" & num1).ListIndex + 1) 
    With Me.Controls("Combobox" & num2) 
     .Clear 
     .List = Worksheets(shtName).Range("A1:A10").Value 
    End With 
End Sub 

否則,如果您有ActiveX Excel組合框,則會稍微更改爲:

Option Explicit 

Sub populate(num1, num2) 
    Dim shtName As String 

    shtName = "Sheet" & (ActiveSheet.DrawingObjects("ComboBox" & num1).Object.ListIndex + 1) 
    With ActiveSheet.DrawingObjects("Combobox" & num2).Object 
     .Clear 
     .List = Worksheets(shtName).Range("A1:A10").Value 
    End With 
End Sub 
+0

不使用用戶窗體,activeX控件就在工作簿上。我的岳父正試圖用它作爲一種文件。 – SkyRaider

+0

哈毆打我與它編輯:)有趣。我將在明天檢查出 – SkyRaider

+0

@ user2546442,請參閱編輯ActiveX Excel組合框的答案。如果我完成了您的問題,請將答案標記爲已接受。謝謝 – user3598756