VBA在string中执行代码

我试图执行在一个string内的代码没有写入临时文件中的代码。

举个例子 :

Dim code As String code = "n = 0 : e_i_e = 0 : For e_i_e = 0 To 100 : n+=1 : Next" 

我已经尝试过评估,评估,运行,执行全局和添加一个新的模块

 Set VBComp = ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_StdModule) VBComp.Name = "NewModule" Set VBCodeMod = ThisWorkbook.VBProject.VBComponents("NewModule").CodeModule With VBCodeMod LineNum = .CountOfLines + 1 .InsertLines LineNum, _ "Sub MyNewProcedure()" & Chr(13) & _ code & Chr(13) & _ "End Sub" End With Application.Run "MyNewProcedure" 

但所有这些都返回错误='(。

谢谢 !

您可以创build一个模块,并使用string中的一个子对其进行填充。 事实上,开发人员将他们的vba代码放入存储库的方式之一就是做到这一点:从模块中提取代码为string,然后从任何版本控制软件中读取它们。

这里有一个完整的例子来做你正在做的事情(假设你想要一个新的独立模块):

 Sub make_module_sub_and_run(): Dim strMacro As String Dim myModule As VBComponent Set myModule = ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_StdModule) strMacro = "Public Sub exampleSub()" & vbCrLf & _ " n=0" & vbCrLf & _ " For e_i_e = 0 to 100:" & vbCrLf & _ " n=n+1" & vbCrLf & _ " Next" & vbCrLf & _ " MsgBox(""Hello World. Oh and n="" & n)" & vbCrLf & _ "End Sub" myModule.CodeModule.AddFromString strMacro Application.Run myModule.Name & ".exampleSub" End Sub 

请注意,键入“vbext_ct_StdModule”时应该发生的事情是,excel intellisense会注意到这是缺less的,并会询问您是否要加载它 – 当然,你会这样做。

另外请注意,在运行时,我已经故意在模块名称前面加上子前缀,否则,如果要重复运行它,您将创build一个名称相同的子模块,并且不知道要运行哪个子模块。

在编译完项目之后,您不能破解已经生成的代码,因此您需要确保使用有效的,可编译的代码构build该dynamic模块。

你知道在你按下F5button之前 ,你的代码看起来像这样:

 Sub MyNewProcedure() n = 0 : e_i_e = 0 : For e_i_e = 0 To 100 : n+=1 : Next End Sub 

为什么不把这个片段粘贴到某个地方,看看VBE抱怨什么?

编译错误:语法错误

哇。 看,这就是为什么在同一行代码上填充六个指令是一个坏主意 – 如果是每行一条指令,你不会想知道哪一个是坏的。

如前所述 , n += 1不是VBA语法(也不是C#语法)。 递增VBA中的值需要访问当前值,所以n = n + 1

目前还不清楚ne_i_e来自哪里。 如果两者都是当地人,那么你的程序基本上什么都不做。 如果nMyNewProcedure之外被声明,那么你应该考虑把它作为一个ByRefparameter passing,或者更好的是把它完全抛出去,然后调用一个Function ,调用代码将其赋值给n

 Sub MyNewProcedure(ByRef n As Long) Dim i As Long For i = 0 To 100 n = i Next End Sub 

归结为:

 Function MyNewFunction() As Long MyNewFunction = 100 End Function 

这让我想知道你在做什么。

如果在生成的代码中有一个bug,你将不得不用一个string来debugging它,因为VBE的debugging器不会让你在生成的代码上中断 – 这意味着生成可读的代码是非常重要的可维护的方式。 在你的代码中,你没有任何地方可以使用清晰的string来实际生成完整的代码 – 它在InsertLines调用中内联。

考虑:

 Dim code As String code = "'Option Explicit" & vbNewLine & _ "Public Sub MyNewProcedure()" & vbNewLine & _ " n = 0" & vbNewLine & _ " e_i_e = 0" & vbNewLine & _ " For e_i_e = 0 To 100" & vbNewLine & _ " n = n + 1 ' fixed from n += 1" & vbNewLine & _ " Next" & vbNewLine & _ "End Sub" & vbNewLine '... 'Debug.Print code .InsertLines LineNum, code 

debugging时返回完整的代码要容易得多,而且更容易查看和修复。 请注意,可以链接多less行续行是有限制的。

你的代码是c#另外,它需要是n=n+1

En代码

  n+=1 

这是一个明智的例子,可以用来expression你的意思。 Je suissûrqu'ils'exécutesans erreurs。

J'ai doncessayélaproposée:

 Sub make_module_sub_and_run(): Dim strMacro As String Dim myModule As VBComponent Set myModule = ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_StdModule) strMacro = "Public Sub exampleSub()" & vbCrLf & _ " n=0" & vbCrLf & _ " For e_i_e = 0 to 100:" & vbCrLf & _ " n=n+1" & vbCrLf & _ " Next" & vbCrLf & _ " MsgBox(""Hello World. Oh and n="" & n)" & vbCrLf & _ "End Sub" myModule.CodeModule.AddFromString strMacro Application.Run myModule.Name & ".exampleSub" End Sub 

Ca fonctionne merci! “Microsoft Visual Basic for Extensibility Library”中的这篇文章。 dans outils – >Référence

merci!