【问题标题】:"Clicking" Command Button from other workbook从其他工作簿“单击”命令按钮
【发布时间】:2019-05-30 14:02:20
【问题描述】:

我正在尝试编写一个可以“单击”另一个工作簿中的命令按钮的宏。那可能吗?不更改其他工作簿中的任何代码?

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    对于另一个工作簿中的 ActiveX 按钮:

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

    对于另一个工作簿中的 MSForms 按钮:

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

    【讨论】:

    • @Davesexcel,感谢您指出这一点。我将这个问题误读为“如何自动单击用户表单上的按钮”。无论如何,我更新了我的答案以适应这个问题。
    【解决方案2】:

    您可以为此使用Application.Run

    Run "OtherWorkbook.xls!MyOtherMacro"
    

    【讨论】:

    • 问题是如何点击不同工作簿中的命令按钮
    【解决方案3】:

    可以直接从您的代码运行链接到该按钮的宏,而不是尝试以编程方式单击该按钮。

    首先,您需要找到单击按钮时运行的宏的名称。

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

    右击命令按钮并选择'Assign macro'

    将显示'分配宏'对话框。

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

    点击确定按钮。

    你在工作簿中需要调用代码的代码应该如下。

    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
    

    【讨论】:

      【解决方案4】:

      您确定您的意思是工作簿而不是工作表? 无论如何,如果你“want to loop through all workbooks in a folder and perform an operation on each of them

      如果你想访问另一个工作表,可以这样完成:

      Worksheets("MySheet").YourMethod()
      

      【讨论】:

        【解决方案5】:

        我遇到了与上述类似的问题,花了一段时间才弄明白,但这就是我所要做的。

        在 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. 在您拥有Private Sub xyz_Click() 的工作表ABC 中,添加一个新的公共子例程:

            Public Sub ForceClickOnBouttonXYZ()
                Call xyz_Click
            End Sub
            
          2. 在您的其他工作表或模块中,添加代码:

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

          就是这样!!! 如果您不希望屏幕闪烁或显示任何活动,请在调用Sheets("ABC").ForceClickOnBouttonXYZ 例程之前设置Application.ScreenUpdating = False,然后在它之后设置Application.ScreenUpdating = True

          【讨论】:

          • 这正是 Elennor 不想做的事
          【解决方案7】:

          没有一种干净的方法可以通过代码执行此操作,因为按钮的单击事件通常是其他工作簿的私有方法。

          然而,您可以通过打开工作簿,找到所需的控件,然后激活它并向其发送一个空格字符(相当于按下按钮)来自动单击 VBA 代码。

          这几乎可以肯定是一个可怕的想法,它可能只会给你和你的后代带来痛苦。我敦促您找到更好的解决方案,但与此同时,这似乎可行...

          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
          

          【讨论】:

          • 我相信这正是这样做的,除非我错过了什么“点击”有一些微妙的区别
          • 我知道你现在在做什么,你会在哪里输入 controlName 的变量?
          • 调用方法时,例如:RunButton("MyWorkbook", "ImportantWorksheet","ctlButtonToClick")
          猜你喜欢
          • 2012-06-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-01
          • 2015-03-28
          • 2020-10-19
          • 2016-01-28
          • 1970-01-01
          相关资源
          最近更新 更多