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