INSERTAR FILAS INTERCALADAS EN BLANCO EN EXCEL

Cuando empezamos a trabajar con Excel, una de las situaciones más comunes con la que nos encontramos es la de insertar filas en blanco en nuestros archivos. Esto no es un problema cuando contamos con poca cantidad de datos, pero la realidad suele complicar las cosas y nos podemos encontrar con que esos datos pueden ser miles de filas, y sería realmente lento (además de aburrido) el tener que insertar 1 o varias filas en blanco por cada fila con datos (por ejemplo) en un archivo de 4.000 filas.

Ante esta problemática, ¿cómo resolvemos el problema?. Vamos a poner un ejemplo que nos ayude a dar mayor claridad al post. Imaginad que tenéis una base de datos en la que tenéis los datos de facturación por horas y días de una empresa, algo así:

INSERTAR FILAS INTERCALADAS EN BLANCO EN EXCEL

Con estos información, ahora tenemos que intercalar una fila en blanco por cada una de las filas con datos. Para realizar el trabajo de forma automática vamos a utilizar la siguiente macro:

Sub Insertar_filas()
'Definimos variables
Dim tTop, rFila, i, j As Double
'Buscamos el número de columna en el que estamos
nColum = ActiveCell.Column
'Buscamos la letra de la columna en la que estamos
lColum = Split(ActiveCell.Address, "$")(1)
'Determinamos el rango para definir la longitud del bucle for-next
Rango = lColum & ":" & lColum
'Indicamos el número de línea sobre el que comenzamos a añadir filas en blanco
tTop = 3
'Indicamos el número de filas en blanco a incluir
rFila = 1
fin = Application.CountA(ActiveSheet.Range(Rango))
For j = 2 To fin
'Si la primera celda (en este caso la 3) contiene un valor, entonces comenzamos a insertar filas
'intercaladas
If Not IsEmpty(Cells(tTop, nColum)) Then
For i = 1 To rFila
Cells(tTop, nColum).EntireRow.Insert
Next i
tTop = tTop + rFila + 1
End If
Next j
End Sub

Esta macro está diseñada para que las filas en blanco se agreguen en la en la columna sobre la que se encuentra la celda activa. Es decir, si ponemos el cursor sobre la celda A1 y se ejecutará, si lo hacemos en una columna sin datos no agregará filas.

Es interesante fijarse en algunas líneas de código, por ejemplo, para determinar la letra de la columna en la que estamos, debemos usar:

lColum = Split(ActiveCell.Address, "$")(1)

O para determinar el número de columna en el que estamos, debemos usar:

nColum = ActiveCell.Column

Una vez aplicada la macro, la información quedaría así:

INSERTAR FILAS INTERCALADAS EN BLANCO EN EXCEL2

Como podéis observar, ya tenemos una fila intercalada entre cada línea de datos. Si quisiésemos más líneas, por ejemplo 4 o 20, tan solo debemos indicar el número de columnas en rFila = (numero de lineas a insertar)

Para acabar, en el ejemplo que os dejo, he utilizado, al igual que en la entrada anterior, otra macro para activar esta macro:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.OnKey "{ESCAPE}", "Insertar_filas"
End Sub

La macro se activa pulsando la tecla “Escape”. Pero podéis ejecutarla perfectamente vinculándola a un botón o ejecutándola directamente sobre el código.

Espero que este post os sea de utilidad, por experiencia, creo que es uno de los códigos más demandados y usados por los usuarios de Excel.

Descarga el archivo de ejemplo pulsando en: INSERTAR FILAS INTERCALADAS EN BLANCO EN EXCEL

 

Anuncios

20 pensamientos en “INSERTAR FILAS INTERCALADAS EN BLANCO EN EXCEL

    • Hola Cielito:

      Es muy sencillo, solo has de modificar esta parte de la macro:

      Cells(tTop, nColum).EntireRow.Insert

      Por esta otra:

      Cells(tTop, nColum).Insert Shift:=xlDown

      Espero que te sirva.

      Saludos.!

      Me gusta

  1. Pingback: INSERTAR CELDAS INTERCALADAS EN BLANCO EN EXCEL | EXCEL SIGNUM

    • Hola Ricardo: así lo puedes hacer:

      Sub Insertar_columnas()
      'Definimos variables
      Dim tTop As Long, rFila As Long, i As Long, j As Long
      Dim fin As Integer
      'incluimos columna en blanco a partir de la primera columna
      tTop = 2
      'Indicamos el número de columnas en blanco a incluir
      rFila = 1
      fin = Application.CountA(ActiveSheet.Range("1:1"))
      For j = 2 To fin
      If Not IsEmpty(Cells(1, tTop)) Then
      For i = 1 To rFila
      Cells(1, tTop).EntireColumn.Insert
      Next i
      tTop = tTop + rFila + 1
      End If
      Next j
      End Sub

      saludos.

      Me gusta

  2. Muy interesante Segu! Una cosulta, cómo lo podría hacer para agregar x filas pero cada cinco filas? Es decir, cinco filas con valores, añadir dos filas en blanco, cinco filas más con valores, añadir otras dos filas en blanco, etc.
    Muchas gracias de antemano!

    Me gusta

    • Hola David:

      Solo tienes que modificar tres parámetros en la macro. La fila en la que empiezas, en este caso es la 7 (tTop) a partir de donde empezarán a insertase las dos filas en blanco rFila. Y finalmente indicar en el contador un +5

      Pruebala en el ejemplo del post:

      Sub Insertar_columnas()
      'Definimos variables
      Dim tTop As Long, rFila As Long, i As Long, j As Long
      Dim fin As Integer
      'incluimos columna en blanco a partir de la primera columna
      tTop = 7
      'Indicamos el número de columnas en blanco a incluir
      rFila = 2
      fin = Application.CountA(ActiveSheet.Range("1:1"))
      For j = 2 To fin
      If Not IsEmpty(Cells(1, tTop)) Then
      For i = 1 To rFila
      Cells(1, tTop).EntireColumn.Insert
      Next i
      tTop = tTop + rFila + 5
      End If
      Next j
      End Sub

      Saludos.

      Me gusta

      • …me vas a permtir que abuse de tus conocimientos y te haga una última pregunta… 🙂

        Por casualidad no existirá alguna opción para que estas dos filas que me añade la macro, las añada sin bordes no?? Es decir, que fueran más bien dos filas en blanco sin que siguiera el recuadro de las anteriores…

        Gracias de nuevo por tu gran aportación!

        Me gusta

        • Hola David:

          Tienes que añadir este fragmento de código en la macro, la parte que está en negrita:

          For i = 1 To rFila
          Cells(tTop, nColum).EntireRow.Insert
          Cells(tTop, nColum).EntireRow.Select
          With Selection
          .Borders(xlDiagonalDown).LineStyle = xlNone
          .Borders(xlDiagonalUp).LineStyle = xlNone
          .Borders(xlEdgeLeft).LineStyle = xlNone
          .Borders(xlEdgeTop).LineStyle = xlNone
          .Borders(xlEdgeBottom).LineStyle = xlNone
          .Borders(xlEdgeRight).LineStyle = xlNone
          .Borders(xlInsideVertical).LineStyle = xlNone
          .Borders(xlInsideHorizontal).LineStyle = xlNone
          End With

          Next i
          tTop = tTop + rFila + 5

          Saludos

          Me gusta

              • Buenas de nuevo, Segu. Estoy atascado y he pensado que tal vez me podrías ayudar..

                Necesito indicar dentro de una macro que me copie el texto desde la celda A2 hasta la última celda con datos (dado que es un listado que va cambiando el número de registros a diario).

                No encuentro la forma de hacerlo. Te sabría mal echarme una mano?

                Mil gracias de nuevo!!

                Me gusta

                • No sé exactamente como es la estructura de datos que tienes. Pero un macro muy sencilla para hacer eso:

                  Sub Ejemplo_4()
                  Dim Origen, Destino As Worksheet
                  Dim fin As Integer
                  Set Origen = Sheets("Hoja1")
                  Set Destino = Sheets("Hoja2")
                  fin = Sheets(1).Range("A2", Sheets("Hoja1").Range("A" & Sheets("Hoja1").Rows.Count).End(xlUp)).Rows.Count
                  With Destino
                  .Range("A1:C" & fin).Value = Origen.Range("A1:C" & fin).Value
                  End With
                  End Sub

                  Donde copiará en la hoja 1 el rango de datos de la celda A2 hasta la última celda con datos. y los igualará en el mismo rango de la hoja 2.

                  Echa un vistazo a este post, seguro que te ayuda:
                  https://excelsignum.com/2016/06/08/procedimientos-en-vba-para-mover-datos-entre-hojas/

                  Me gusta

                  • Gracias una vez más. La cuestión es super básica, pasa que voy aun muy pez.

                    Esta es la parte macro, así de simple.

                    Sub Preparar_furgos()

                    Range(“A2:E50”).Select
                    Selection.Copy
                    Sheets(“FURGOS”).Select
                    Range(“A4”).Select
                    ActiveSheet.Paste
                    Range(“A1”).Select
                    End Sub

                    Lo que necesitaria es en lugar de asignarle el valor “E50” indicarle que seleccione hasta a la última celda activa, dado que ese registro es el que varía en función del día.

                    No sé si soy capaz de explicarme… 😦

                    Gracias.

                    Me gusta

                    • Hola David:

                      En la macro que te envíe tienes la respuesta. Veamos, para que excel comprenda que tiene que copiar un rango variable, necesitas crear una variable que cuente el número de registros y pasar la información al rango, de forma que automáticamente, cuando ese rango aumente excel sepa cuando registros tiene que seleccionar. Esto lo puedes hacer de varias formas, una de ellas es así:

                      Fin = Range("A2", Range("A" & Rows.Count).End(xlUp)).Rows.Count

                      Con la variable “Fin” (o el nombre que quieres darle, contamos desde A2 hasta la última celda con datos. LO único que tenemos que hacer ahora es “decírselo” al rango en el que ahora tienes el 50, quedando así:

                      Range("A2:E" & Fin).Select

                      De esta forma, ya tenemos el rango automatizado.

                      Tu macro, ahora estaría automatizada:

                      Sub Preparar_furgos()
                      Fin = Range("A2", Range("A" & Rows.Count).End(xlUp)).Rows.Count
                      Range("A2:E" & Fin).Select
                      Selection.Copy
                      Sheets("FURGOS").Select
                      Range("A4").Select
                      ActiveSheet.Paste
                      Range("A1").Select
                      End Sub

                      Saludos.

                      Me gusta

  3. Muchísimas gracias, una vez más!

    Lo único es que aplicando esto tal cual, curiosamente me seleccionaba hasta la penúltima y me dejaba la úlitma fila de lado.

    Finalmente he hecho una pequeña modificación y he cambiado esta línia “Fin = Range(“A2”, Range(“A” & Rows.Count).End(xlUp)).Rows.Count” por esta otra: “Fin = Cells(Rows.Count, 1).End(xlUp).Row”.

    De verdad Segu, muchas gracias por todo. Me has ayudado mucho, prometo no molestarte más.

    Saludos!!

    Me gusta

    • Hola David:

      Puedes preguntarme lo que necesites, no es molestia. Escribo este blog precisamente para ayudar.

      Por cierto, la fórmula, pensé que tenías encabezados y no los queráis copiar, solo tienes que cambia de A2 por A1. Pero si con tu modificación te funcione, perfecto!.

      Me gusta

      • Escribes este blog para ayudar y sin duda alguna logras tu propósito. Te tomo la palabra, si me veo en apuros te mandaré un S.O.S 😉

        Thank you so much!

        Me gusta

¿Te ha gustado?. Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s