2015-04-17 56 views
0

我已经为我的Excel电子表格“Sheet1”添加了一个activex组合框“ComboBox1”,我希望能够根据组合框中的选择调用不同的宏。我有一些宏名称是“MC323”,“MC616”,“MC813”。从组合框选择调用宏

所以基本上你从组合框列表中选择MC616我希望它运行MC616宏。

我已经试过寻找答案,但没有任何因为我。这是我到目前为止,这并不是很多,我肯定不是正确的。

Option Explicit 

Private Sub Workbook_Open() 
With Sheet1.ComboBox1 
ComboBox1.Clear 
    .AddItem "MC323" 
    .AddItem "MC616" 
    .AddItem "MC813" 
End With 
End Sub 

Sub ComoBox1_Change() 
With Sheet1.ComboBox1 
    Select Case ComboBox1.Value 
     Case "MC323": MC323 
     Case "MC616": MC616 
     Case "MC813": MC813 
    End Select 
End With 
End Sub 

Sub MC323() 
    Call MC323 
End Sub 

Sub MC616() 
    Call MC616 
End Sub 

Sub MC813() 
    Call MC813 
End Sub 
+0

你实际上没有指出什么_isn't_工作,但我认为[JNevill](http://stackoverflow.com/a/29701964/2344413)已经达到了它。 – FreeMan

回答

0

你有拼写错误,这可能是一个问题,反正 ...这应该进入工作表Sheet1模块

Sub ComboBox1_Click() 
    Select Case ComboBox1.Value 
    Case Is = "MC323": MC323 
    Case Is = "MC616": MC616 
    Case Is = "MC813": MC813 
    End Select 
End Sub 

这应该进入正规模块,

Sub MC323() 
    MsgBox "MC323" 
End Sub 

Sub MC616() 
    MsgBox "MC616" 
End Sub 

Sub MC813() 
    MsgBox "MC813" 
End Sub 

这在工作簿模块,

Private Sub Workbook_Open() 
    With Sheet1.ComboBox1 
     .Clear 
     .AddItem "MC323" 
     .AddItem "MC616" 
     .AddItem "MC813" 
    End With 
End Sub 
+0

如果我想在组合框旁边放一个“ENTER”按钮以让您选择该项目,然后单击该按钮启动宏,该怎么办? –

+0

然后代码会进入'Sub Button1_Click()'而不是'Sub ComboBox1_click()'。 – FreeMan

+0

得到它的工作。谢谢。 –

1

,直到你在这里一切都看起来很不错:

Sub MC323() 
    Call MC323 
End Sub 

Sub MC616() 
    Call MC616 
End Sub 

Sub MC813() 
    Call MC813 
End Sub 

子程序MC323只有一个行,该行表示调用子程序MC323它只有一条线和线与该行称,以调用子程序MC323只有一行,该行表示调用子程序MC323只有一行,该行表示调用子程序MC323只有一行,该行表示调用子程序MC323只有一行a nd该行表示调用子程序MC323,该子程序只有一行,该行可调用子程序MC323

因此,无论如何,你陷入了一个无限的递归循环,这是不好的。不要在MC323的内部调用子程序MC323。把你想要的代码放入子程序MC323。像...

Sub MC323() 
    MsgBox("Endless recursive loops are bad") 
End Sub 
+0

我实际上试图让它调用名为MC323的VBA模块。我会怎么做呢? –

+0

在这种情况下......你可能有一个子程序名为MC323,名称为“Module1”的模块或类似的东西。你可以用'Call Modules1.MC323()'这行来在'MC323()'里面调用它。如果你在这一行上放置了一个断点(按'F9'):'Select Case ComboBox1()'在你的工作表或模块内重命名子例程,这样你就不会错误地调用错误的'MC323()' – JNevill

+0

.Value',然后通过代码进行调试(按'F8'),我想你会发现@JNevill已经正确地识别了你的问题。你的代码调用了适当的'Sub',但是'Sub'实际上并没有做任何有用的工作。 – FreeMan

0

我一直在想为什么我不能让我的例子工作 - MC323,MC616和MC813也是工作表单元格引用。

因此.....确保您有一个代码名为Sheet1和一个名为ComboBox1的ActiveX组合框。 放在ThisWorkbook模块:

Private Sub Workbook_Open() 

    With Sheet1 
     .ComboBox1.Clear 
     .ComboBox1.AddItem "MC323" 
     .ComboBox1.AddItem "MyMacro2" 
     .ComboBox1.AddItem "MyMacro3" 
    End With 

End Sub 

注意的第一个项目将导致错误 - “无法运行宏‘MC323’。该宏可能无法在此工作簿中使用,或者所有宏都可能被禁用。

在一个正常的模块:

Public Sub MC323() 
    MsgBox "1" 
End Sub 

Public Sub MyMacro2() 
    MsgBox "2" 
End Sub 

Public Sub MyMacro3() 
    MsgBox "3" 
End Sub 

最后,工作表Sheet1工作表模块中:

Private Sub ComboBox1_Change() 
    Application.Run Sheet1.ComboBox1.Value 
End Sub 

有用的链接,帮助文件:

Application.Run Method

Ron de Bruin - How do I use Application.Run in Excel