我正在尝试编写一个可以“单击”另一个工作簿中的命令按钮的宏。那可能吗?不改变其他工作簿中的任何代码?
答案 0 :(得分:4)
对于另一个工作簿中的ActiveX按钮:
Workbooks("OtherBook").Worksheets("Sheet1").CommandButton1.Value = True
对于另一个工作簿中的MSForms按钮:
Application.Run Workbooks("OtherBook").Worksheets("Sheet1").Shapes("Button 1").OnAction
答案 1 :(得分:1)
您可以使用Application.Run
:
Run "OtherWorkbook.xls!MyOtherMacro"
答案 2 :(得分:1)
不是试图以编程方式单击按钮,而是可以直接从代码中运行链接到按钮的宏。
首先,您需要找到单击按钮时运行的宏的名称。
为此,请打开包含命令按钮的工作簿。
右键单击命令按钮并选择'指定宏'
将显示'分配宏'对话框。
在对话框顶部的'宏名称'框中记下全名。
点击确定按钮。
您需要调用代码的工作簿中的代码应如下所示。
Sub Run_Macro()
Workbooks.Open Filename:="C:\Book1.xls"
'Open the workbook containing the command button
'Change the path and filename as required
Application.Run "Book1.xls!Macro1"
'Run the macro
'Change the filename and macro name as required
'If the macro is attached to a worksheet rather than a module, the code would be
'Application.Run "Book1.xls!Sheet1.Macro1"
End Sub
答案 3 :(得分:0)
你确定你的意思是工作簿而不是工作表? 无论如何,如果你“want to loop through all workbooks in a folder and perform an operation on each of them”
如果你想访问另一张表,就这样做了:
Worksheets("MySheet").YourMethod()
答案 4 :(得分:0)
NOPE:
这很容易做到:
在您拥有Private Sub xyz_Click()
的工作表ABC中,添加一个新的公共子例程:
Public Sub ForceClickOnBouttonXYZ()
Call xyz_Click
End Sub
在您的其他工作表或模块中,添加代码:
Sheets("ABC").Activate
Call Sheets("ABC").ForceClickOnBouttonXYZ
Application.ScreenUpdating = False
例程之前设置Sheets("ABC").ForceClickOnBouttonXYZ
,然后在其后面设置Application.ScreenUpdating = True
。
答案 5 :(得分:0)
我遇到了类似的问题,需要一段时间才弄明白,但这就是我必须要做的事情。
在Sheet1上,我创建了一个包含以下内容的按钮:
Private Sub cmdRefreshAll_Click()
Dim SheetName As String
SheetName = "Mon"
Worksheets(SheetName).Activate
ActiveSheet.cmdRefresh_Click
SheetName = "Tue"
Worksheets(SheetName).Activate
ActiveSheet.cmdRefresh_Click
' "I repeated the above code to loop through a worksheet for every day of the week"
End Sub
然后导入位使其工作,您需要转到其他工作表上的代码,并将其从Private更改为Public。
到目前为止,没有出现任何错误。
答案 6 :(得分:-1)
通过代码没有一种干净的方法,因为按钮的click事件通常是其他工作簿的私有方法。
然而,您可以通过打开工作簿,找到所需的控件,然后激活它并向其发送空格字符(相当于按下按钮)来自动点击VBA代码。 / p>
这几乎肯定是一个可怕的想法,它可能会给你和你的后代带来痛苦。我敦促你找到一个更好的解决方案,但与此同时,这似乎有效......
Public Sub RunButton(workbookName As String, worksheetName As String, controlName As String)
Dim wkb As Workbook
Dim wks As Worksheet
Set wkb = Workbooks.Open(workbookName)
wkb.Activate
Dim obj As OLEObject
For Each wks In wkb.Worksheets
If wks.Name = worksheetName Then
wks.Activate
For Each obj In wks.OLEObjects
If (obj.Name = controlName) Then
obj.Activate
SendKeys (" ")
End If
Next obj
End If
Next wks
End Sub