VBA Excel seleccionar la primera columna vacía

Resuelto
Jerome -  
 Jerome -
Hola,

Una vez más acudo a su ayuda. He creado gracias al grabador automático una macro para escribir en la primera columna vacía de la fila 1
Así que seleccioné la columna C1 y hice "ctrl + flecha derecha" y nuevamente flecha a la derecha.

Range("C1").Select
Selection.End(xlToRight).Select
Range("R1").Select

Solo que al leer mi código me dice que selecciona la última celda, hasta ahí no hay problema, pero luego me selecciona la celda R1 que seguramente es mi primera columna vacía, pero de una semana a otra la selección no será necesariamente la celda R1, puede ser S1 o T1 o U1 o AA1, etc.

¿Sabrían cómo realizar este código?

Una vez más gracias por su ayuda,

Atentamente
Jérôme

29 respuestas

  • 1
  • 2
  1. via55 Mensajes publicados 14393 Fecha de registro   Estado Miembro Última intervención   2 759
     
    Buenas noches Jérôme,

    y= Range("C1").End(xlToRight).Column Cells(1,y).Select


    Saludos
    A través de

    --
    "La imaginación es más importante que el conocimiento."    A. Einstein
    1
    1. Jerome
       
      Hola Via,

      Una vez más, muchas gracias por tu ayuda. Al probar el código, me doy cuenta de que me he expresado mal.
      Con este código, llego a la última columna de C1 que está llena.
      y= Range("C1").End(xlToRight).Column
      Cells(1,y).Select
      ActiveCell.FormulaR1C1 = "Presente base anterior"

      Sin embargo, el comando siguiente es escribir "presente base anterior", pero me lo escribe en la última columna llena y reemplaza el título actual con este comando.

      y= Range("C1").End(xlToRight).Column
      Cells(1,y).Select
      ActiveCell.FormulaR1C1 = "Presente base anterior"

      Lo que me gustaría es escribirlo justo al lado, en la primera columna que esté vacía. Pensé que podría combinarlo con el comando de mover el cursor a la derecha, ¿pero quizás tú tengas un mejor comando?

      ActiveCell.Offset(0, 1).Select


      Una vez más, gracias por tu ayuda,

      Cordiales saludos.
      0
  2. via55 Mensajes publicados 14393 Fecha de registro   Estado Miembro Última intervención   2 759
     
    Hola,

    Al más simple, basta con añadir 1 en la primera línea de código ☺
    y= Rango("C1").Fin(xlAlaDerecha).Columna +1

    Cdlmnt
    Vía

    --
    "La imaginación es más importante que el conocimiento." A. Einstein
    1
    1. Jerome
       
      Re hola,

      ¡Genial!

      ¡Muchas gracias! ????

      Afectuosamente
      0
    2. Jerome
       
      Hola Via,

      Lamento molestarte una vez más, pero tengo dos preguntas para continuar con mi macro.

      Cuando realizo el código funciona muy bien, pero debo añadir sistemáticamente el código completo:
      y = Range("C1").End(xlToRight).Column
      Cells(1,y).Select
      Porque si no añado siempre el y = Range("C1").End(xlToRight).Column antes del código Cells(1,y).Select, se sobrescribe cada vez en la misma columna reemplazando siempre el último comando. ¿Es normal? Es para mi comprensión, ya que no me incomoda escribir siempre el código completo. Además, ¿el hecho de haber declarado mi y como Dim as Byte no sirve de nada?

      Mi otra pregunta es sobre lo siguiente, de hecho, estoy buscando la última celda para añadir una búsquedaV, aunque en mi macro realizada con el grabador se precisa la celda, mientras que gracias al código anterior es según la última columna llena. De este modo, en la fórmula con el grabador tenía mi fórmula que partía de la celda debajo de la que acababa de crear y la fórmula guardaba bien la columna Q, por ejemplo. Pero ahora, si es otra columna que no sea Q, tengo un mensaje de error 1004 La método AutoFill de la clase Range ha fallado

      Aquí está el código base

      Range("Q1").Select
      ActiveCell.FormulaR1C1 = "Presente lista actual"
      Range("Q2").Select
      ActiveCell.FormulaR1C1 = "Sí"
      Range("Q2").Select
      Selection.AutoFill Destination:=Range("Q2:Q11606"


      Pero ahora es posible que ya no esté en la columna Q, sino en R/S/T/AA, etc. Entonces, no hay problema para enviarlo hasta abajo (gracias a ti, por cierto), pero si el código
      y = Range("C1").End(xlToRight).Column
      Cells(1,y).Select
      Me devuelve en la columna AB, por ejemplo, la celda de abajo debe inscribir la fórmula IERREUR(RECHERCHEV y enviarla hasta la última fila llena, pero no sé qué columna es, ya que es un incógnita y está vinculada al comando anterior y, en efecto, necesitaría que el código de abajo no seleccione Q, sino AB. ¿Es posible?

      No estoy siendo muy claro, aquí están los dos ejemplos de códigos

      Código que estamos reeditando y para el cual Destination:=Range("?& derligne) es desconocido

      'Variable para seleccionar la última columna hacia la derecha
      y = Range("n1").End(xlToRight).Column + 1
      Cells(1, y).Select
      ActiveCell.FormulaR1C1 = "Presente lista actual"
      ActiveCell.Offset(1, 0).Select
      ActiveCell.FormulaR1C1 = "Sí"
      'Variable derligne = Envía la fórmula hasta la última línea llena de la columna D
      derligne = Range("D" & Rows.Count).End(xlUp).Row
      'Enviar el Sí hasta la última línea
      Selection.AutoFill Destination:=Range("Q2:Q" & derligne)


      Código con el grabador

      Range("Q1").Select
      ActiveCell.FormulaR1C1 = "Presente lista actual"
      Range("Q2").Select
      ActiveCell.FormulaR1C1 = "Sí"
      Range("Q2").Select
      Selection.AutoFill Destination:=Range("Q2:Q11606")
      Range("Q2:Q11606").Select


      Gracias por tu ayuda,

      Buenas noches

      Amistosamente
      0
  3. via55 Mensajes publicados 14393 Fecha de registro   Estado Miembro Última intervención   2 759
     
    Buenas noches

    Es cierto que no está claro
    ¿Por qué hablas de agregar el código cada vez?
    Si está al principio de la macro, cada vez que ejecutas la macro, la última columna vacía se determina por y = Range("C1").End(xlToRight).Column +1
    Luego seleccionas esta celda con Cells(1,y).Select
    Puedes escribir en ella: Cells(1,y) = "texto a escribir"
    Si quieres escribir después en la celda vacía a la derecha de esta última, no es necesario volver a buscar la última columna vacía; simplemente toma la celda Cells(1,y+1)

    En cuanto al segundo punto, tu última línea de código debe ser
    Selection.AutoFill Destination:=Range(Cells(1, y), Cells(derligne, y))

    Saludos
    Via

    --
    "La imaginación es más importante que el conocimiento."    A. Einstein
    1
    1. Jerome
       

      Hola Via,

      Sí, me di cuenta al releer :-D, pero me entendiste. Espero poder ser más claro, es para mi comprensión, ya que más allá de lograrlo contigo, quiero entender y mejorar :-)

      De hecho, pensaba que el código y= Range("C1").End(xlToRight).Column +1 asociado a Cells(1,y).Select me llevaría cada vez a la nueva columna vacía y la seleccionaría, sin importar cuántas veces repitiera el código en la macro, pero al hacer la prueba, siempre seleccionaba la misma celda y modificaba el nombre en lugar de ponerlo en la de al lado.

      Ejemplo,

          y = Range("C1").End(xlToRight).Column + 1
          Cells(1, y).Select       

      'En este ejemplo, imaginemos que nos selecciona la columna E1 que es la primera vacía
          Cells(1, y) = "texto a escribir"
          Cells(1, y).Select       

      'Esta vez, a partir de ahí, debería haber seleccionado la F1 que ahora es la primera vacía, pero me selecciona E1 y reemplaza el "texto a escribir" por "texto a escribir 2" con el siguiente comando     
          Cells(1, y) = "texto a escribir 2"

          Cells(1, y).Select       

      'Esta vez, a partir de ahí, debería haber seleccionado la G1 que ahora es la primera vacía, pero me selecciona E1 y reemplaza el "texto a escribir 2" por "texto a escribir 3" con el siguiente comando     
          Cells(1, y) = "texto a escribir 3"

      Pero por lo tanto, no está bien, pero al realizar este mismo código, pero añadiendo el código y= Range("C1").End(xlToRight).Column +1 cada vez delante, seleccionaba la celda correcta.

      Ejemplo

          y = Range("C1").End(xlToRight).Column + 1

          Cells(1, y).Select              

      'En este ejemplo, imaginemos que nos selecciona la columna E1 que es la primera vacía
          Cells(1, y) = "texto a escribir"

          y = Range("C1").End(xlToRight).Column + 1
          Cells(1, y).Select             

      'En este ejemplo, nos selecciona F1
          Cells(1, y) = "texto a escribir 2"

          y = Range("C1").End(xlToRight).Column + 1 

          Cells(1, y).Select             

      'En este ejemplo, nos selecciona G1
          Cells(1, y) = "texto a escribir 3"

      Y con tu respuesta puedo simplemente hacer este código que también funciona

          y = Range("C1").End(xlToRight).Column + 1
          Cells(1, y).Select
          Cells(1, y) = "texto a escribir"
          Cells(1, y + 1).Select
          Cells(1, y + 1) = "texto a escribir 2"
          Cells(1, y + 2).Select
          Cells(1, y + 2) = "texto a escribir 3"

      Para el segundo punto, un gran gracias una vez más :-)

      Sin embargo, cuando lo realicé, no funcionó. Recibí un mensaje de error 1004: El método AutoFill de la clase Range ha fallado.

      ¿Sabes qué hice mal?

      'Variable derligne = Enviar la fórmula hasta la última fila llenada de la columna D
          derligne = Range("D" & Rows.Count).End(xlUp).Row
      'Enviar el Sí hasta la última fila
          Selection.AutoFill Destination:=Range(Cells(1, y), Cells(derligne, y))

      Gracias por tu ayuda,

      Saludos

      Jérôme

      0
  4. via55 Mensajes publicados 14393 Fecha de registro   Estado Miembro Última intervención   2 759
     

    Re

    Las referencias en RC se hacen en relación con la celda donde se ingresó la fórmula

    Debes situarte en principio en la columna R, por lo que N es la 4ª columna antes (-4), M es la 5ª antes (-5) y T es la 2ª después (2)

    Pero también puedes utilizar las referencias habituales en VBA así:

    ActiveCell.Formula = _
            "=IFERROR(VLOOKUP(Range("N2"),SHEETS("IEP S-1").RANGE("M:T"),4,0),""No"")"

    Saludos

    Via


    1
    1. Jerome
       

      Hola Via,

      Muchas gracias por estas precisiones. Sin embargo, cuando utilizo las siguientes referencias la línea se muestra en rojo y no veo cuál es el problema.

      ActiveCell.Formula = _
              "=IFERROR(VLOOKUP(Range("N2"),SHEETS("IEP S-1").RANGE("M:T"),4,0),""No"")"

      Gracias por tu ayuda,

      Con cariño

      Jérôme

      0
  5. via55 Mensajes publicados 14393 Fecha de registro   Estado Miembro Última intervención   2 759
     

    El problema es que había escrito cualquier cosa, me confundí entre las instrucciones de Sheets y Range que hay que poner en una línea de macro, ¡pero que no aparecen en la fórmula para una celda!

    La forma correcta es: ActiveCell.Formula = "=IFERROR(VLOOKUP(N2,'IEP S-1'!M:T,4,0),""no"")"

    Atentamente

    Via


    1
    1. Jerome
       

      ¡Muuuuuuuchas gracias, es muy amable!

      Amistosamente

      Jérôme

      0
    2. Jerome
       

      Hola Via,

      Me permito una vez más recurrir a ti. He realizado un TCD cuya fuente es mi hoja IEP. Como me enseñaste, para obtener la última fila creé un DIM LIEP que añadí en el rango de mi TCD ("IEP!$A$1:$S$" & LIEP, Version:=6).CreatePivotTable TableDestination:= _) pero ahora también necesito la misma orden hacia la derecha.

      Aquí está la orden del grabador

      Range("A1").Select
      ' parece innecesario    Application.CutCopyMode = False
          ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
              "IEP!R1C2:R11500C21", Version:=6).CreatePivotTable TableDestination:= _
              "TCD!R1C1", TableName:="Tabla dinámica1", DefaultVersion:=6

      '

      He hecho intentos que han fallado. La variable parece no estar bloqueada, pero ¿es correcta? y sobre todo se bloquea cuando escribí

      "IEP!$B:CIEP" & LIEP, Version:=6).CreatePivotTable TableDestination

      '

      'Variable última fila llena de la hoja IEP de la columna B
          DLIEP = Sheets("IEP").Columns(2).Find("*", , , , xlByColumns, xlPrevious).Row

      'variable última columna llena
          CIEP = Sheets("IEP").Columns(2).Find("*", , , , xlByColumns, xlPrevious).Column

      Range("A1").Select   

      ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _

              "IEP!$B:CIEP" & LIEP, Version:=6).CreatePivotTable TableDestination:= _
              "TCD!R1C1", TableName:="Tabla dinámica1", DefaultVersion:=6

      Gracias por tu ayuda

      Muy buena tarde,

      Jérôme

      0
  6. via55 Mensajes publicados 14393 Fecha de registro   Estado Miembro Última intervención   2 759
     

    Buenas noches Jérôme

    1) Escribe tu código de la siguiente manera:

     ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _ "IEP!R1C2:R" & DLIEP & "C" & CIEP, Version:=6).CreatePivotTable TableDestination:= _ "TCD!R1C1", TableName:="Tabla dinámica1", DefaultVersion:=6

    2) Para la última columna el código es:

     CIEP = Sheets("IEP").Rows(2).Find("*", , , , xlByColumns, xlPrevious).Column

    Cdmnt

    Vía


    1
    1. Jerome
       

      Hola Via,

      '

      Genial, ¡muchas gracias! Al realizarlo, tengo algunas pequeñas preguntas. De hecho, un poco más arriba en mi macro, elimino duplicados.

      '

      'Seleccionar la columna N (13ª columna) entre B y Q y eliminar duplicados
          Columns("N:N").Select
      'Variable de la última fila llena de la hoja IEP en la columna B
          DLIEP = Sheets("IEP").Columns(2).Find("*", , , , xlByColumns, xlPrevious).Row
      'Eliminar duplicados hasta la última fila
          ActiveSheet.Range("$B$1:$Q$" & DLIEP).RemoveDuplicates Columns:=13, Header:= _
              xlYes

      '

      Sin embargo, cuando selecciona mi rango para mi TCD, toma el rango hasta la última fila eliminada y, por lo tanto, filas vacías.

      Ejemplo: tengo 11605 filas al principio y después de eliminar los duplicados tengo 11500. Sin embargo, en el rango del TCD, busca los datos hasta la fila 11605 (IEP!$B$1:$U$11605). ¿Sabes por qué y cómo hacer para que solo tome hasta la 11500?

      '

      También tendría tres preguntas sobre la comprensión del comando "IEP!R1C2:R" & DLIEP & "C" & CIEP

      R1C2 = ¿qué es?

      R = ¿Por qué R, a qué se refiere?

      C = ¿Por qué "C", a qué se refiere?

      '

      Muchas gracias por tu ayuda

      Saludos cordiales

      Jérôme

      0
      1. Jerome > Jerome
         

        Hola de nuevo Via,

        Tengo otra pregunta, tengo una hoja de Excel en la que necesito tener 5 tablas dinámicas. Debo colocarlas en diferentes lugares de la hoja.

        La primera se encuentra en A1 hasta su final.

        Cells(1, 1).Select

        'TDC1

        'Variable última fila llena de la pestaña TDC de la 1ª tabla dinámica de la columna A

            DLTDC = Sheets("TDC").Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row

        La segunda está debajo de 9 filas.

        ' TDC2

            HTDC2 = Cells(DLTDC + 9, 1).Select

        'variable última columna llena de la pestaña TDC de la TDC1

            CTDC = Sheets("TDC").Rows(1).Find("*", , , , xlByColumns, xlPrevious).Column

        La tercera está a la derecha de la primera (3 columnas más), así que E.

        ‘TDC3

        'Selecciona la tercera celda vacía a la derecha después de la TDC1.

            HTDC3 = Cells(1, CTDC + 3).Select

        Y la cuarta se supone que está 5 filas debajo de la TDC3, pero el código a continuación no funciona. ¿Sabes por qué?

        'Variable última fila llena de la pestaña TDC de la TDC3 de la columna E

            DLTDC3 = Sheets("TDC").Columns(5).Find("*", , , , xlByColumns, xlPrevious).Row

        'Selecciona la quinta celda vacía debajo de la TDC 3.

        ‘TDC4

            HTDC4 = Cells(DLTDC3 + 5, 1).Select

        Gracias por tu ayuda,

        Amistosamente

        Jérôme

        0
  7. via55 Mensajes publicados 14393 Fecha de registro   Estado Miembro Última intervención   2 759
     

    Como te decía, no puedo decir nada más sin tener tu archivo a mano

    Sube tu archivo a cjoint.com, genera un enlace que copies y vuelve a pegar aquí


    1
    1. Jerome
       

      Re,

      Sí, entiendo, gracias por tu ayuda.

      Aquí está el enlace: https://www.cjoint.com/c/LGoxgf86VeN

      Buenas noches

      Amistosamente

      Jérôme

      0
  8. via55 Mensajes publicados 14393 Fecha de registro   Estado Miembro Última intervención   2 759
     

    Hola Jérôme

    HTCD4 = Cells(DLTCD3 + 5, 1).Select  Selecciona la primera columna, así que hay un error porque se pega en una tabla ya existente

    Sería más bien HTCD4 = Cells(DLTCD3 + 5, 5).Select

    Luego las filas

     Selection.End(xlToRight).Select Range(Selection, Selection.End(xlDown)).Select Range(Selection, Selection.End(xlDown)).Select Range(Selection, Selection.End(xlDown)).Select Range(Selection, Selection.End(xlToRight)).Select Application.CutCopyMode = False Selection.Copy Range("E1").Select Selection.End(xlDown).Select Selection.End(xlDown).Select Selection.End(xlDown).Select Range("E27").Select

    No veo a qué corresponden y creo que deben ser eliminadas

    Otros errores ocurren después en la macro que creo que provienen de una grabación que arreglaste

    Si estuviera en tu lugar, eliminaría toda la parte final de la macro después de este último TCD y después de asegurarme de que todo funciona hasta ahí, retomaría tranquilamente a partir de ahí (grabando las manipulaciones necesarias si hace falta) y paso a paso para finalizar una macro que funcionará

    Buen ánimo

    Atentamente

    Via


    1
  9. via55 Mensajes publicados 14393 Fecha de registro   Estado Miembro Última intervención   2 759
     

    Re

    Es bien la forma de la primera fórmula la correcta, pero es un sin sentido porque la variable ESG se utiliza tanto para la fila como para la columna

        Selection.AutoFill Destination:=Range(Cells(ESG, 5), Cells(derligneSuiviG, ESG))

    Rectifica tu fórmula así

        Selection.AutoFill Destination:=Range(Cells(ESG, 5), Cells(derligneSuiviG, 5))

    Saludos

    Via


    1
  10. via55 Mensajes publicados 14393 Fecha de registro   Estado Miembro Última intervención   2 759
     

    Hola

    Aparentemente R29C9 se refiere a la fila 29 de la columna 9, no sé a qué corresponde eso en tu archivo, pero puedes modificar las referencias con variables en lugar de la fila y de la columna

    por ejemplo con LTCD para la primera fila de tu TCD y CTCD para su columna:

    ActiveCell.FormulaR1C1 = "=GETPIVOTDATA(""IEP - Venue/Passage""," & "TCD!R" & LTCD & "C" & CTCD & " )"

    Saludos

    Via


    1
  11. via55 Mensajes publicados 14393 Fecha de registro   Estado Miembro Última intervención   2 759
     

    CTCD5 = Sheets("TCD").Rows(1).Find("*", , , , xlByColumns, xlPrevious).Column te da la última columna, tú necesitas la 1ra del TCD5 pero esta columna probablemente siempre sea la misma, así que probablemente puedas poner el número de forma fija en la macro

    por ejemplo, ActiveCell.FormulaR1C1 = "=GETPIVOTDATA(""IEP - Venue/Passage""," & "TCD!R" & HTCD5 & "C9" & " )" si es la columna 9

    ¿por qué no puedo usar HTCD5 tanto en columna como en fila?

    porque la columna no es la misma que la fila!! la variable HTCD5 debe dar 29 mientras que la columna es 9


    1
  12. via55 Mensajes publicados 14393 Fecha de registro   Estado Miembro Última intervención   2 759
     

    Hola

    Después de la instrucción Cells(1, y + 2) = "texto a escribir 3", estamos posicionados en la columna y+2, por lo que Selection.AutoFill Destination:=Range(Cells(1, y), Cells(derligne, y)) devuelve un error, ya que indicas en esta segunda instrucción y como columna de inicio.

    O deseas realmente rellenar la columna y y tienes que volver primero a esta columna con un Select.Cells(1,y), o deseas rellenar la columna y +2 y tienes que codificar el AutoFill en consecuencia: Selection.AutoFill Destination:=Range(Cells(1, y + 2), Cells(derligne, y + 2)).

    Saludos

    Vía


    0
    1. Jerome
       

      Hola Via,

      Gracias +++ por tu ayuda. Ok creo que entiendo (disculpa, necesito entender bien la mecánica VBA, que aún no he adquirido), pero en resumidas cuentas, para mi comando  Selection.AutoFill Destination:=Range(Cells(1, y), Cells(derligne, y)) se trata de la fila debajo de y en este caso

      Aquí está el código que fallaba

      'Variable para seleccionar la última columna hacia la derecha
          y = Range("n1").End(xlToRight).Column + 1
          Cells(1, y).Select
          ActiveCell.FormulaR1C1 = "Presente lista actual"
      'Seleccionar la celda debajo del comando anterior y poner "Sí"
          ActiveCell.Offset(1, 0).Select
          ActiveCell.FormulaR1C1 = "Sí"
      'Variable derligne = Envía la fórmula hasta la última fila llena de la columna D
          derligne = Range("D" & Rows.Count).End(xlUp).Row
      'Enviar el Sí hasta la última fila
          Selection.AutoFill Destination:=Range(Cells(1, y), Cells(derligne, y))

      Y entonces, ¿aquí está el código que debo componer?

      'Variable para seleccionar la última columna hacia la derecha
          y = Range("n1").End(xlToRight).Column + 1
          Cells(1, y).Select
          ActiveCell.FormulaR1C1 = "Presente lista actual"
      'Seleccionar la celda debajo del comando anterior y poner "Sí"
          ActiveCell.Offset(1, 0).Select
          ActiveCell.FormulaR1C1 = "Sí"
      'Variable derligne = Envía la fórmula hasta la última fila llena de la columna D
          derligne = Range("D" & Rows.Count).End(xlUp).Row
      'Enviar el Sí hasta la última fila
          Selection.AutoFill Destination:=Range(Cells(2, y), Cells(derligne, y))

      ¿Es correcto? Después de una prueba parece estar funcionando

      Aprovecho para hacerte una nueva pregunta, al realizar la fórmula de abajo (Con y Sin los $), entiendo fácilmente la lógica de mi fórmula en ofimática porque las columnas están identificadas, pero en VBA, no entiendo la lógica para determinar las celdas "RC[-4]" que corresponde a N2 o "C[-5]:C[2]" que corresponde a M:T. Sin embargo, creo que con los $ he entendido que M=13ª columna y T la 20ª.

      Sin los $

      =SIERROR(REFERENCIA(N2;'IEP S-1'!M:T;4;0);"No")

      ActiveCell.FormulaR1C1 = _
              "=IFERROR(VLOOKUP(RC[-4],'IEP S-1'!C[-5]:C[2],4,0),""No"")"

      Con los $

      =SIERROR(REFERENCIA(N2;'IEP S-1'!$M:$T;4;0);"No")

       ActiveCell.FormulaR1C1 = _
              "=IFERROR(VLOOKUP(RC[-4],'IEP S-1'!C13:C20,4,0),""No"")"

      Gracias +++

      Amistosamente

      Jérôme

      0
  13. via55 Mensajes publicados 14393 Fecha de registro   Estado Miembro Última intervención   2 759
     

    Hola,

    1) Si utilizas la misma variable DLIEP para el TCD, como esta variable contiene el nº de la última línea antes de la eliminación de duplicados, es normal que siempre tome la totalidad de las líneas. Después de la eliminación de duplicados y antes del TCD, hay que recalcular la última línea no vacía con

    DLIEP = Sheets("IEP").Columns(2).Find("*", , , , xlByColumns, xlPrevious).Row

    2) R1C2 = FILA1 COLUMNA2, es decir, fila 1 columna 2 o también B1

    3) En cuanto a la colocación de tus TCD, tus instrucciones a priori parecen correctas; es imposible decirte qué está mal sin tu archivo completo con su macro

    ¿Qué es lo que no funciona? ¿La colocación no es correcta? ¿El cálculo de la última línea no vacía no se realiza? ..

    ¿Qué valor se indica para DLTCD3 cuando pasas el ratón por encima en el código después de parar?

    Saludos

    Via


    0
    1. Jerome
       

      Re,

      Gracias +++, bueno, aunque sabes de qué hablas, confirmo que para el punto 1 funciona bien :-) gracias

      '

      Gracias por la explicación del punto 2.

      '

      Para el punto 3

      TCD1 = A1:B30

      TCD2 = A39:B68

      TCD3= E1:F12

      TCD4= En error selecciona A17

      ¿Qué no funciona? ¿No está bien el posicionamiento? Es eso, en lugar de seleccionar E+5 filas debajo del TCD3, selecciona A17

      ¿El cálculo de la última línea no vacía no se realiza? .. Visiblemente tampoco, ya que no parece dirigirse debajo del TCD3

      Gracias por tu ayuda,

      Amistosamente

      Jérôme

      0
  14. Jerome
     

    Hola Via,

    Muy bien y gracias por tu ayuda. En realidad, al principio y a través del grabador creaba el TCD1, luego copiaba/pegaba el TCD1 para hacer mi TCD2 y añadía lo que quería. Para el TCD3, lo mismo, copiaba/pegaba el TCD1 y hacía mi TCD3.

    Sin embargo, para el TCD4, copiaba el TCD3. Pero el TCD3 tiene dos filtros y, por lo tanto, para seleccionarlo a través del grabador seleccioné la celda E1 (Nombre del filtro1) y luego hice (Shift + ctrl + flecha abajo) una primera vez y eso seleccionó el segundo filtro, volví a hacer (Shift + ctrl + flecha abajo) lo que me llevó a la parte superior de mi TCD3 y lo hice una última vez, lo que me permitió llegar al final. Luego lo hice hacia la derecha (Shift + ctrl + flecha derecha), lo que me permitió seleccionar todo el TCD3 y pude copiarlo.

    Aquí está el código con el grabador

    Range("E1").Select
        Range(Selection, Selection.End(xlDown)).Select
        Range(Selection, Selection.End(xlDown)).Select
        Range(Selection, Selection.End(xlDown)).Select
        Range(Selection, Selection.End(xlToRight)).Select
        Application.CutCopyMode = False
        Selection.Copy
        Range("E1").Select
        Selection.End(xlDown).Select
        Selection.End(xlDown).Select
        Selection.End(xlDown).Select
        Range("E27").Select
        ActiveSheet.Paste

    El problema es que en VBA no he podido seleccionar el TCD3 para copiarlo.

    He probado los siguientes comandos, pero no funcionaron. ¿Sabes cómo puedo copiar mi TCD3 que tiene dos filtros?

    Range("HTCD3").currentregion.Select ==> que solo me selecciona los dos filtros

    y

    HTCD3 = Cells(1, CTCD + 3).End(xlUp).End(xlToRight).Select que es erróneo

    Una vez más gracias por tu ayuda,

    Un saludo

    Jérôme

    0
  15. via55 Mensajes publicados 14393 Fecha de registro   Estado Miembro Última intervención   2 759
     

    ¡Ahora no sé!

    Pero cuando no se puede tomar la derecha, se toma la izquierda.

    En tu lugar, seguiría en mi macro copiando el TCD1 y lo pegaría en el lugar correspondiente con la instrucción ahora rectificada.

    Luego, al volver a la tabla y al guardar, haría todas las manipulaciones necesarias para adaptarlo según lo que quiera como filtro y demás, y luego integraría el registro en mi macro.


    0
  16. Jerome
     

    No hay problema y, francamente, muchas gracias por toda tu ayuda y la rapidez de tus respuestas.

    De hecho, siempre voy a partir de mi TCD1 :-)

    Otra vez, gracias

    Un cordial saludo

    Jérôme

    0
  17. Jerome
     

    Hola Via,

    Lo siento por molestarte una vez más, pero de nuevo necesito tu ayuda. En mi pestaña de seguimiento global, tengo que extraer una fórmula (columna E) de la última celda rellenada a la de abajo. Quería encontrar la primera línea vacía (o debería ser mi "nueva" fórmula)

    '''Variable para seleccionar la primera línea vacía (pestaña Seguimiento global) columna E

           ESG = Range("E3").End(xlDown).Row +1

    Luego quería enviarla hasta la última celda rellenada de la columna D (que justo tiene una más rellenada)

    '''Variable derligneSuiviG = Envía la fórmula hasta la última línea rellenada de la columna D

        derligneSuiviG = Range("D" & Rows.Count).End(xlUp).Row

    Después seleccioné la celda deseada

    Cells(ESG, 5).Select

    Y traté de enviar mi celda con las propuestas a continuación pero no funcionó.

        Selection.AutoFill Destination:=Range(Cells(ESG, 5), Cells(derligneSuiviG, ESG))

        Selection.AutoFill Destination:=Range(Cells(derligneSuiviG, 5))

        Selection.AutoFill Destination:=Range(Cells(derligneSuiviG, ESG))

    También intenté esto

        ESG = Range("E3").End(xlDown).Row
        Cells(ESG + 1, 5).Select
        Selection.AutoFill Destination:=Range(Cells(ESG, derligneSuiviG))

    Y igual no funcionó. ¿Sabes qué ejecuté mal?

    Gracias por tu ayuda,

    Amistosamente

    Jérôme

    0
  18. Jerome
     

    Hola Via,

    Muchas gracias, he buscado, buscado, para no molestarte, pero al final no tuve otra opción. Funciona perfectamente. He entendido un poco el principio, pero todavía tengo dificultades y siempre termino bloqueándome en un elemento.

    Aprovecho para hacerte otra pregunta si no te importa. Tengo un comando que busca los resultados de los TCD1/TCD3/TCD5 y los refleja en mi tabla de la pestaña seguimiento global.

    El grabador me escribió este comando: ActiveCell.FormulaR1C1 = "=GETPIVOTDATA(""IEP - Venue/Passage"",TCD!R29C9)"

    ¡Funciona muy bien! Mi única preocupación es que los TCD son cambiantes dependiendo de los resultados y pueden ser más o menos largos y si fuera más largo que lo calculado y comenzara, por ejemplo, en la línea 35, me enviaría un error. ¿Crees que sería posible reemplazar TDC!R29C9 por mi HTCD5 que corresponde a la primera celda del TCD5?

    Gracias por tu ayuda,

    Amigablemente

    Jérôme

    0
  19. Jerome
     

    Re,

    Sí, eso es, la línea 29 de la columna 9 que corresponde a mi TCD5.

    Así que, la única variable que tengo del TCD5 es esta

    'Variable Altura TCD5 - Seleccionar la segunda celda vacía a la derecha del TCD 4
        HTCD5 = Cells(DLTCD3 + 9, 9).Select

    Intenté poner esta variable para las columnas (exactamente la del TCD1), pero no entiendo qué elemento debo modificar para adaptarla al TCD5

    '''variable última columna llena de la pestaña TCD del TCD5
        CTCD5 = Sheets("TCD").Rows(1).Find("*", , , , xlByColumns, xlPrevious).Column

    y terminar con esta orden que no funcionó:

    ActiveCell.FormulaR1C1 = "=GETPIVOTDATA(""IEP - Venue/Passage""," & "TCD!R" & HTCD5 & "C" & CTCD5 & " )"

    Y una segunda pregunta, necesito registrar la fecha de hoy + texto al lado.

    Hice la fórmula

    ActiveCell.FormulaR1C1 = "=TODAY()& "" test""""

    Para copiar/pegar como valor, pero la fecha se muestra como código 44759 incluso cuando la pongo en formato de fecha. ¿Sabrías cómo hacerlo?

    Gracias por tu ayuda,

    Amistosamente

    Jérôme

    0
  20. via55 Mensajes publicados 14393 Fecha de registro   Estado Miembro Última intervención   2 759
     

    Como entiendo, la celda en la fila 29 y columna 9 debe ser la primera en la parte superior izquierda del TCD

    HTCD5 no es un número de fila, es la selección de una celda

    sin embargo, CTCD5 sí devuelve un número de columna, pero no es la primera del TCD5

    Necesitas determinar la primera fila y la primera columna de tu TCD5 mediante fórmulas

    HTCD5 = ..... y CTCD5=.....

    A continuación, para verificar que los valores devueltos son correctos, para probar (quitarás esta línea después) pones MsgBox HTCD5 & " " & CTCD5

    Cuando hayas determinado los valores correctos, la fórmula GETPIVOTDATA... debería funcionar


    Saludos

    Vía


    0
  • 1
  • 2