String VBA宏,可动态从字符串写入新宏

String VBA宏,可动态从字符串写入新宏,string,vba,excel,module,String,Vba,Excel,Module,是否可以从字符串变量创建Excel VBA宏 假设我们有FirstMacro: Sub FirstMacro() Dim MyString MyString = "Sub SecondMacro()" & Chr(13) & Chr(10) & "MsgBox " & Chr(34) & "Hello" & Chr(34) & Chr(13) & Chr(10) & "End Sub" Debug.P

是否可以从字符串变量创建Excel VBA宏

假设我们有FirstMacro:

Sub FirstMacro()
    Dim MyString
    MyString = "Sub SecondMacro()" & Chr(13) & Chr(10) & "MsgBox " & Chr(34) & "Hello" & Chr(34) & Chr(13) & Chr(10) & "End Sub"
    Debug.Print MyString
    'Here be code that magicly creates SecondMacro
End Sub
运行宏时,我想创建存储在VBA字符串变量中的SecondMacro。第二个宏可以在同一模块或新模块中创建

因此字符串中的第二个宏如下所示:

Sub SecondMacro()
MsgBox "Hello"
End Sub

当然有可能。需要注意的是,您不能在运行代码的模块中添加/删除代码

这将在模块末尾追加代码。如果您可以避免这种情况,尽管您应该这样做,我只使用它来为我通过编程方式添加的按钮添加代码

With Workbooks(ThisWorkbook.Name).VBProject.VBComponents("MyModuleHere").CodeModule
    .InsertLines .CountOfLines + 1, "Sub... End Sub"
End With
因此,要添加到“MyModuleHere”代码模块(假设您有一个名为该模块的模块),请输入以下内容:

Sub addcode()
    Dim subtext As String
    subtext = "Sub PrintStuff" & vbCrLf & "msgbox ""Hello World""" & vbCrLf & "End Sub"
    With Workbooks(ThisWorkbook.Name).VBProject.VBComponents("MyModuleHere").CodeModule
        .InsertLines .CountOfLines + 1, subtext
    End With
End Sub
与往常一样,CPearson增加了一些非常有用的见解:

关于删除代码,我认为您在评论中暗示了这一点,我使用下面的函数查找子名称,并将其删除(假设我知道子名称的长度):


在这里,你有或多或少的变化,希望能解决你的问题。要测试此代码,请将所有代码复制到普通代码模块(默认为“Module1”)中,将其重命名为“Remin”,并在激活工作表的单元格A1中写入“FirstMacro”,即单元格A2中的数字。然后直接从VBE窗口运行以下第一个过程

Sub SelectMacroToRun()
    ' 04 Apr 2017

    Dim MacroName As String
    Dim Arg1 As String
    Dim Outcome As Long

    With ActiveSheet
        MacroName = .Cells(1, 1).Value
        Arg1 = .Cells(2, 1).Value
    End With

    On Error Resume Next
    Outcome = Application.Run(ActiveSheet.name & "." & MacroName, Arg1)
    If Err Then
        MsgBox "The macro """ & MacroName & """ wasn't found", _
               vbInformation, "Error message"
    Else
        If Outcome <> xlNone Then MsgBox "Outcome = " & Outcome
    End If
End Sub

Private Function FirstMacro(Optional ByVal Dummy As String) As Long

    MsgBox "First Macro"
    FirstMacro = xlNone
End Function

Private Function SecondMacro(Arg1 As Long) As Long

    MsgBox "Second Macro" & vbCr & _
           "Argument is " & Arg1

    SecondMacro = Arg1 * 111
End Function

只需运行宏(它可能是一个子集)。如果不想传递参数,请忽略该参数。“Remin”是被调用宏所在的代码表的名称。此名称可以扩展为包含其他工作簿的名称。然而,如果被调用的宏与调用方不在同一个模块中,则它不能是私有的。

可能的重复项为了将代码写入VBA项目,您必须允许访问VBA项目,Microsoft强烈反对访问VBA项目,因此他们没有创建一个后门,通过该后门代码可以创建此类访问-任何人都可以来做他想做的事情用你的机器。VBA访问权限应严格临时授予,这意味着出于所有实际目的,如果不与黑客共享您的电脑,您将无法做您想做的事情。但是,如果可以满足您的需要,您可以根据存储在变量中的内容或从工作表中读取的内容编写代码来选择现有宏。这几乎很好。如果它将代码添加到模块(而不是工作表代码)会更好,如果它将代码添加到指定名称的新模块,则会更好,如果它存在,则会更早地删除:-)@PrzemyslawRemin请尝试我答案底部链接中标题为“将过程添加到模块”的部分:)如果我有时间,稍后将更新答案
Sub SelectMacroToRun()
    ' 04 Apr 2017

    Dim MacroName As String
    Dim Arg1 As String
    Dim Outcome As Long

    With ActiveSheet
        MacroName = .Cells(1, 1).Value
        Arg1 = .Cells(2, 1).Value
    End With

    On Error Resume Next
    Outcome = Application.Run(ActiveSheet.name & "." & MacroName, Arg1)
    If Err Then
        MsgBox "The macro """ & MacroName & """ wasn't found", _
               vbInformation, "Error message"
    Else
        If Outcome <> xlNone Then MsgBox "Outcome = " & Outcome
    End If
End Sub

Private Function FirstMacro(Optional ByVal Dummy As String) As Long

    MsgBox "First Macro"
    FirstMacro = xlNone
End Function

Private Function SecondMacro(Arg1 As Long) As Long

    MsgBox "Second Macro" & vbCr & _
           "Argument is " & Arg1

    SecondMacro = Arg1 * 111
End Function
Application.Run "Remin" & MacroName, Arg1