Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Excel工作表上的按钮在加载项中运行宏_Excel_Vba - Fatal编程技术网

从Excel工作表上的按钮在加载项中运行宏

从Excel工作表上的按钮在加载项中运行宏,excel,vba,Excel,Vba,我想从excel工作表上的按钮运行加载项中定义的宏。我试图在右键单击按钮时出现的“分配宏”对话框中输入宏的名称(我不知道该对话框的确切英文标题,因为我正在使用德语Excel版本),格式如下 AddInName!宏名称和 “AddInName”!宏名称。 在这两种情况下,当我重新打开对话框时,加载项的名称会自动删除。 格式“'AddInName'!MacroName”被拒绝,因为“公式太复杂” 在我正在开发AddIn的机器上,这是可行的,但是在另一台机器上,如果AddIn运行没有问题,那么这个特定

我想从excel工作表上的按钮运行加载项中定义的宏。我试图在右键单击按钮时出现的“分配宏”对话框中输入宏的名称(我不知道该对话框的确切英文标题,因为我正在使用德语Excel版本),格式如下
AddInName!宏名称
“AddInName”!宏名称
。 在这两种情况下,当我重新打开对话框时,加载项的名称会自动删除。 格式
“'AddInName'!MacroName”
被拒绝,因为“公式太复杂”

在我正在开发AddIn的机器上,这是可行的,但是在另一台机器上,如果AddIn运行没有问题,那么这个特定的功能就不起作用了


是否有一种方法可以访问可能位于不同机器上不同位置的加载项内的宏(C:/user/“user\u name”../AddIns)?

说来话长,非常[Long]:可能

您必须计算出两台计算机之间的文件共享和权限,但您可以在共享网络驱动器上使用加载项,因此这是完全可能的

我要提醒大家,不要在计算机之间同时使用同一个加载项。制作拷贝会更容易、更安全、更稳定

创建字符串的方法是正确的,但不要将其添加到宏选择框中,而是将其添加到工作表代码模块中按钮的
OnAction
属性中

我是从记忆中走出来的,所以我可能弄错了,但我很确定你的字符串会像这样构建

"'[addin.xlam]!project.module.macro'"     \edit: tested and confirmed not to work
注意,这里有记号,它是一个外部的“双引号”,封装了一个内部的“单引号”

您还可以使用适当构建的字符串将参数传递给宏,使用变量或整数时相对容易,但开始使用字符串文字时就变得棘手

刚刚完成我的文章,阅读以下内容:


@Peh:这可能行得通,但excel工作表必须是我想要避免的xlsm文件。-chrmue 9分钟前

显然,这排除了我的整个解决方案


我花了几个小时在这上面,我所做的就是绕圈子

我的代码中的注释似乎是错误的,虽然我在工作代码中传递了所有参数,但我只是在同一个工作簿中这样做,并且每次尝试通过
OnAction
甚至
应用程序将它们发送到另一个工作簿时都失败了。运行

这可能是一件愚蠢的差事,但我相信这是有可能的,但我还是放弃了


我在工作表上有一个按钮:

Shapes.Add xlButtonControl
它通过一个过程传递两个参数:

OnAction = "'passthroughme ""passing"", ""through"" '"
但到目前为止,这还只是个问题。无法成功访问外部工作簿,同时也包含参数

我还提供了一些现有代码的示例,这些代码运行良好,但我还没有找到任何可以将参数传递给外部工作簿的代码:

Select Case Application.Run(testingFunction)

Application.Run procToCall, procArgs

testResult = Application.Run(testingFunction, testingArgs)

Application.Run "extractPDF." & loPDFvendors.ListColums(gTCN_PDFMAP_PROCLIST).DataBodyRange(mSupplierIndex), ws

还没有放弃,但我现在失败了

您需要一个Excel文件中按钮的程序。此过程无法在外接程序中运行宏。请参阅链接的答案(在您的问题上方)。@Peh:这可能行得通,但excel工作表必须是我想要避免的xlsm文件。我还以为您在寻找语法的替代品,即
“your_addin.xlsm”!某些_宏
调用另一个文件中的宏。请确保加载了加载项,因为如果加载项已卸载,则无法在加载项中运行宏。加载项已加载到另一台计算机上,否则它将无法工作(上述问题除外)。如果无法从*xlsx文件调用外接程序中的宏,我会接受。但至少在我的机器上,似乎有一种神秘的方式让它工作。这就是为什么我认为它也可以在其他机器上工作。我看不出为什么它不可能。两台计算机上的外接程序名称必须相同。要链接按钮,您只能使用外接程序文件名(而不是完整路径)。它应该能工作(就像在你的机器上一样)。•如果你点击按钮会发生什么?它会抛出错误吗如果没有错误,请确保您调用的宏不是问题所在。用一个只显示消息框而不执行其他操作的简单宏来测试它。您应该检查语法,我很确定它应该是
“'addin.xlam'!project.module.macro”
,因此加载项名称包含在
中,而不是总字符串中,并且需要删除
[]
(可能是把它和公式混在一起了,文件名后面跟着一个工作表名,比如
='[file.xlsm]Sheet1'!A1
)@Pᴇʜ这很有趣,因为我在写这篇文章时怀疑自己的记忆力。但当我回到电脑时,我花了一些时间刷新我的记忆力。我查阅了一个月前的一个项目,发现我的代码中有注释,确认成功的测试用例,如我在帖子中建议的那样,有括号,没有括号,如果没有,则没有成功的测试大小写。是的,这与宏窗口不同-但区别在于我传递参数。我将更新答案以反映这一点。事实上,你让我怀疑,我做了一个快速测试:从头开始打开了2个文件。在
file1.xlsm
中的第1页添加了一个按钮,并添加了一个带有
按钮(1)的子项。OnAction=“'file2.xlsm'!test”
。并将
Public Sub test()
添加到
file2.xlsm
的一个模块中,抛出一个消息框。确实如此。•如果我改为使用您的语法,我在尝试设置按钮的
.OnAction
时会立即出现运行时错误1004。在Office Pro 2019最新版本上测试。@Pᴇʜheh,我们的想法是一样的。我也一直在测试。如果使用我的语法并包含一个参数(该参数用两个双引号括起来),您将不会得到该错误,但您必须删除感叹号
.OnAction=“””[File2.xlsm]VBAProject.Module1.test”