从其他工作簿中单击“命令button”

我正在尝试编写一个可以“单击”另一个工作簿中的命令button的macros。这样做有可能吗? 不改变其他工作簿中的任何代码?
非常感谢!

对于另一个工作簿中的ActiveXbutton:

Workbooks("OtherBook").Worksheets("Sheet1").CommandButton1.Value = True 

对于另一个工作簿中的一个MSFormsbutton:

 Application.Run Workbooks("OtherBook").Worksheets("Sheet1").Shapes("Button 1").OnAction 

您可以使用Application.Run为:

 Run "OtherWorkbook.xls!MyOtherMacro" 

而不是试图以编程方式点击button,可以直接从您的代码运行链接到button的macros。

首先,您需要find单击button时运行的macros的名称。

为此,请打开包含命令button的工作簿。

右键单击命令button并select“分配macros”

将显示“分配macros”对话框。

记下对话框顶部“macros名称”框中的全名。

点击OKbutton。

您需要调用代码的工作簿中的代码应如下所示。

 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 

你确定你的意思是工作簿,而不是工作表? 无论如何,如果你“ 想循环通过一个文件夹中的所有工作簿,并对其中的每一个执行操作 ”

如果你想访问另一个工作表,它是这样做的:

 Worksheets("MySheet").YourMethod() 

我有一个类似的问题,上面花了一段时间弄清楚,但这是我所要做的。

在Sheet1上,我创build了一个button,如下所示:

  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 

然后导入位使其工作,你需要去其他工作表上的代码,并将其从私人更改为公共。

到目前为止,没有错误出现。

不:

这很容易做到:

  1. 在您有Private Sub xyz_Click()的工作表ABC中添加一个新的公共子程序:

    Public Sub ForceClickOnBouttonXYZ() Call xyz_Click End Sub

  2. 在其他工作表或模块中添加代码:

     Sheets("ABC").Activate Call Sheets("ABC").ForceClickOnBouttonXYZ 

这就对了!!! 如果您不希望屏幕闪烁或显示任何活动,请在调用表格(“ABC”),ForceClickOnBouttonXYZ例程之前设置Application.ScreenUpdating = False,然后在其之后设置Application.ScreenUpdating = True。

有没有一个干净的方式通过代码来做到这一点,因为button的点击事件通常是其他工作簿的私有方法。

但是 ,您可以通过打开工作簿,find您想要的控件,然后激活它并发送一个空格字符(相当于按下button)来自动执行VBA代码的点击操作。

这几乎肯定是一个可怕的想法,它可能会给你和你的后代带来任何不幸。 我会敦促你find一个更好的解决scheme,但在此期间,这似乎工作…

 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