【问题标题】:Call Macro by wildcard in cell in Excel VBA在 Excel VBA 的单元格中通过通配符调用宏
【发布时间】:2014-02-05 17:27:24
【问题描述】:

我目前在 Excel 中有一个组合框,它被分配给一个单独的工作表上的“宏列表”,其中列出了大约 200 个不同的宏。有时搜索下拉列表以获取您要选择的宏可能会很麻烦(它们按数字顺序排列,所以还不错),但我认为这可能会更好。

大多数宏都以“PA1111_Name”这种方式构成——我希望用户在单元格中只输入 1111 并按下指向上述宏的“运行”按钮。在 SQL 中会是这样的:

SELECT Macro FROM Module WHERE Macro Like '*' & Cell.A2 & '*'

这些数字是独一无二的,所以我不关心获取多个宏的可能性。

谢谢!

【问题讨论】:

  • 您是否总是希望一次只调用一个宏,或者如果它们的名称符合条件,可能需要调用更多宏?
  • 一种快速的方法可能是将它们全部包含在一个 sub 中,并使用 case 语句仅运行您想要的代码部分。除此之外,如果它在表单中,您可以使用按名称调用函数,如果在模块中,则可以使用 Application.Run
  • @KazJaw 是的,在这种情况下,一次只会调用一个宏。
  • @user2140261 - 这些宏有时会被编辑,我担心超过 200 个案例语句会是什么样子?我正在努力使此列表尽可能易于管理。
  • 所以你应该可以只使用Application.Run "PA" & [A2] & "_Name"

标签: vba excel wildcard


【解决方案1】:

下面将遍历Active VBProject的映射模块中的所有宏,并测试名称是否包含在A1中找到的值,如果是,它将运行该宏,如果没有找到它显示No Macro's Found Matching输入值。

请记住,这只会运行它找到的第一个包含值的宏,因为我假设您在宏名称中没有重复值。

Sub RunMacroContainingValue()
Dim cpCurrent As VBComponent
Dim lngCurrentLine As Long
Dim SubName As String
For Each cpCurrent In Application.VBE.ActiveVBProject.VBComponents
    If cpCurrent.Name = "Mapping" Then
        With cpCurrent.CodeModule
            lngCurrentLine = .CountOfDeclarationLines + 1
            Do Until lngCurrentLine >= .CountOfLines
                SubName = .ProcOfLine(lngCurrentLine, 0)
                If InStr(SubName, [A1]) > 0 Then
                    Application.Run SubName
                    Exit Sub
                End If
                lngCurrentLine = .ProcStartLine(SubName, 0) + _
                .ProcCountLines(SubName, 0) + 1
            Loop
        End With
    End If
Next cpCurrent
MsgBox "No Values Found Matching Value"
End Sub

【讨论】:

    猜你喜欢
    • 2015-08-28
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    相关资源
    最近更新 更多