Copiar/pegar función de lista desplegable

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,

12 respuestas

  1. ThauTheme Mensajes publicados 1564 Estado Miembro 160
     
    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
    0
  2. Koalacid Mensajes publicados 70 Estado Miembro 2
     
    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,
    0
  3. ThauTheme Mensajes publicados 1564 Estado Miembro 160
     
    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
    0
  4. ThauTheme Mensajes publicados 1564 Estado Miembro 160
     
    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
    0
    1. Koalacid Mensajes publicados 70 Estado Miembro 2
       
      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,
      0
  5. Koalacid Mensajes publicados 70 Estado Miembro 2
     
    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,
    0
  6. ThauTheme Mensajes publicados 1564 Estado Miembro 160
     
    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
    0
  7. Koalacid Mensajes publicados 70 Estado Miembro 2
     
    ¡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,
    0
    1. Koalacid Mensajes publicados 70 Estado Miembro 2
       
      Finalmente, aclaro un poco mi pregunta:

      ¿Cómo funciona esta descripción de las variables de la macro?
      Si quisiera cambiar algo como el libro de trabajo de origen para que sea otro archivo de Excel, ¿hay que hacerlo en ese lugar?
      0
    2. Koalacid Mensajes publicados 70 Estado Miembro 2
       
      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
      0
  8. Koalacid Mensajes publicados 70 Estado Miembro 2
     
    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,
    0
  9. ThauTheme Mensajes publicados 1564 Estado Miembro 160
     
    Lo siento, no puedo ayudar con eso.
    0
  10. Koalacid Mensajes publicados 70 Estado Miembro 2
     
    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,
    0
  11. ThauTheme Mensajes publicados 1564 Estado Miembro 160
     
    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
    0
    1. Koalacid Mensajes publicados 70 Estado Miembro 2
       
      No he tenido tiempo de ocuparme de eso aún, ya llegará.
      0
    2. ThauTheme Mensajes publicados 1564 Estado Miembro 160
       
      Je suis prêt. Vous pouvez fournir le texte à traduire.
      0
    3. Koalacid Mensajes publicados 70 Estado Miembro 2
       
      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,
      0