Macro funciona bien desde botón de comando, al ejecutarla desde macro personal no funciona.

Estimados sabios del grupo, tengo este código que me copia un rango de este libro a otro llamado "CONSOLIDADO",

Private Sub CommandButton1_Click()
Application.EnableCancelKey = xlDisabled
'Definir objetos a utilizar
Dim wbDestino As Workbook, _
wsOrigen As Excel.Worksheet, _
wsDestino As Excel.Worksheet, _
rngOrigen As Excel.Range, _
rngDestino As Excel.Range
'Indicar el libro de Excel destino
Set wbDestino = Workbooks.Open(ActiveWorkbook.Path & "\CONSOLIDADO.xlsx")

'Activar este libro
ThisWorkbook.Activate

'Indicar las hojas de origen y destino
Set wsOrigen = Hoja1 'Worksheets("AGOSTO")
Set wsDestino = wbDestino.Worksheets("BASE")

'Indicar la celda de origen y destino
Const celdaOrigen = "N14"
Const celdaDestino = "A1"

'Inicializar los rangos de origen y destino
Set rngOrigen = wsOrigen.Range(celdaOrigen)
Set rngDestino = wsDestino.Range(celdaDestino)

'Seleccionar rango de celdas origen
rngOrigen.Select
Range(Selection, Selection.End(xlDown)).Select
Range(Selection, Selection.End(xlToRight)).Select
Selection.Copy

'Pegar datos en celda destino
rngDestino.PasteSpecial xlPasteValues
Application.CutCopyMode = False

'Guardar y cerrar el libro de Excel destino
wbDestino.Save
wbDestino.Close
End Sub

Lo que quiero es ejecutar esta macro desde otros libros con el mismo formato, lo he intentado guardándolo en mis macros personales pero no funciona.

Los libros tienen todos la misma estructura, solo cambia el mes y se van guardando en el libro "CONSOLIDADO".

Respuesta
1

[Hola

No has mencionado cómo intentas "correr" la macro cuando está en el libro "Personal.xlsb". Segundo, rápidamente veo una línea que dice "ThisWorkbook.Activate", Thisworkbook hace referencia al libro en donde está la macro activada, o sea, el libro "Personal", por si acaso.

Abraham Valencia

Gracias abraham... te explico un poco.. tengo varios libros que son iguales de echo son copias que hago mes a mes, desde enero a diciembre. Lo que necesito es copiar la información de cada libro a uno llamado "CONSOLIDADO"... la macro la puse en uno de estos libros para probarla mediante un botón de comando y funciona muy bien... pero cuando la ejecuto desde mi macros personales no corre... espero me puedas entender desde ya muchas gracias.

No mencionaste como intentas usar la macro del libro "Personal" pero, al ser un libro, debes hacerlo así:

Application.Run "Personal.xlsb!Nombredelamacro"

o

Application. Run ("Personal.xlsb!Nombredelamacro")

Abraham Valencia

La macro la tengo en la cinta de opciones desde ahí quiero ejecutarla para cada libro..

Abraham... ya la tengo en la cinta de opciones...además el enlace no funciona

El enlace funciona, el lugar en donde estás debe tener algunos IP, dominio o palabras de dominio bloqueadas.

En él justamente explicaban como asignar una macro al botón que mencionas que ya tienes en tu Cinta de Opciones.

Bueno, asumo que creaste una pestaña, en ella un grupo; previo a eso se supone que en el libro "Personal.xlsb", en un módulo estándar también se supone que ya está tu macro con algún nombre.

Ahora vas a "Archivo", "Opciones", "Personalizar cinta de opciones", en "Comandos disponibles en:" elige "Macros" y en la lista busca una que se llame así: "Personal.xlsb!elnombrequeledistealamacro", elígela, verifica que en la lista "Pestañas principales" esté elegida, a su vez, la pestaña y grupo que se supone has creado previamente, pulsa el botón "Agregar" y luego el botón "Aceptar" y listo, en ese botón ya está la macro de tu libro Personal para todos tus archivos.

Abraham Valencia

gracias de nuevo abraham, pero eso ya lo tengo echo...

Pues si ya lo tienes hecho, tal cual, pues ya debería funcionar. Simplemente no pasa nada ¿o da algún mensaje de error? ¿Cambiaste la línea en donde pusiste "ThisWorkbook" que te mencione en mi primer mensaje?

Abraham Valencia

abraham me manda error: "espacio de fila insuficiente"...

Así lo hice:

Sub carga()
Application.Run "PERSONAL.XLSB!carga"
Application.EnableCancelKey = xlDisabled
'Definir objetos a utilizar
Dim wbDestino As Workbook, _
wsOrigen As Excel.Worksheet, _
wsDestino As Excel.Worksheet, _
rngOrigen As Excel.Range, _
rngDestino As Excel.Range
'Indicar el libro de Excel destino
Set wbDestino = Workbooks.Open(ActiveWorkbook.Path & "\CONSOLIDADO.xlsx")

'Activar este libro
ThisWorkbook.Activate

'Indicar las hojas de origen y destino
Set wsOrigen = Hoja1 'Worksheets("AGOSTO")
Set wsDestino = wbDestino.Worksheets("BASE")

'Indicar la celda de origen y destino
Const celdaOrigen = "N14"
Const celdaDestino = "A1"

'Inicializar los rangos de origen y destino
Set rngOrigen = wsOrigen.Range(celdaOrigen)
Set rngDestino = wsDestino.Range(celdaDestino)

'Seleccionar rango de celdas origen
rngOrigen.Select
Range(Selection, Selection.End(xlDown)).Select
Range(Selection, Selection.End(xlToRight)).Select
Selection.Copy

'Pegar datos en celda destino
rngDestino.PasteSpecial xlPasteValues
Application.CutCopyMode = False

'Guardar y cerrar el libro de Excel destino
wbDestino.Save
wbDestino.Close
End Sub

Si es macro está en un módulo estándar del libro Personal.xlsb, no debería haber mayo problema al ser asignada al botón de tu Cinta de Opciones pero, quita sí o sí esta línea:

Application.Run "PERSONAL.XLSB!carga"

Una vez borrada, actívala y comenta (quizá dé un error pero prueba)

Abraham Valencia

Abraham saque esa línea de código, ahora sale otro error que no me había dalido antes "recursos insuficientes. seleccione menos datos o cierre otras aplicaciones" y se detiene en la línea:

rngDestino.PasteSpecial xlPasteValues

En esta línea:

Set wsOrigen = Hoja1 'Worksheets("AGOSTO")

Haces referencia al módulo de una hoja llamado "Hoja1", lo que no necesariamente coincidirá con todos los libros en donde actives la macro. Sugiero cambiarlo por le nombre de la hoja de ser igual en todos los libros. Quizá sí se llaman "Agosto" como la parte comentada (con apostrofe) que tienes en esa misma línea.

Abraham Valencia

ok...entiendo pero como te comentaba son libros con los meses del año...cada libro tiene una hoja correspondiente al mes, por eso lo asigne como "hoja1"

¿Se asume que cuando se activa la macro el usuario está en la hoja que se debe "exportar"? De ser así, se supone entonces que es la hoja activa por ende vale esto:

Set wsOrigen = Activesheet

De no ser la hoja activa y además varía la hoja, debes elegirla de algún modo, lo que significa programar mucho más

Abraham Valencia

ok..abraham gracias otra vez...probare y te comento

Abraham, no corre la macro se cae en la misma línea... alguna forma distinta de hacerlo... necesito consolidar todos los libros desde enero a diceimbre en un solo libro llamado consolidado.. estos libros tienen rango con nombre y es ese rango el que me interesa no lo hoja completa..

Lo que pasa es que debes dar el valor de esa variable antes de abrir el libro "consolidado" porque de lo contrario toma la hoja activa como una del libro abierto, o en todo caso señalar con exactitud el libro y hoja:

 Set wsOrigen = Activeworkbook.Activesheet

No olvides algunas cosas: La macro que es útil en un libro,. No necesariamente lo será en otro; la lógica de la programación nos dice que lo aplicado a un objeto, debe ser revisado/cambiado para usarlo en otro objeto (Un libro es un objeto, otro libro es otro objeto, etc.); solo tú conoces al detalle lo que tienes y sabes (tienes en la cabeza) lo que deseas, al no saber todos los detalles, desde este lado de la pantalla es a veces complacido ayudar mejor (ahora mencionas rangos con nombre pero tampoco dices si es en todos los libros y con el mismo nombre y ubicación para cada rango, etc.)

Por cierto, mira:

Enlace

Abraham Valencia

Completamente de acuerdo abraham lo que dices en el enlace... yo lo tengo claro de hecho así hago mis bases de datos... pero estos libros que te meciono no fueron creados por mi.. Yo trabajo en una área de producción y el encargado de llevar estas planillas poco sabe de excel menos de bases de datos es por eso que quiero automatizar esta información para poder hacer búsquedas, estadísticas ya sabes todo lo que se pueda hacer, pero necesito que esa información solo quede en un libro "CONSOLIDADO", la macro que tengo funciona bien desde un botón de comando, pero tendría que agregar un botón por cada libro que se va generando, por eso quería hacer solo una macro y ejecutarla desde la cinta de opciones como macro personal... ahora si hay otra forma de hacerlo te lo agradecería... desde ya muchas gracias por tu tiempo y tus conocimientos..

¿De cuántos libros quieres extraer la información? ¿Están en la misma carpeta? ¿Tienen nombres similares? ¿Cuántas hojas tiene cada uno? ¿De cuántas de esas hojas quieres extraer la información? ¿Los nombres de esas hojas, son similares entre los libros? Los rangos nombrados ¿cuántos son por libro, por hoja? Los nombres de los rangos ¿se repiten (mismo rango, misma hoja?)? etc.

Todo eso hay que saber para realmente ayudarte a buscar una solución

Abraham Valencia

Gracias otra vez abraham... mira los libros se llaman así "CONTROL DE PLANCHAS" seguido del mes ej: "CONTROL DE PLANCHAS ENERO", "CONTROL DE PLANCHAS FEBRERO" y así sucesivamente y a su vez cada libro tiene una hoja (hoja1), que lleva el nombre del mes, por ende el año pasado fueron 12 libros, cada libro contiene un rango llamado "BASE" que encuentra en la Hoja1, y están todos en la misma carpeta incluyendo el CONSOLIDADO... cuando empecé con esto trate de hacerlo con access así que cualquier idea que se te ocurra sera bienvenida...

Saludos desde chile

[Hola

Te dejo una propuesta con varios supuestos:

- Todos los archivos con datos tienen una sola hoja

- Todos los archivos con datos están en la misma carpeta

- Todos los archivos tienen el rango de nombre "Base" que es en donde están los datos que se necesita copiar

- El libro "Consolidado" está en la misma carpeta que los archivos de los cuales hay que extraer los datos

- El libro "Consolidado" tiene una hoja llamada "Base" que es en donde se colocarán todos los datos

- En dicha hoja "Base" los datos comienzan en la columna A y en dicha columna ya hay al menos un encabezado

Entonces, esto funcionará:

Sub Consolidar()
Dim fso As Object, folder As Object
Dim UltimaFila As Long
Dim wbkdatos As Workbook, wbkdestino As Workbook
Application.ScreenUpdating = False
Set wbkdestino = ActiveWorkbook
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder(ThisWorkbook.Path)
For Each file In folder.Files
    If file.Name <> ActiveWorkbook.Name And Left(file.Name, 2) <> "~$" Then
        Set wbkdatos = Workbooks.Open(file)
        Let UltimaFila = wbkdestino.Worksheets("Base").Cells(Rows.Count, 1).End(xlUp).Row + 1
        wbkdatos.ActiveSheet.Range("base").Copy Destination:=wbkdestino.Worksheets("Base").Range("A" & UltimaFila)
        wbkdatos.Close False
    End If
Next file
Set fso = Nothing: Set folder = Nothing
Application.ScreenUpdating = True
End Sub

¡Gracias! ...Después de tanto resulto... muchas gracias amigo... hice unos ajuste y funciona impecable... saludos desde santiago de chile

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas