Eliminación de filas según una fecha

fortbelin Mensajes publicados 22 Estado Miembro -  
fortbelin Mensajes publicados 22 Estado Miembro -
Hola,

Hola a todos y a todas.

Necesito su ayuda para una macro.

Se trata de poder eliminar filas de una hoja de Excel, pero solo si una celda de esa fila contiene una fecha que es anterior a una fecha de referencia.

Por ejemplo, eliminar todas las filas que contienen fechas anteriores al 25/12/2002.

Muchas gracias por su ayuda.

Configuración: Windows XP / Safari 535.1

10 respuestas

  1. Heremion Mensajes publicados 564 Estado Miembro 102
     
    En este caso:

    Private Sub CommandButton1_Click() Dim currentd As Date Dim refdate As Date Dim i, imax refdate = Range("A1").Value imax = Range("A65536").End(xlUp).Row For i = IndiceLigneDeTaPlageDeDate To imax + 1 If (Range("A" & i).Value < refdate) And (Range("A" & i).Value <> "") Then Range("A" & i).EntireRow.Delete i = i - 1 End If Next i End Sub


    donde tu fecha de referencia está en A1, y tu rango de datos está en la columna A, pero puedes adaptarlo. Si tus fechas están en la línea G, reemplaza Range("A65536") por Range("G65536"), y los "A" & i por "G" & i.

    Ahí lo tienes.

    --
    Siempre hay que pensar en aceptar un post que te saque de un apuro.
    1
    1. chossette9 Mensajes publicados 6855 Fecha de registro   Estado Colaborador Última intervención   1 313
       
      Hola,

      tu macro no es correcta: cuando eliminamos filas, no empezamos de la primera a la última, sino de la última a la primera.

      De hecho, supongamos que debemos eliminar la fila 4 y 5. Al partir de la primera fila, vamos a eliminar la 4ª. La 5ª se convierte en la 4ª, y la 6ª se convierte en la 5ª. Continuamos con el código y en el bucle, llegamos a la 5ª fila (que era la 6ª), esta fila no se debe eliminar. Entonces, hemos perdido la fila nº 5...

      En el otro sentido, partimos de la última, eliminamos la 5ª, la 4ª sigue siendo la 4ª. Entramos en el bucle y eliminamos la 4ª.

      Por lo tanto, es mejor hacer
      For i = Imax+1 to IndiceLigneDeTaPalgeDeDate Step -1


      Atentamente.
      0
    2. Heremion Mensajes publicados 564 Estado Miembro 102
       
      No necesariamente, ya que decrezco en el caso de que elimine, lo que hace que permanezcamos en la misma línea. Así que, no hay olvidos, pero puedes hacerlo efectivamente en el otro sentido, ya que no habría necesidad de decrecer :)
      0
    3. chossette9 Mensajes publicados 6855 Fecha de registro   Estado Colaborador Última intervención   1 313
       
      Oops, lo siento, leí demasiado rápido ^^

      Pero, dado que tu imax no cambia y eliminas líneas, en algún momento probarás líneas vacías ;)
      0
    4. Heremion Mensajes publicados 564 Estado Miembro 102
       
      de donde el test
      (Range("A" & i).Value <> "")

      has leído demasiado rápido mi pequeño calcetín :D
      0
    5. chossette9 Mensajes publicados 6855 Fecha de registro   Estado Colaborador Última intervención   1 313
       
      Sí, pero aún así vas a cerrar. Ciertamente será muy rápido, pero aún así vas a cerrar en estas líneas vacías.

      Es solo por ser quisquilloso y para optimizar al máximo el código.
      0
  2. Heremion Mensajes publicados 564 Estado Miembro 102
     
    Hola Fortbelin,

    "Si una celda de la línea...", ¿te refieres a una celda, cualquiera, o a una celda bien precisa?

    --
    Siempre hay que pensar en aceptar un cargo que te saque del apuro.
    0
  3. fortbelin Mensajes publicados 22 Estado Miembro
     
    Hola,

    se trata más bien de una celda muy precisa porque tengo una columna de fecha en mi hoja de excel.

    Entonces, en realidad, si mi columna de fecha está en G, por ejemplo, la macro elimina todas las filas que tienen en la columna G una fecha anterior a una fecha de referencia.

    Muchas gracias
    0
  4. fortbelin Mensajes publicados 22 Estado Miembro
     
    Muchas gracias, intentaré

    ¿Tendría lo mismo pero en función de una lista de nombres?

    Ejemplo, eliminar las líneas que contengan pierre o paul o jean ....

    Gracias

    Christophe
    0
  5. fortbelin Mensajes publicados 22 Estado Miembro
     
    Soy yo otra vez

    Lo siento, pero esto no funciona o soy yo quien no hace lo que debería

    ¿Hay que poner el código en un módulo?

    Private Sub CommandButton1_Click()
    Dim currentd As Date
    Dim refdate As Date
    Dim i, imax

    refdate = Range("C1").Value
    imax = Range("C65536").End(xlUp).Row

    For i = IndiceLigneDeTaPlageDeDate To imax + 1
    If (Range("C" & i).Value < refdate) And (Range("C" & i).Value <> "") Then
    Range("C" & i).EntireRow.Delete
    i = i - 1
    End If
    Next i
    End Sub

    gracias
    0
    1. chossette9 Mensajes publicados 6855 Fecha de registro   Estado Colaborador Última intervención   1 313
       
      ¿No sería mejor reemplazar IndiceLigneDeTaPalgeDeDate por un valor?

      Por ejemplo, 1 si comienzas en la primera línea, 2 si comienzas en la segunda...
      0
    2. Heremion Mensajes publicados 564 Estado Miembro 102
       
      Sí, he puesto eso para que lo reemplaces. Si tu rango de datos empieza en la línea 2, pones 2 :) y no es necesario poner esto en un módulo, con un botón es suficiente :)
      0
  6. fortbelin Mensajes publicados 22 Estado Miembro
     
    Muchas gracias,
    eso funciona.

    Lo siento, pero no soy un especialista.
    0
    1. chossette9 Mensajes publicados 6855 Fecha de registro   Estado Colaborador Última intervención   1 313
       
      Ningún problema, pero hay muchos tutoriales en internet o libros bastante completos en librerías sobre VBA, así que no dudes en consultar la red para encontrar cómo realizar macros en VBA.

      Personalmente, te aconsejaría que vayas al sitio de las ediciones First (editor de la serie "para dummies").

      Atentamente.
      0
  7. fortbelin Mensajes publicados 22 Estado Miembro
     
    ¿Tendrías alguna idea para hacer lo mismo con una lista de nombres?

    Gracias
    0
  8. fortbelin Mensajes publicados 22 Estado Miembro
     
    Muchas gracias, intentaré ponerme al tanto del tema, pero por el momento realmente no tengo tiempo.

    Me lo piden en mi trabajo...
    0
  9. Heremion Mensajes publicados 564 Estado Miembro 102
     
    De la misma manera.
    Suponiendo que los nombres a eliminar estén en la columna A a partir de la fila 2 en tu primera hoja y tu lista de nombres general en la columna A fila 2 de tu segunda hoja:

    Private Sub CommandButton1_Click() Dim i1, i2 Dim imaxOne Dim imaxTwo imaxOne = Worksheets(1).Range("A65536").End(xlUp).Row imaxTwo = Worksheets(2).Range("A65536").End(xlUp).Row For i1 = 2 To imaxOne For i2 = 2 To imaxTwo If Worksheets(1).Range("A" & i1).Value = Worksheets(2).Range("A" & i2).Value Then Worksheets(2).Range("A" & i2).EntireRow.Delete i2 = i2 - 1 imaxTwo = imaxTwo - 1 End If Next i2 Next i1 End Sub 

    --
    Siempre hay que pensar en aceptar una publicación que te saque del apuro.
    0
  10. fortbelin Mensajes publicados 22 Estado Miembro
     
    MUCHAS GRACIAS
    ESTÁ GENIAL
    0