En este grupo En todos

Foro de Excel



Error 1004 tratando de pegar una informacion a traves de una macro

Carlos
Distrito Federal, Ve...
Escrito por Carlos Alonzo
el 26/03/2010

Expertos buenas tardes.

Tengo un problemita. Necesito desde un libro (a traves de un boton que posee una macro), abrir otro libro que selecciono desde una ventana emergente el cual posee una tabla en una hoja en especifico (con 7200 filas), ese macro me selecciona a traves de una variable solo la region donde hay informacion, me la copia, cierra el libro, activa el libro donde quiero pegar la informacion, se ubica en la primera celda del rango y pega la informacion con formatos y todo.

Sin embargo la macro revienta en un erro 1004 que dice: error en tiempo de ejecucion
Error en el metodo pastespecial de la clase Range




Y de verdad no se donde esta la novedad. Se que pueden ayudarme.

Gracias de antemano, aqui les adjunto la macro:

Private Sub CommandButton2_Click()
ActiveSheet. Unprotect "enamecargill"

''**********************************************************************************************************
Application. ScreenUpdating = False
strfilas = Range("E4"). Value 'H2: celda monitora del archivo receptor que calcula el numero de filas que tienen informacion en la hoja
Range("A7:O" & strfilas + 6). Select 'A18: primera celda de la tabla del archivo receptor, AB: la ultima columna de la tabla, 17: el numero de filas por encima de la primera celda de la tabla con informacion
Selection. ClearContents
Application. Dialogs(xlDialogOpen). Show
nombre = ActiveWorkbook. Name
Windows(ActiveWorkbook. Name). Activate
Sheets("IBDM"). Select
ActiveSheet. Unprotect "enamecargill"
strfilas2 = ActiveSheet. Range("I2"). Value 'H2: celda monitora que cuenta las filas con informacion en el archivo origen. En ambos casos la celda monitora es "H2"
ActiveSheet. Range("A7:O" & strfilas2 + 6). Select 'A4: En el archivo origen la primera celda con informacion es la "A4", AB: la ultima columna con informacion en la tabla
Selection. Copy
ActiveSheet. Protect "enamecargill"
ActiveWorkbook. Save
ActiveWindow. Close
Windows("Vision PDC_BDM 1. Xlsm"). Activate 'El archivo Receptor se llama pruebas macros2 'Aca el nombre del archivo receptor debe estar escrito EXACTAMENTE igual.
Sheets("EKA 1"). Select
ActiveSheet. Range("A7"). Select 'A18: nuevamente es la primera celda con informacion en la tabla destino del archivo.
ActiveSheet. Unprotect "enamecargill"
Selection. PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False


Application. ScreenUpdating = True
ActiveSheet. Protect "enamecargill"
End Sub


Cacho Rodríguez
Ing. electrónica u.n.r.
Escrito por Cacho Rodríguez
el 26/03/2010

Hola! Carlos.
Omitiste indicar que línea es la que te origina ese error...

Saludos, Cacho.

Carlos Alonzo
Distrito Federal, Ve...
Escrito por Carlos Alonzo
el 26/03/2010

Gusto en saludarte Cacho, el error es en justo esta linea:

Selection. PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False

ya casi al final cuando voy a pegar en la hoja destino.

Cacho Rodríguez
Ing. electrónica u.n.r.
Escrito por Cacho Rodríguez
el 26/03/2010

Si, disculpa, no había leído bien tu descripción...

Mira el problema lo tienes aquí:

Selection. Copy
ActiveSheet. Protect "enamecargill"
ActiveWorkbook. Save
ActiveWindow. Close


Cuando haces:
ActiveSheet. Protect "enamecargill" se "pierde" lo que tengas en el portapapeles (hazlo manualmente y verás).

De modo que la solución es copiar el rango, pegarlo y recién después: proteges y cierras ese libro.

Saludos, Cacho.


Cacho Rodríguez
Ing. electrónica u.n.r.
Escrito por Cacho Rodríguez
el 26/03/2010

Quizás te sirva reemplazar:

_______________________

Application. Dialogs(xlDialogOpen). Show

nombre = ActiveWorkbook. Name
Windows(ActiveWorkbook. Name). Activate
Sheets("IBDM"). Select
ActiveSheet. Unprotect "enamecargill"
strfilas2 = ActiveSheet. Range("I2"). Value 'H2: celda monitora que cuenta las filas con informacion en el archivo origen. En ambos casos la celda monitora es "H2"
ActiveSheet. Range("A7:O" & strfilas2 + 6). Select 'A4: En el archivo origen la primera celda con informacion es la "A4", AB: la ultima columna con informacion en la tabla
Selection. Copy
ActiveSheet. Protect "enamecargill"
ActiveWorkbook. Save
ActiveWindow. Close

Windows("Vision PDC_BDM 1. Xlsm"). Activate 'El archivo Receptor se llama pruebas macros2 'Aca el nombre del archivo receptor debe estar escrito EXACTAMENTE igual.

_______________________


por:
_______________________

Application. Dialogs(xlDialogOpen). Show

Sheets("IBDM"). Select
ActiveSheet. Range("A7:O" & [i2] + 6). Copy
ActiveWorkbook. Close False

Windows("Vision PDC_BDM 1. Xlsm"). Activate 'El archivo Receptor se llama pruebas macros2 'Aca el nombre del archivo receptor debe estar escrito EXACTAMENTE igual.

_______________________


Pero, nuevamente, cuando desproteges mediante:

ActiveSheet. Unprotect "enamecargill"
Selection. PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False

tendrás el mismo problema.


Conclusión: quita todas las protecciones primero, y copias después.

Comenta como te ha ido, ¿Si?
Saludos, Cacho.


Carlos Alonzo
Distrito Federal, Ve...
Escrito por Carlos Alonzo
el 26/03/2010

Cacho... Aun persiste el problema no quiere pegar nada... Mira el codigo, algunas cosas no las borre como dijiste si no que las comente:


Application. ScreenUpdating = False
strfilas = Range("E4"). Value 'H2: celda monitora del archivo receptor que calcula el numero de filas que tienen informacion en la hoja
Range("A7:O" & strfilas + 7). Select 'A18: primera celda de la tabla del archivo receptor, AB: la ultima columna de la tabla, 17: el numero de filas por encima de la primera celda de la tabla con informacion
Selection. ClearContents
Application. Dialogs(xlDialogOpen). Show
''nombre = ActiveWorkbook. Name
''Windows(ActiveWorkbook. Name). Activate
Sheets("IBDM"). Select
ActiveSheet. Unprotect "enamecargill"
strfilas2 = ActiveSheet. Range("I2"). Value 'H2: celda monitora que cuenta las filas con informacion en el archivo origen. En ambos casos la celda monitora es "H2"
ActiveSheet. Range("A7:O" & strfilas2 + 6). Copy 'A4: En el archivo origen la primera celda con informacion es la "A4", AB: la ultima columna con informacion en la tabla
''Selection. Copy
''ActiveWorkbook. Save
ActiveWorkbook. Close False
''ActiveWindow. Close
Windows("Vision PDC_BDM 1. Xlsm"). Activate 'El archivo Receptor se llama pruebas macros2 'Aca el nombre del archivo receptor debe estar escrito EXACTAMENTE igual.
''Sheets("EKA 1"). Select
ActiveSheet. Range("A7"). Select 'A18: nuevamente es la primera celda con informacion en la tabla destino del archivo.
Selection. PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False


Application. ScreenUpdating = True
ActiveSheet. Protect "enamecargill"
End Sub

Cacho Rodríguez
Ing. electrónica u.n.r.
Escrito por Cacho Rodríguez
el 26/03/2010

Te reitero las últimas líneas de mi comentario anterior:

_______________

Conclusión: quita todas las protecciones primero, y copias después.

Comenta como te ha ido, ¿Si?
Saludos, Cacho.


_______________

Saludos, Cacho.

Carlos Alonzo
Distrito Federal, Ve...
Escrito por Carlos Alonzo
el 26/03/2010

Cacho diras que estoy ya embotado del tema jejeje pero de verdad no te entiendo, fijate:

En el codigo antes de copiar desbloqueo las hojas con las que trabajo, despues de eso es que copio y me voy al archivo destino para intentar pegar.

A eso te refieres?....

Saludos

Cacho Rodríguez
Ing. electrónica u.n.r.
Escrito por Cacho Rodríguez
el 26/03/2010

A ver:

El CommandButton2, ¿En qué libro/hoja se encuentra? Te lo pregunto pues no entiendo la función del primer ActiveSheet. Unprotect "enamecargill" ?

Carlos Alonzo
Distrito Federal, Ve...
Escrito por Carlos Alonzo
el 26/03/2010

Te explico, todas las hojas de todos los libros estan protegidos, y cada vez que quiero hacer algo con ellas pues las desbloqueo.

Ese boton esta en ''Vision PDC_BDM 1. Xlsm'' que es el libro donde quiero pegar lo que copie desde el libro que yo seleccione en una hoja determinada.

El primer desproteger, me quitala proteccion del libro destino, y el otro me quita la proteccion del libro desde donde copio, acaso esa desproteccion no es necesaria?.... O es que acaso puede que haya habilitada dentro de la proteccion de la hoja que no se pueda copiar?.... Puede ser eso no se?

Cacho Rodríguez
Ing. electrónica u.n.r.
Escrito por Cacho Rodríguez
el 26/03/2010

Creo que ahora nos vamos entendiendo..

Prueba con:
_______________________

Private Sub CommandButton2_Click()
Application. ScreenUpdating = False

With ThisWorkbook. Sheets("EKA 1")
. Unprotect "enamecargill"
. Range("A7:O" & [E4] + 6). ClearContents
Application. Dialogs(xlDialogOpen). Show
ActiveWorkbook. Sheets("IBDM"). Select
Range("A7:O" & [I2] + 6). Copy
. [A7]. PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
ActiveWorkbook. Close True
Application. Goto. [E7]
. Protect "enamecargill"
End With

Application. ScreenUpdating = True
End Sub

_______________________


Saludos, Cacho.

Galileogali -
Buenos Aires, Argent...
Escrito por Galileogali -
el 26/03/2010

Y porque no usar el parametro UserInterfaceOnly = true del Metodo Protect al abrir el Libro en el evento Open de Workbook, paseando esto por todas las hojas del libro...
despues te despreocupas de andar protegiendo y desprotegiendo aca, alla o acullá
}
GALILEOGALI

https://excelgali.mejorforo.net/

Cacho Rodríguez
Ing. electrónica u.n.r.
Escrito por Cacho Rodríguez
el 26/03/2010

¡Mirá vos, Galileo...! ¡Ésa no la tenía!
De modo que -y para no cambiar demasiado- podría quedar:


Private Sub CommandButton2_Click()
Application. ScreenUpdating = False

With ThisWorkbook. Sheets("EKA 1")
. Protect "enamecargill", UserInterfaceOnly:=True
. Range("A7:O" & [E4] + 6). ClearContents
Application. Dialogs(xlDialogOpen). Show
ActiveWorkbook. Sheets("IBDM"). Select
Range("A7:O" & [I2] + 6). Copy
. [A7]. PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
ActiveWorkbook. Close True
Application. Goto _
. [E7]
End With

Application. ScreenUpdating = True
End Sub


Veamos si le "cierra" al amigo.
Saludos, Cacho.

Carlos Alonzo
Distrito Federal, Ve...
Escrito por Carlos Alonzo
el 28/03/2010

Que va estimados.... Aun no funciona como es debido... Solo me esta trayendo el encabezado y creo que es de la misma pagina destino....

Cacho Rodríguez
Ing. electrónica u.n.r.
Escrito por Cacho Rodríguez
el 28/03/2010

Supongo que "no estás viendo algo" que es importante.

Fíjate si puedes subir tus dos libros al Foro para darles una mirada (no es necesario que contengan toda la información, pero sí algunas de las líneas que hagan a la estructura de tus datos).

Saludos, Cacho.

Carlos Alonzo
Distrito Federal, Ve...
Escrito por Carlos Alonzo
el 28/03/2010

Tendra que ver acaso que todas las celdas desde donde estoy copiando la informacion poseen informacion vinculada con otras hojas de ese libro?.. Es decir, la data que estoy copiando es el resultado de un vinculo con otras hojas del libro...

Cacho Rodríguez
Ing. electrónica u.n.r.
Escrito por Cacho Rodríguez
el 28/03/2010

Sin ánimo de perder el tiempo te pregunto: ¿Ya subiste los libros para verlos?

Carlos Alonzo
Distrito Federal, Ve...
Escrito por Carlos Alonzo
el 28/03/2010

Cacho ya logre que la data se pegara... Lo hice con tu codigo pero encontre que el problema debe estar aca:

En la celda I2 del libro desde donde copio la data, tengo esta formula
=CONTARA('EKA 1'! $G:$G)-1

esa celda cuando hay data lo que hace es contarme en cuantas filas hay datos en la tabla y le resto 1 para obviar el encabezado de la misma.

si p ej esa celda arroja el nro 100 entonces cuando yo selecciono el rango a copiar le digo que es desde la A7:O"variable+6" (le sumo 6 porque es la cantidad de celdas por encima de la primera celda de la tabla en cuestion).

que hice? , coloque un nro fijo en ese rango y pego todo perfecto... Que sugieres para que ese rango pueda ser dinamico de una manera eficiente?

Carlos Alonzo
Distrito Federal, Ve...
Escrito por Carlos Alonzo
el 28/03/2010

... Ya los voy a subir....

Carlos Alonzo
Distrito Federal, Ve...
Escrito por Carlos Alonzo
el 28/03/2010

Cacho, pienso que el problema estaba en el manejo de la variable cuando definia el rango que necesitaba seleccionar para copiar.

la redefini de nuevo y controle que se generara la variable de manera correcta para que me seleccionara justo hasta el final de la tabla de datos y asi pudiese copiar y pegar en el libro destino.

ya corrio perfecto, y copia las 7200 filas muy bien.

Muchisiimas gracias por tu apoyo, a la final tu codigo es mucho mas sencillo y me ayudo muchisimo.

Muy agradecido por tu colaboracion.

Atte Carlos.