Vba 在另一工作簿的工作表类代码模块中运行代码
此代码位于工作簿中。(在工作表类代码模块中) 在同一文件夹中的另一个名为“NeuProAktuelleMakros.xlsm”的工作簿中,我有以下代码(在普通代码模块中): 如果我运行第一个代码,它会运行第二个代码(这告诉我我到了那里,答案是42,我忘记了问题) 我更希望代码FrmProTypeIn()(当前在普通代码模块中)位于工作表代码模块中。工作表名称为“FoodsLookUpTable”。工作表代码名为“Tabelle11” 这可能吗?你能告诉我语法吗 如果这是不可能的,那么简单的解决方法怎么样我能想到的最明显的事情是在工作簿“NeuProAktuelleMakros.xlsm”中的普通模块中有一个调用代码,因此:Vba 在另一工作簿的工作表类代码模块中运行代码,vba,excel,Vba,Excel,此代码位于工作簿中。(在工作表类代码模块中) 在同一文件夹中的另一个名为“NeuProAktuelleMakros.xlsm”的工作簿中,我有以下代码(在普通代码模块中): 如果我运行第一个代码,它会运行第二个代码(这告诉我我到了那里,答案是42,我忘记了问题) 我更希望代码FrmProTypeIn()(当前在普通代码模块中)位于工作表代码模块中。工作表名称为“FoodsLookUpTable”。工作表代码名为“Tabelle11” 这可能吗?你能告诉我语法吗 如果这是不可能的,那么简单的解决方
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
这种变通方法有效。但是也许有一种更简单的方法?语法是:
Let FullPathAndName = "'" & ThisWorkbook.Path & "\" & "NeuProAktuelleMakros.xlsm'"
Application.Run Macro:=FullPathAndName & "!Sheet1.FrmProTypeIn", Arg1:=42
@佩赫
嗨,佩赫
我没有试过。这一点和它的各种变体确实有效。非常感谢。我被告知这是不可能的,因为我被告知不能从另一个工作簿中的工作表代码模块运行代码。
我想知道这是否告诉我,从技术上讲,代码现在已经成为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
再次感谢
艾伦为繁荣做总结:(根据任何更正意见进行编辑)。) 似乎可以从另一个工作簿调用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)接口上意外地公开了它,该接口使对象伪后期绑定类型为Styleo
这也行得通
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)应用程序。运行“StringReferrenceToMacroName”,宏参数1,宏参数2。。。。。
我认为这是在使用应用程序。正确运行方法;我相信这是为了对宏的字符串名称进行字符串引用,以及任何参数。因此,基本语法是
Application.Run Macro:="'NeuProAktuelleMakros.xlsm'!Tabelle11.FrmProTypeIn", Arg1:=42
这里很重要的一点是,不要像我所做的那样,将Tabelle11.FrmProTypeIn这样的代码位与最后一个字符串中的最后一个字符串部分(即宏名称)混淆。例如,可以通过点击Alt+F8列出宏的文字名称来查看宏名称
使用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)
它们只有在工作簿(“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)运行的使用似乎默认为应用程序。运行
_C)我们的工作簿或工作表的运行方式似乎与我们的方式不同,例如,除了应用程序评估之外,还评估了工作表。这解释了为什么…工作簿(“NeuProAktuelleMakros.xlsm”).Application.Run宏:=工作表(“FoodsLookUpTable”).FrmProTypeIn(42)。。。是否“忽略”工作簿(“NeuProAktuelleMakros.xlsm”)您是否尝试过
工作簿(“NeuProAktuelleMakros.xlsm”).Application.Run宏:=工作表(“FoodsLookUpTable”).FrmProTypeIn(MyArg)
?我没有,但我只是这么做了。效果很好。谢谢Alan@Rory嗨,佩赫,我注意到,在试验时,您的解决方案只有在包含被调用代码的工作簿处于打开状态时才有效。因此,如果宏:=参数….中未指定工作簿,则表明Application.Run正在处理活动工作簿。。。在申请之前有工作手册(“NeuProAktuelleMakros.xlsm”)似乎没有效果。但再次感谢你。您的解决方案和其他人以及进一步的评论回复帮助我理解了这一点。我正在写一份摘要解决方案。AlanEDIT:我的意思是:…..“…只有当调用代码的工作簿是活动工作簿时,您的解决方案才有效…”(而且只有在调用代码的工作簿打开时,它才有效..但请在我的摘要回答中进一步解释)@roryahh-太棒了,谢谢,这正是我要接近和寻找的。:);)让FullPathAndName=“”&ThisWorkbook.Path&“\”&“NeuProAktuelleMakros.xlsm”应用程序运行宏:=FullPathAndName&“!Tabelle11.FrmProTypeIn”,Arg1:=42谢谢
Workbooks("ProAktuellex8600x2.xlsm").Application.Run Macro:=Workbooks("NeuProAktuelleMakros.xlsm").Worksheets("FoodsLookUpTable").FrmProTypeIn(42)
Workbooks("NeuProAktuelleMakros.xlsm").Worksheets("FoodsLookUpTable").FrmProTypeIn(42)