2008-09-24 5 views

Répondre

1

Vous pouvez utiliser Application.Run pour que:

Run "OtherWorkbook.xls!MyOtherMacro" 
+0

La question est de savoir comment cliquer sur un bouton de commande à partir d'un autre classeur – Davesexcel

-1

Il n'y a pas une manière propre de le faire à travers le code, étant donné que l'événement click sur le bouton serait typiquement une méthode privée de l'autre classeur.

Toutefois, vous pouvez automatiser le code de clic VBA en ouvrant le classeur, en trouvant le contrôle que vous voulez, puis en l'activant et en lui envoyant un caractère espace (équivalent à appuyer sur le bouton).

C'est certainement une idée terrible, et cela ne vous apportera probablement que de la misère. Je vous conseille vivement de trouver une meilleure solution, mais en attendant, cela semble fonctionner ...

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 
+1

je crois que ce fait exactement cela, à moins qu'il y ait une distinction subtile sur ce qu'est un "clic" qui me manque – msulis

+0

Je vois ce que vous faites maintenant, où entreriez-vous la variable pour 'controlName'? – Davesexcel

+0

lorsque vous appelez la méthode, par exemple: RunButton ("MyWorkbook", "ImportantWorksheet", "ctlButtonToClick") – msulis

1

Au lieu d'essayer de cliquer sur le bouton programatically, il est possible d'exécuter la macro liée au bouton directement à partir de votre code.

Vous devez d'abord trouver le nom de la macro qui est exécutée lorsque le bouton est cliqué.

Pour ce faire, ouvrez le classeur qui contient le bouton de commande.

Faites un clic droit sur le bouton de commande et sélectionnez « Affecter une macro »

Le « Affecter une macro » dialogue s'affiche.

Notez le nom complet dans la zone 'Nom de macro' en haut de la boîte de dialogue.

Cliquez sur le bouton OK .

Votre code dans le classeur qui doit appeler le code doit être comme suit.

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 
0

NOPE:

Ceci est facile à faire:

  1. Dans la feuille de calcul ABC où vous avez la Private Sub xyz_Click(), ajouter un nouveau sous-programme public:

    Public Sub ForceClickOnBouttonXYZ() Call xyz_Click End Sub

  2. Dans votre autre feuille de calcul ou module, ajoutez le code:

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

EST !!! QUE Si vous ne voulez pas que l'écran scintille ou affiche une activité, définissez Application.ScreenUpdating = False avant d'appeler la routine Sheets ("ABC") ForceClickOnBouttonXYZ, puis définissez Application.ScreenUpdating = True juste après.

0

J'ai eu un problème similaire à celui ci-dessus et il a fallu du temps pour le comprendre mais c'est tout ce que j'avais à faire.

Sur Sheet1 j'ai créé un bouton qui suit:

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 

le bit d'importation pour l'obtenir pour vous travailler besoin d'aller au code sur les autres feuilles de calcul et changer du privé au public.

Jusqu'à présent, aucun bug n'est apparu.

3

Pour un bouton ActiveX dans un autre classeur:

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

Pour un bouton MSForms dans un autre classeur:

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

@Davesexcel, merci de le signaler. J'ai mal lu la question comme "comment automatiser un clic de bouton sur un userform." Quoi qu'il en soit, j'ai mis à jour ma réponse pour répondre à la question. –

+1

Oui, ça marche. – Davesexcel

Questions connexes