otra - botones en excel sin macros
"Hacer clic" en el botón de comando de otro libro de trabajo (7)
¿Seguro que te refieres al libro de trabajo y no a la hoja? De todas formas, si desea " recorrer todos los libros de trabajo en una carpeta y realizar una operación en cada uno de ellos "
Si quieres acceder a otra hoja, hazlo así:
Worksheets("MySheet").YourMethod()
Intento escribir una macro que haga "clic" en un botón de comando que está en otro libro de trabajo ... ¿Sería posible? ¿Sin cambiar nada del código dentro de ese otro libro de trabajo?
¡Muchas gracias!
En lugar de intentar hacer clic programáticamente en el botón, es posible ejecutar la macro vinculada al botón directamente desde su código.
Primero necesita encontrar el nombre de la macro que se ejecuta cuando se hace clic en el botón.
Para hacer esto, abra el libro de trabajo que contiene el botón de comando.
Haga clic derecho en el botón de comando y seleccione ''Asignar macro''
Se mostrará el cuadro de diálogo "Asignar macro" .
Anote el nombre completo en el cuadro "Nombre de macro" en la parte superior del cuadro de diálogo.
Haga clic en el botón Aceptar .
Su código en el libro de trabajo que necesita llamar al código debe ser el siguiente.
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
No hay una forma clara de hacerlo a través del código, ya que el evento de clic del botón normalmente sería un método privado del otro libro de trabajo.
Sin embargo , puede automatizar el clic a través del código VBA abriendo el libro, encontrando el control que desea, y luego activándolo y enviándole un carácter de espacio (equivalente a presionar el botón).
Es casi seguro que es una idea terrible, y probablemente le traerá a usted y a sus hijos nada más que miseria. Te insto a que encuentres una solución mejor, pero mientras tanto, parece que funciona ...
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
Puede usar Application.Run
para eso:
Run "OtherWorkbook.xls!MyOtherMacro"
Para un botón ActiveX en otro libro de trabajo:
Workbooks("OtherBook").Worksheets("Sheet1").CommandButton1.Value = True
Para un botón MSForms en otro libro de trabajo:
Application.Run Workbooks("OtherBook").Worksheets("Sheet1").Shapes("Button 1").OnAction
Tuve un problema similar al anterior y me tomó un tiempo averiguarlo, pero esto es todo lo que tenía que hacer.
En Sheet1 creé un botón con lo siguiente:
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
Luego, el bit de importación para que funcione, debe ir al código en las otras hojas de cálculo y cambiarlo de Privado a Público.
Hasta ahora no han aparecido errores.
NOPE:
Esto es fácil de hacer:
En la hoja de trabajo ABC donde tiene Private Sub xyz_Click (), agregue una nueva subrutina pública:
Public Sub ForceClickOnBouttonXYZ() Call xyz_Click End Sub
En su otra hoja de trabajo o módulo, agregue el código:
Sheets("ABC").Activate Call Sheets("ABC").ForceClickOnBouttonXYZ
¡¡¡ESO ES!!! Si no desea que la pantalla parpadee o muestre actividad alguna, configure Application.ScreenUpdating = False antes de llamar a Sheets ("ABC"). Forzar sesión en la rutina de XYZ y luego configure Application.ScreenUpdating = True justo después.