【问题标题】:Call macro from combobox selection从组合框选择调用宏
【发布时间】:2015-06-24 09:36:25
【问题描述】:

我在我的 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

【问题讨论】:

  • 您实际上并没有指出什么不起作用,但我认为JNevill 已经成功了。

标签: excel vba


【解决方案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,它只有一行,那行说调用子程序MC323,它只有一行,该行表示调用子程序MC323

因此,无论如何,您都会陷入无限的递归循环,这是不好的。不要在MC323 内调用子程序MC323。将要运行的代码放入子程序MC323。喜欢……

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

【讨论】:

  • 我实际上是想让它调用一个名为 MC323 的 VBA 模块。我该怎么办?
  • 在那种情况下...您可能在名为..“Module1”或类似名称的模块内有一个名为 MC323 的子例程。您可以在 MC323() 内部使用 Call Modules1.MC323() 行调用它。您最好重命名工作表内或模块内的子例程,以免意外调用错误的MC323()
  • 如果你在这一行放了一个断点(按F9):Select Case ComboBox1.Value,然后通过你的代码调试(按F8),我想你会发现@JNevill 正确确定了您的问题。您的代码调用了适当的 Sub,但 Sub 实际上并没有做任何有用的工作。
【解决方案2】:

你有一个拼写错误,这可能是个问题,无论如何...... 这应该进入 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

【讨论】:

  • 如果我想在组合框旁边放一个“ENTER”按钮让您选择项目,然后单击按钮启动宏怎么办?
  • 那么代码将进入Sub Button1_Click()而不是Sub ComboBox1_click()
【解决方案3】:

我一直想知道为什么我的示例无法运行 - 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 的 Worksheet 模块中:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 2018-03-27
    相关资源
    最近更新 更多