2010-02-17 49 views
8

Estoy tratando de llamar a una macro de Excel que está en otro libro de trabajo. Es una macro específica de la hoja, pero la sintaxis proporcionada por la documentación e investigación de Microsoft en la web solo brinda una manera de acceder a una macro solo por el libro. Esa es la sintaxis:¿Cómo llamar macro macro específica de una hoja de un libro de Excel en otro?

Application.Run ("testworkbook.xls!macroname") 

Lo que necesito hacer es tener una referencia de hoja de allí también, algo así como:

Application.Run ("testworkbook.xls!Sheet1.macroname") 

He intentado esto y otras muchas variaciones, incluyendo el tener doble o individual cita ahí, pero siempre recibo el mensaje de que no se puede encontrar la macro.

Edit: Con todas las pistas y muchas pruebas encontré la respuesta. Puede acceder a subunidades específicas de la hoja, pero debe usar el nombre canónico como 'Hoja1', no puede usar el nombre de la hoja real. Aparentemente, otros libros de trabajo no tienen acceso a esa información.

Así que el formato anterior funciona, siempre y cuando no se trate de utilizar el sheetname (y puede que tenga que comilla simple el nombre del libro (concatenando CHR(39) a cualquiera de los extremos).

+0

@Lance Roberts: ¿la respuesta a continuación responde a su pregunta? –

+0

@Otaku, sí, aunque terminé simplemente usando el nombre de la hoja canónica. Pero me gusta toda la información que me brindas, así que aceptaré tu respuesta (ya la voté anteriormente). –

+0

es suficiente. No estoy seguro de si el nombre de la hoja canónica es el mismo para las IU que no están en inglés, si es algo con lo que tiene que lidiar, pero es rápido y sencillo para estos fines. apprecaiate the accept/upvote. –

Respuesta

11

Sé que has dado cuenta de esto, probablemente después de mucho pelo-desgarro y café, pero quería:

  • le dará más detalles sobre por qué esto es
  • proporcionarle una forma de podría usar el nombre de su hoja para obtener lo que desea.

En primer lugar, el nombre de la hoja de cálculo que desea no es lo mismo que el nombre del módulo de código. Entonces en su VBE, verá que el nombre del módulo de código es "Hoja1", pero puede tener una propiedad diferente de Name que es diferente, por ejemplo, "MySheet1" (o también puede ser el mismo)

Para obtenerlo por su nombre, tendrá que hacer algunos bucles, cambiar la configuración de seguridad, etc. Si eso es lo que está buscando (esto funciona bien en entornos más pequeños debido a la configuración de seguridad), aquí vas como un ejemplo:

  1. cambiar la configuración de seguridad de confianza acceso programático a VBA Proyectos. En Excel 2007, vaya a Orb | Opciones de Excel | Centro de confianza | Configuración del Centro de confianza | Macro Configuración y luego permitir que la "confianza acceso al modelo de proyecto de VBA"
  2. crear un libro con una hoja de trabajo .Cambie el nombre "MySheet1". Abrir el VBE (Alt + F11) y en "Hoja1 (MySheet1)" crear una rutina sub , lo llaman TimesTen y en el código sólo hay que poner Debug.Print 10 * 10. De esta manera:

    Sub TimesTen() 
        Debug.Print 10 * 10 
    End Sub 
    
  3. guardar el archivo como un documento habilitado para macros y lo llaman "MacroXSLX.xlsm". Déjalo abierto.

  4. Abrir un nuevo documento de Excel, vaya a es VBE y en una nueva macro en cualquier lugar, crear un sub llamada Test. En el cuerpo de ese código, ponga esto: .

    Sub test() 
    Dim SheetName As String 
    SheetName = "MySheet1" 
    Dim wb As Workbook 
    Set wb = Workbooks("MacroXSLX.xlsm") 
    For Each VBComp In wb.VBProject.VBComponents 
        If VBComp.Properties.Item("Name").Value = SheetName Then 
         Application.Run (wb.Name & "!" & VBComp.Name & ".TimesTen") 
        End If 
    Next 
    End Sub 
    
  5. Presione F5 para ejecutar test y usted debe ver en el ventana Inmediato.

Se puede ver en el # 4 que estoy bucle a través de todos los componentes (módulos, clases, etc.) en busca de la que tiene una propiedad Name que tiene un valor de MySheet1. Una vez que tengo eso, puedo obtener el nombre de ese componente, que en este caso es Sheet1 y usarlo para construir mi cadena que ejecutará la macro de la hoja en MacroXSLX.xlsm. El código se puede limpiar aún más para salir de la declaración For cuando haya encontrado lo que desea, etc.

Como se mencionó anteriormente, el único inconveniente real es la configuración de seguridad y garantizar que tenga acceso programático al VBAProject - bien en una a diez computadoras, pero podría ser una molestia si tiene que asegurarse de que más de eso estén siempre configurados correctamente.

+0

+1 para obtener más información, gracias. –

1

puede usted ajustar su macro para aceptar un nombre de hoja como un parámetro? Luego, cuando lo llame dentro de la hoja de su libro original, puede simplemente llamarlo como MiMacro (me.name)? Luego, cuando lo llame desde su otro libro de trabajo, podría simplemente llamarlo como aplicación.run ("testworkbook.xls! MyMacro", "nombre de la hoja") donde "nombre de la hoja" es su parámetro.

No estoy seguro si hay alguna otra manera de hacerlo.

+0

Hay varias hojas con el mismo botón y el mismo evento de clic para ellas (una por hoja). Mi plan si no puedo hacerlo es llamar directamente a la subrutina llamada por estas macros (e insertar el nombre de la hoja como parámetro en eso). Solo esperaba no tener que profundizar para hacer el trabajo. –

+0

Bien después de mirar más de cerca, me di cuenta de que el parámetro en sentido descendente era la hoja en sí, y no se pueden pasar objetos utilizando el método Ejecutar. –

+0

Ver mi edición para la respuesta final. –

1

¿El proyecto VBA tiene protección con contraseña? Además, ¿el submarino es un submarino privado? Si es así, entonces no creo que se encuentre la macro.

+0

La protección con contraseña es UserInterfaceOnly, por lo que no debe bloquear el código. El submarino es público. –

+0

UserInterfaceOnly afecta si el código se ejecuta en una hoja protegida o libro de trabajo. Tener protegida la contraseña del proyecto VBA es diferente. Pero si se trata de un sub Public, esto no debería afectar nada. Los subs privados no se pueden llamar desde otro módulo si el proyecto de VBA está protegido. – guitarthrower

+0

Ver mi edición para la respuesta final. –

Cuestiones relacionadas