在另一个工作簿中的工作表类代码模块中运行代码

时间:2017-03-20 15:49:40

标签: excel vba excel-vba

此代码位于工作簿中。 (在工作表类代码模块中)

Sub Testie()
Dim FullPathAndName As String
 Let FullPathAndName = "'" & ThisWorkbook.Path & "\" & "NeuProAktuelleMakros.xlsm'"
 Application.Run Macro:=FullPathAndName & "!FrmProTypeIn", Arg1:=42
End Sub

在另一个名为“NeuProAktuelleMakros.xlsm”的工作簿中,我有这个代码,(在普通代码模块中):

Sub FrmProTypeIn(MyArg As Long)
 MsgBox prompt:="Got Here :). The answer is " & MyArg & " , I forgot the question"
End Sub

如果我运行第一个代码,它会运行第二个代码,(这告诉我我到了那里,答案是42,我忘了这个问题)

我更希望将代码FrmProTypeIn()(当前在正常代码模块中)放在工作表代码模块中。工作表名称为“FoodsLookUpTable”。工作表代码名称为“Tabelle11”

这可能,你能给我语法吗?

如果那是不可能的,那么简单的解决方法呢? - 我能想到的显而易见的事情是在工作簿“NeuProAktuelleMakros.xlsm”中的普通模块中有一个调用代码,因此:

Sub CallFrmProTypeIn(MyArg As Long)
 Application.Run Macro:=Worksheets("FoodsLookUpTable").FrmProTypeIn(MyArg)
End Sub

然后我稍微修改第一个代码:

Sub Testies2()
Dim FullPathAndName As String
 Let FullPathAndName = "'" & ThisWorkbook.Path & "\" & "NeuProAktuelleMakros.xlsm'"
 Application.Run Macro:=FullPathAndName & "!CallFrmProTypeIn", Arg1:=42
End Sub

该解决方法有效。但也许有一种更简单的方法?

3 个答案:

答案 0 :(得分:0)

语法为:

Let FullPathAndName = "'" & ThisWorkbook.Path & "\" & "NeuProAktuelleMakros.xlsm'"
 Application.Run Macro:=FullPathAndName & "!Sheet1.FrmProTypeIn", Arg1:=42

答案 1 :(得分:0)

@ Peh 嗨,Peh 我没试过。它的变化和变化确实有效。十分感谢。我被告知这是不可能的,因为我被告知无法从另一个工作簿中的工作表代码模块运行代码。 我想知道这是否告诉我技术上我的代码现在变成了Worksheets类模块的属性。 所以前三行是你工作的建议的变体。 最后两个是我一直尝试的典型变体,它不起作用

 Sub PehTesties()
  Workbooks("NeuProAktuelleMakros.xlsm").Application.Run Macro:=Worksheets("FoodsLookUpTable").FrmProTypeIn(42)
  Application.Run Macro:=Worksheets("FoodsLookUpTable").FrmProTypeIn(42)
  Application.Run   Macro:=Workbooks("NeuProAktuelleMakros.xlsm").Worksheets("FoodsLookUpTable").FrmProTypeIn(42)
  ' Application.Run Macro:=Workbooks("NeuProAktuelleMakros.xlsm").Worksheets("FoodsLookUpTable").FrmProTypeIn Arg1:=42
  ' Application.Run Macro:="'" & ThisWorkbook.Path & "\" & "NeuProAktuelleMakros.xlsm'!FoodsLookUpTable!CallFrmProTypeIn", Arg1:=42
  End Sub

再次感谢 艾伦

答案 2 :(得分:0)

总结繁荣:(根据任何更正评论的编辑。;))

您似乎可以从另一个工作簿调用Excel代码例程(包括工作表类代码模块中的代码)。您可以将任何可选或必需的参数传递给被调用的例程。

文件不太清楚,或者没有全部解释,或者是错误的。

使用相同的例子,我可以..

_1)做一个简单的电话

Call Workbooks("NeuProAktuelleMakros.xlsm").Worksheets("FoodsLookUpTable").FrmProTypeIn(42)
Workbooks("NeuProAktuelleMakros.xlsm").Worksheets("FoodsLookUpTable").FrmProTypeIn 42

_2)有一个Application.Run方法。

_2a)但我建议这段代码虽然“有效”,但可能没有机会使用它。

 Macro:=Workbooks("NeuProAktuelleMakros.xlsm").Worksheets("FoodsLookUpTable").FrmProTypeIn(42)

我这样说,因为我可以做到这一点,它也“有效”

Dim vTemp As IBlogPictureExtensibility
 Let vTemp = Workbooks("NeuProAktuelleMakros.xlsm").Worksheets("FoodsLookUpTable").FrmProTypeIn(42)

我希望在后者中我没有机会扩展可扩展博客图片的能力,因为评估由=做了自动密集启动代码,因为我意外地在VB组件中暴露了它(Tabelle11 )interface,其中伪使Object成为伪后期绑定类型stylio

这也有效

       If Workbooks("NeuProAktuelleMakros.xlsm").Worksheets("FoodsLookUpTable").FrmProTypeIn(42) Then MsgBox prompt:="It wasn't, but it did, so then perhaps was, was but too late - and then ....  like did an auto intensively initiation of the routine as I accidently exposed it at the VB Component ( Tabelle11 ) interface, which pseudo made the Object in a pseudo late binding type stylio. It was not Late, it came too late"

也许我们可以将上面称为“伪”运行方法,运行方式或运行方式

_2b)Aplication.Run“StringReferrenceToMacroName”,MacroArgument1,MacroArgumet2,..... 我认为这是正确使用Application.Run方法;我相信这是有线的,以获取宏的字符串名称的字符串引用,以及它的任何参数。因此基本语法是

 Application.Run Macro:="'NeuProAktuelleMakros.xlsm'!Tabelle11.FrmProTypeIn", Arg1:=42

这里重要的是不要像我一样混淆像Tabelle11.FrmProTypeIn这样的代码位,最后一个字符串部分是宏名称。例如,可以通过按Alt + F8列出宏的文字名称来查看此宏名称      http://imgur.com/KL9pwFq

使用Application.Run方法的一个有趣的优点是可以扩展字符串引用以包括工作簿的完整路径。如果工作簿处于打开状态,则无效。但是,如果关闭了工作簿,则会通过此表单的代码行打开工作簿:

 Application.Run Macro:="'H:\ALERMK2014Marz2016\NeueBlancoAb27.01.2014\AbJan2016\OutlineGrouping\RoryAppRun\NeuProAktuelleMakros.xlsm'!Tabelle11.FrmProTypeIn", Arg1:=42

_.....

最后几点说明:

_A)这两个代码实际上是在做同样的事情:

 Workbooks("NeuProAktuelleMakros.xlsm").Application.Run Macro:=Worksheets("FoodsLookUpTable").FrmProTypeIn(42)
 Application.Run Macro:=Worksheets("FoodsLookUpTable").FrmProTypeIn(42)

只有在Workbooks(“NeuProAktuelleMakros.xlsm”)处于活动状态时,它们才有效。这表明具有不合格工作簿的Application.Run将转到活动工作簿。我认为这是向我们展示VBA实际上不是面向对象编程语言的场合之一。应用程序可以在各个级别调用,但有效地“备份”层次结构,因此使用工作簿(“NeuProAktuelleMakros.xlsm”)无效。 同样,如果“ProAktuellex8600x2.xlsm”是我的工作簿,其中包含代码(或任何其他打开的工作簿),那么这仍然有用

 Workbooks("ProAktuellex8600x2.xlsm").Application.Run Macro:=Workbooks("NeuProAktuelleMakros.xlsm").Worksheets("FoodsLookUpTable").FrmProTypeIn(42)

重要的部分是

 Workbooks("NeuProAktuelleMakros.xlsm").Worksheets("FoodsLookUpTable").FrmProTypeIn(42)

_ B)使用Run似乎默认为Application.Run

_C)我们似乎没有像我们一样运行工作簿或工作表,例如,除了应用程序评估之外还有工作表评估。这就解释了为什么...工作簿(“NeuProAktuelleMakros.xlsm”)。Application.Run宏:=工作表(“FoodsLookUpTable”)。FrmProTypeIn(42)......“忽略”工作簿(“NeuProAktuelleMakros.xlsm”)