«Нажатие» командной кнопки из другой книги - PullRequest
1 голос
/ 25 сентября 2008

Я пытаюсь написать макрос, который бы «щелкал» по кнопке команды в другой книге. Это возможно? Без изменения какого-либо кода в этой другой книге?

Ответы [ 7 ]

4 голосов
/ 26 октября 2015

Для кнопки ActiveX в другой книге:

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

Для кнопки MSForms в другой книге:

Application.Run Workbooks("OtherBook").Worksheets("Sheet1").Shapes("Button 1").OnAction
1 голос
/ 25 сентября 2008

Вместо того, чтобы пытаться программно нажимать кнопку, можно запустить макрос, связанный с кнопкой, прямо из вашего кода.

Сначала необходимо найти имя макроса, который запускается при нажатии кнопки.

Для этого откройте рабочую книгу, содержащую кнопку команды.

Щелкните правой кнопкой мыши по командной кнопке и выберите «Назначить макрос»

Появится диалоговое окно «Назначить макрос» .

Запишите полное имя в поле 'Имя макроса' в верхней части диалогового окна.

Нажмите на кнопку OK .

Ваш код в рабочей книге, который должен вызывать код, должен быть следующим:

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
1 голос
/ 25 сентября 2008

Вы можете использовать Application.Run для этого:

Run "OtherWorkbook.xls!MyOtherMacro"
0 голосов
/ 01 октября 2015

У меня была та же проблема, что и выше, и потребовалось время, чтобы понять, но это все, что мне нужно было сделать.

На Листе 1 я создал кнопку со следующим:

    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.

Пока что никаких ошибок не появилось.

0 голосов
/ 14 апреля 2010

NOPE:

Это легко сделать:

  1. В листе ABC, где у вас есть Private Sub xyz_Click(), добавьте новую общедоступную подпрограмму:

    Public Sub ForceClickOnBouttonXYZ()
        Call xyz_Click
    End Sub
    
  2. В другой лист или модуль добавьте код:

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

ЭТО ЭТО !!! Если вы не хотите, чтобы экран мерцал или отображал какую-либо активность, установите Application.ScreenUpdating = False перед вызовом процедуры Sheets("ABC").ForceClickOnBouttonXYZ, а затем установите Application.ScreenUpdating = True сразу после нее.

0 голосов
/ 25 сентября 2008

Нет чистого способа сделать это с помощью кода, поскольку событие нажатия кнопки обычно является закрытым методом другой рабочей книги.

Однако , вы можете автоматизировать переход по коду 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
0 голосов
/ 25 сентября 2008

Вы уверены, что имеете в виду книгу, а не лист? В любом случае, если вы « хотите просмотреть все рабочие книги в папке и выполнить операции с каждой из них »

Если вы хотите получить доступ к другому листу, это делается так:

Worksheets("MySheet").YourMethod()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...