Copiar/pegar función de lista desplegable
Koalacid
Mensajes publicados
70
Estado
Miembro
-
Koalacid Mensajes publicados 70 Estado Miembro -
Koalacid Mensajes publicados 70 Estado Miembro -
Bonjour,
Ya no es mi primera pregunta en este foro y quiero agradecerles por su ayuda y por las numerosas horas (¿días?) de incomprensión que me han ahorrado.
Regreso con un nuevo desafío:
La historia comienza con un archivo macro (llamémoslo archivo M) en el que hay botones de macro y una lista desplegable que incluye los meses del año. Por otro lado, hay una veintena de archivos (llamémoslos archivos X, Y, Z, ...) ansiosos por conocer el mes seleccionado en la lista desplegable para así poder realizar copiar/pegar de valores organizados en columnas.
Y aquí está el objetivo. Selecciono el mes en la lista desplegable del archivo M y ejecuto la macro que tiene en cuenta el mes seleccionado, abre los archivos X, Y, Z (uno por uno, no seamos demasiado ambiciosos), selecciona la pestaña "por año", busca la columna que sigue a la columna del mes seleccionado (y sí, hay un pequeño truco aquí, pero con la función offset creo que es solo un detalle), entonces selecciona esa columna, la copia/pega en otra pestaña (Update) del mismo archivo y luego tranquilamente se va a hacer lo mismo en el siguiente archivo.
Así que, aquí estoy, por más que tengo algunas ideas sobre las funciones a utilizar (como offset o un simple copypaste). Pero no he encontrado en la web nada que se acerque lo suficiente a lo que quiero hacer como para inspirarme. Estoy completamente perdido.
Aproximadamente concibo la macro así:
1) abrir el primer archivo destinatario
2) comprobar la lista desplegable en el archivo M y seleccionar la columna +1 en el archivo destinatario
3) copiar/pegar esta columna en una pestaña ya preparada
4) repetir
Me las arreglaré con todo lo que respecta al cierre de los archivos destinatarios después del copiar/pegar, y otros detalles que no están directamente relacionados con esta cuestión de copiar/pegar en función de la lista desplegable.
Mi primera pregunta es: ¿es posible? (sí, a veces dudo).
¿Y cómo?
Como siempre, el objetivo es aprender. Así que no duden en hablarme con muchos detalles para que comprenda las líneas de código y lo que sucede.
Atentamente,
Ya no es mi primera pregunta en este foro y quiero agradecerles por su ayuda y por las numerosas horas (¿días?) de incomprensión que me han ahorrado.
Regreso con un nuevo desafío:
La historia comienza con un archivo macro (llamémoslo archivo M) en el que hay botones de macro y una lista desplegable que incluye los meses del año. Por otro lado, hay una veintena de archivos (llamémoslos archivos X, Y, Z, ...) ansiosos por conocer el mes seleccionado en la lista desplegable para así poder realizar copiar/pegar de valores organizados en columnas.
Y aquí está el objetivo. Selecciono el mes en la lista desplegable del archivo M y ejecuto la macro que tiene en cuenta el mes seleccionado, abre los archivos X, Y, Z (uno por uno, no seamos demasiado ambiciosos), selecciona la pestaña "por año", busca la columna que sigue a la columna del mes seleccionado (y sí, hay un pequeño truco aquí, pero con la función offset creo que es solo un detalle), entonces selecciona esa columna, la copia/pega en otra pestaña (Update) del mismo archivo y luego tranquilamente se va a hacer lo mismo en el siguiente archivo.
Así que, aquí estoy, por más que tengo algunas ideas sobre las funciones a utilizar (como offset o un simple copypaste). Pero no he encontrado en la web nada que se acerque lo suficiente a lo que quiero hacer como para inspirarme. Estoy completamente perdido.
Aproximadamente concibo la macro así:
1) abrir el primer archivo destinatario
2) comprobar la lista desplegable en el archivo M y seleccionar la columna +1 en el archivo destinatario
3) copiar/pegar esta columna en una pestaña ya preparada
4) repetir
Me las arreglaré con todo lo que respecta al cierre de los archivos destinatarios después del copiar/pegar, y otros detalles que no están directamente relacionados con esta cuestión de copiar/pegar en función de la lista desplegable.
Mi primera pregunta es: ¿es posible? (sí, a veces dudo).
¿Y cómo?
Como siempre, el objetivo es aprender. Así que no duden en hablarme con muchos detalles para que comprenda las líneas de código y lo que sucede.
Atentamente,
12 respuestas
-
Hola Koalacid, hola el foro,
Sí, debería ser posible, pero necesitaríamos al menos dos archivos de ejemplo. Uno que contenga la macro (el archivo fuente) y un archivo de destino. Solo con algunos datos para que podamos ver la estructura y codificar con una base muy parecida al archivo original. Luego, hay que saber la ruta de acceso completa de los diferentes archivos. Si están todos en la misma carpeta que el archivo fuente, no hace falta...
Esperando tu respuesta.
--
Hasta luego,
Thautheme -
Hola ThauTheme,
¡Primero que nada, gracias por tu apoyo!
Aquí están los enlaces de los archivos:
El archivo con los datos:
https://www.cjoint.com/?DJvnXkSuDUh
y el archivo Macro
https://www.cjoint.com/?DJvnYCjipZp
He añadido un marco con la explicación.
Cabe destacar que en realidad hay una buena veintena de archivos X, Y, Z de donde proviene el bucle.
Atentamente, -
Buenas tardes KoalaCid, buenas tardes al foro,
Lo siento, pero hoy no tuve tiempo. Te prometo que me ocuparé de ello mañana...
--
Hasta luego,
Thautheme -
Hola Koakacid, hola al foro,
Adjunto tu archivo modificado con el código a continuación:Sub Macro1()
Dim CS As Workbook 'declara la variable CS (Libro Fuente)
Dim MR As String 'declara la variable MR (Mes Buscado)
Dim SF As Object 'declara la variable SF (Sistema de Archivos)
Dim DT As Object 'declara la variable DT (Carpeta de Trabajo)
Dim FS As Object 'declara la variable FS (Archivos)
Dim F As Object 'declara la variable F (Archivo)
Dim CD As Workbook 'declara la variable CD (Libro Destino)
Dim O1 As Object 'declara la variable O1 (Hoja 1)
Dim O2 As Object 'declara la variable O2 (Hoja 2)
Dim R As Range 'declara la variable R (Búsqueda)
Dim CP As Byte 'declara la variable CP (Columna Promo)
Dim CNP As Byte 'declara la variable CNP (Columna No Promo)
Application.ScreenUpdating = False 'oculta las actualizaciones de pantalla
Set CS = ThisWorkbook 'define el libro fuente CS
MR = CS.Sheets("Lista Desplegable").Range("D4").Value 'define el mes buscado
Set SF = CreateObject("Scripting.Filesystemobject") 'define el sistema de archivos SF
Set DT = SF.GetFolder(ThisWorkbook.Path) 'define la carpeta de trabajo DT
Set FS = DT.Files 'define el conjunto de archivos FS contenidos en la carpeta de trabajo
For Each F In FS 'bucle sobre todos los archivos F del conjunto FS
If Right(F.Name, 5) = ".xlsx" Then 'condición 1: si la extensión del archivo es ".xlsx"
On Error Resume Next 'gestión de errores (en caso de error pasa a la línea siguiente)
Set CD = Workbooks(F.Name) 'define el libro destino CD (genera un error si este libro no está abierto)
If Err <> 0 Then 'condición 2: si se ha generado un error
Err.Clear 'borra el error
Workbooks.Open (F) 'abre el archivo F
Set CD = ActiveWorkbook 'define el libro destino CD
End If 'fin de la condición 2
Set O1 = CD.Sheets("Vol Prev") 'define la hoja O1 (genera un error si esta hoja no existe)
If Err <> 0 Then 'condición 3: si se ha generado un error
Err.Clear 'borra el error
CD.Close 'cierra el libro CD
GoTo suite 'va a la etiqueta "suite"
End If 'fin de la condición 3
On Error GoTo 0 'anula la gestión de errores
Set O2 = CD.Sheets("Actualizar Vol") 'define la hoja O2
Set R = O1.Rows(5).Find(MR, , xlValues, xlWhole) 'define la búsqueda R
If Not R Is Nothing Then 'condición 4: si existe al menos una ocurrencia encontrada
CNP = R.Column 'define la columna no promo CNP
CP = R.Column + 1 'define la columna promo CP
Else 'de lo contrario
MsgBox "¡Mes no encontrado!": Exit Sub 'mensaje, sale del procedimiento
End If 'fin de la condición 4
O1.Range(O1.Cells(8, CP), O1.Cells(18, CP)).Copy 'copia los valores de la columna promo del mes buscado en la hoja O1
O2.Range("C8").PasteSpecial (xlPasteValues) 'pega los valores en la celda C8 de la hoja O2
O2.Range("B8:B18").Copy 'copia los datos calculados del rango B8:B18 de la hoja O2
O1.Cells(8, CNP).PasteSpecial (xlPasteValues) 'pega los valores en la fila 8 de la columna no promo del mes buscado
Application.CutCopyMode = False 'elimina el parpadeo de las celdas relacionado con "copiar"
CD.Close SaveChanges:=True 'cierra el libro destino guardando los cambios
End If 'fin de la condición 1
suite: 'etiqueta
Next F 'siguiente archivo del conjunto de archivos FS
Application.ScreenUpdating = True 'muestra las actualizaciones de pantalla
End Sub
En resumen, la macro hace lo siguiente:
* bucle para abrir todos los archivos en la misma carpeta que el archivo fuente.xlsm con una extensión .xlsx. ¿Este criterio es adecuado?
* una vez que se abre el archivo, si este no contiene una hoja llamada Vol Prev, se cierra y se pasa al siguiente archivo...
* de lo contrario, copiamos la columna promo del mes buscado y la pegamos en la celda C8 de la hoja Actualizar Vol.
* Luego, copiamos el rango B8:B18 de esta misma hoja para pegarlo en la columna no promo del mes buscado.
* guardamos el libro destino y lo cerramos
* pasamos al siguiente archivo...
El único problema que he encontrado es que en tu ejemplo, los cálculos no se realizan. ¿Tienes alguna explicación?
Te recomiendo crear una carpeta de prueba donde pongas el archivo adjunto y una copia de uno o dos archivos destino. Ejecutas y ves dónde falla...
¡Arf! Soy muy nuevo en este foro y no sé cómo adjuntar un archivo. ¿Puedes explicármelo incluso si normalmente el código es suficiente...
--
Hasta luego,
Thautheme-
Hola ThauTheme,
¡Primero gracias por tu ayuda! Esto es un código.
Aquí está el enlace que he utilizado para los archivos.
https://www.cjoint.com/
Voy a hacer las pruebas esta tarde e intentar entender lo máximo posible (espero todo siendo optimista por naturaleza :) ). Mientras tanto, he avanzado un poco en este problema y he descubierto una solución alternativa que permite simplificar el proceso. Sin embargo, todavía necesitaría tu código, no te preocupes.
Atentamente,
-
-
Hola Koalacid, hola el foro,
Está bien, espero tu respuesta. Gracias por el enlace...
El archivo:
https://www.cjoint.com/?DJwnZDOj23k
--
Hasta luego,
Thautheme -
Hola ThauTheme,
He copiado y adaptado la macro según los nombres de las pestañas y los rangos correspondientes.
Funciona sin errores pero no logra encontrar el mes. No entiendo por qué.
El mensaje de error: Mes no encontrado que la macro lanza en este caso se muestra cada vez.
¿De dónde puede venir el error? ¿En qué pestaña lanza el código la búsqueda del mes?
Atentamente, -
Hola koalacid, hola el foro
Sí, olvidé avisarte, lo siento. Me di cuenta de que la lista de meses en la pestaña Lista Desplegable no coincidía con los meses del archivo de destino del ejemplo debido al espacio entre P y 14. Así que he añadido un espacio en las 12 celdas para que funcione. Los nombres en la lista deben ser idénticos a los nombres contenidos en la fila 5 del documento Vol Prev. Espero que hayas sido coherente en todos los archivos y que sea igual en todas partes con la misma estructura...
Espero tu respuesta...
--
Hasta luego,
Thautheme -
¡LO ENCONTRÉ!
El error era necesariamente simplísimo. Entre los archivos que te había enviado y los que utilizo para la macro, hay diferencias (por razones de confidencialidad, tuve que hacer nuevos archivos).
Así que había una diferencia en la línea donde la macro buscaba el mes. Así que cambié esa línea y adivina qué.
¡Y funciona!
ThauTheme, ¡te rindo culto!
Ahora solo queda integrar bien la macro en mis archivos. ¡Te agradezco por tu ayuda!
Antes de terminar, solo tengo una última pregunta. ¿Para qué sirve el hecho de insertar estas líneas al principio:
"Dim as...."
Atentamente,-
-
J'ai encore une autre question. Si je veux changer la définition d'un onglet, par exemple si je veux que le O2 ne soit pas sur le classeur destinataire mais sur le classeur source (celui avec la liste déroulante), est-ce que je peux supprimer la phase du code qui définit O2 comme étant un onglet appelé Update Vol et rajouter une ligne tout au début ?
Tel que suit :
Set O2 = CS.Sheets("Machèremaman") 'définit l'onglet 2 -
Para las declaraciones de variable, mira el excelente trabajo de MDF aquí:
http://www.mdf-xlpages.com/modules/publisher/item.php?itemid=51&keywords=variables
-
-
Hola, te había dicho que había modificado el proceso para hacerlo más coherente.
Aquí está el nuevo código que debería funcionar (te dejo adivinar la continuación...):
Sub Macro1()
Dim CS As Workbook 'declara la variable CS (Libro Fuente)
Dim MR As String 'declara la variable MR (Mes Buscado)
Dim SF As Object 'declara la variable SF (Sistema de Archivos)
Dim DT As Object 'declara la variable DT (Carpeta de Trabajo)
Dim FS As Object 'declara la variable FS (Archivos)
Dim F As Object 'declara la variable F (Archivo)
Dim CD As Workbook 'declara la variable CD (Libro Destino)
Dim O1 As Object 'declara la variable O1 (Hoja 1)
Dim O2 As Object 'declara la variable O2 (Hoja 2)
Dim R1 As Range 'declara la variable R1 (Búsqueda 1)
Dim R2 As Range 'declara la variable R2 (Búsqueda 2)
Dim CP As Byte 'declara la variable CP (Columna Promo)
Dim CNP As Byte 'declara la variable CNP (Columna No Promo)
Application.ScreenUpdating = False 'oculta las actualizaciones de pantalla
Set CS = ThisWorkbook 'define el libro fuente CS
Set O1 = CS.Sheets("Vol No Promo") 'define la hoja O1
Set R1 = O1.Rows(4).Find(MR, , xlValues, xlWhole) 'define la búsqueda R1
If Not R1 Is Nothing Then 'condición A : si existe al menos una ocurrencia encontrada
CNP = R1.Column 'define la columna no promo CNP
Else 'sino
MsgBox "¡Mes no encontrado!": Exit Sub 'mensaje, sale del procedimiento
End If 'fin de la condición A
MR = CS.Sheets("Macro").Range("G10").Value 'define el mes buscado
Set SF = CreateObject("Scripting.Filesystemobject") 'define el sistema de archivos SF
Set DT = SF.GetFolder(ThisWorkbook.Path) 'define la carpeta de trabajo DT
Set FS = DT.Files 'define el conjunto de archivos FS contenidos en la carpeta de trabajo
For Each F In FS 'bucle sobre todos los archivos F del conjunto FS
If Right(F.Name, 5) = ".xlsm" Then 'condición 1 : si la extensión del archivo es ".xlsm"
On Error Resume Next 'gestión de errores (en caso de error pasa a la siguiente línea)
Set CD = Workbooks(F.Name) 'define el libro destino CD (genera un error si este libro no está abierto)
If Err <> 0 Then 'condición 2 : si se ha generado un error
Err.Clear 'limpia el error
Workbooks.Open (F) 'abre el archivo F
Set CD = ActiveWorkbook 'define el libro destino CD
End If 'fin de la condición 2
Set O2 = CD.Sheets("Vol_SKU_COLS_SAISI") 'define la hoja O2 (genera un error si esta hoja no existe)
Set R2 = O2.Rows(4).Find(MR, , xlValues, xlWhole) 'Define la búsqueda en la hoja 02
If Not R2 Is Nothing Then 'condición B : si existe al menos una ocurrencia encontrada
CNP = R2.Column 'define la columna no promo CNP
CP = R2.Column + 1 'define la columna promo CP
If Err <> 0 Then 'condición 3 : si se ha generado un error
Err.Clear 'limpia el error
CD.Close 'cierra el libro CD
GoTo suite 'va a la etiqueta "suite"
End If 'fin de la condición 3
On Error GoTo 0 'anula la gestión de errores
O1.Range(O1.Cells(7, CNP), O1.Cells(86, CNP)).Copy 'copia los valores de la columna no promo del mes buscado en la hoja O1
O2.Range(O2.Cells(7, CNP), O2.Cells(86, CNP)).PasteSpecial (xlPasteValues) 'pega los valores en la columna CNP de la hoja 02
Application.CutCopyMode = False 'elimina el parpadeo de las celdas relacionado con el "copiar"
CD.Close SaveChanges:=True 'cierra el libro destino guardando los cambios
End If 'fin de la condición 1
suite: 'etiqueta
Next F 'próximo archivo del conjunto de archivos FS
Application.ScreenUpdating = True 'muestra las actualizaciones de pantalla
End Sub
El proceso es el siguiente. En lugar de copiar de un archivo fuente a un archivo en una hoja donde se encuentra un cálculo que trae un nuevo resultado a pegar en la hoja B (esquema reducido a su simplicidad elemental de lo que decía antes), aquí está el nuevo proceso.
Tomo la información de todos los archivos y los pego en un archivo fuente, hago mis cálculos y obtengo el resultado final que debo pegar según el mes. Es en este momento que interviene el código inscrito en este post.
Hábil visual que eres, notarás la sutil huella de tu código. (casi todo si no todo). Solo he intercambiado la historia de las hojas.
En fin. Después de re-re-relectura del código, ejecuto la macro con un F5 confiado.
----> Pèf error en la última línea:
Next F 'próximo archivo del conjunto de archivos FS
Un mensaje de error: "Next sin For"
Después de verificar, no había en tu código. ¿Cómo hiciste para corromper tu VBE sin este "For"????
Estoy nadando....
Cordialmente, -
-
Hola,
Siento responder tan tarde, solo he tenido tiempo para abordar brevemente esta macro hoy:
Aquí están los enlaces de tres archivos para realizar las pruebas:
Archivo de actualización:
https://www.cjoint.com/?0Jxr1ttcbFg
2 archivos de clientes:
https://www.cjoint.com/?0Jxr3cAUA00
https://www.cjoint.com/?0Jxr3zRNJSN
Espero que esto ayude.
Por mi parte, estoy atorado con el problema del mes. No lo encuentra y el mensaje de error dice "mes no encontrado".
Atentamente, -
Buenas noches Kolacid, buenas noches al foro,
No respondes a ningún punto que he planteado en el post #13. Me devuelves el bebé y te digo... No es así como veo las cosas... Si quieres ayuda, ¡tienes que proporcionar explicaciones!
--
Hasta luego,
Thautheme-
-
-
Una vez más, te agradezco por tu ayuda Thautheme, lamentablemente este tema sin resolver puede llevar tiempo y no quiero abusar del tuyo.
Me las arreglaré más adelante para encontrar una solución cuando pueda encargarme de eso.
Una vez más, gracias por tus respuestas rápidas y muy interesantes,
Atentamente,
-