Macro VBA copiar y pegar eliminando celdas vacías

Buena tarde, solicito de su gran ayuda por favor para la siguiente macro:

En la columna A tengo celdas con valores hasta la fila 2000 o más. Pero son en algunas celdas, muchas otras están vacías, la mayoría vacías de hecho. Pero necesito una macro que pegue en la columna C los valores hacia abajo, pero eliminando las celdas vacías.

En la imagen coloco como debería ser el resultado de la macro, según el ejemplo de la imagen. Los valores de la imagen son a manera de ejemplo, ya que la macro debo de cambiarle los rangos de columna de copiar y columna a pegar. Pero coloco a manera de ejemplo la imagen.

También en el rango de la columna A pueden haber solo 5 celdas con valores desde la fila 3 a la fila 3000. Pero igualmente macro pegue en la columna solo los valores omitiendo los espacios.

2 Respuestas

Respuesta
1

Prueba con:

Sub prueba()
    Dim rngR As Range
    With Worksheets("Hoja2")
        Set rngR = .Range("A3:A" & CStr(.[A100000].End(xlUp).Row)).SpecialCells(xlCellTypeConstants)
        rngR.Copy
        .[C3].PasteSpecial xlValues
    End With
    Set rngR = Nothing
End Sub

Saludos_

Muchas gracias por responder jrgces, te cuento que tengo dos problemas con la macro, una es que los valores de las celdas de la columna "a" son resultados de una fórmula EJEMPLO: =SI(C10=1, CONCATENAR(B10),"") osea la fórmula es a manera de ejemplo, entonces por ser el resultado producto de una fórmula, la macro no funciona. Pero por el contrario si las celdas a copiar de la columna A son valores por decirlo colocados manualmente, si funciona.

Y el otro tema es que si la columna A, por por o y motivo ninguna celda o fila tiene valores, aparece un cuadro de dialogo que dice " no se encontraron celdas" y la idea es que sencillamente no aparezca nada. Osea que no salga el cuadro de dalogo.

Osea la fórmula funciona si las celdas de la columna A están manualmente escritas. Pero si son resultados de fórmula no toma los valores a copiar y se queda leyendo.

Agradezco mucho de tu tiempo para esta ayuda, mil gracias sigo atento :)

A ver ahora:

Sub prueba()
    Dim rngR As Range
    With Worksheets("Hoja2")
        Set rngR = .Range("A3:A" & CStr(.[A100000].End(xlUp).Row))
        If rngR.SpecialCells(xlCellTypeBlanks).Count < rngR.Cells.Count Then
            Set rngR = rngR.SpecialCells(xlCellTypeFormulas)
            rngR.Copy
            .[C3].PasteSpecial xlValues
        End If
    End With
    Set rngR = Nothing
    Application.CutCopyMode = False
End Sub

Saludos_

Te cuento que el tema del cuadro de dialogo si no hay números en la columna A "no se econtraron celdas" ya no aparece y es genial. Pido disculpas si cuando formule inicialmente la pregunta no mencione que la columna A realmente tenia era una fórmula, (no lo vi necesario) pero veo que si es reelevante.

Como ves en la imagen la columna A realmente es una fórmula donde si es verdadero concatena un valor y si es falso lo deja vacío (" "), pues parece ser que la macro toma esas filas vacías y las pega en el resultado, como te muestro en la imagen, pega los resultados pero igualmente con las celdas vacías y la idea es que lo haga simplemente con las celdas que tienen valores. Osea eliminando las celdas vacías o en blanco. En la imagen puedes ver exactamente como esta arrojando el resultado la macro. Y deberían ir esos 7 valores uno debajo del otro.

Quedo atento a cualquier requerimiento y muchísimas gracias Jrgces

Pues entonces hagámoslo "a mano", sin utilizar specialcells:

Sub prueba2()
    Dim rngr As Range
    Dim lFilaO As Long, lFilaD As Long
    With Worksheets("Hoja2")
        Set rngr = .Range("A3:A" & CStr(.[A100000].End(xlUp).Row))
        .[C:C].ClearContents 'Se borrará lo que haya en la columna C
        If rngr.SpecialCells(xlCellTypeBlanks).Count < rngr.Cells.Count Then
            lFilaD = 2
            Application.Calculation = xlCalculationManual
            Application.ScreenUpdating = False
            For lFilaO = 1 To rngr.Cells.Count
                If Not IsEmpty(rngr.Cells(lFilaO, 1)) Then
                    lFilaD = lFilaD + 1
                    .Cells(lFilaD, 3).Value = rngr.Cells(lFilaO, 1).Value
                End If
            Next lFilaO
        End If
    End With
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
    Set rngr = Nothing
End Sub

Saludos_

Respuesta
1

Prueba la siguiente:

Sub EliminarCeldasVacias()
  Range("A:A").SpecialCells(xlCellTypeConstants, 23).Copy Range("C3")
End Sub

Hola Dante, muchas gracias por responder.

Te cuento que la macro me aparece un cuadro de dialogo que dice que no se encontraron celdas. No lo mencione en la pregunta pero resulta que los valores de la columna A realmente son valores resultado de una fórmula. Osea las celdas tiene por decir un ejemplo una fórmula así:

=SI(C10=1, CONCATENAR(B10),"") donde si el resultado es positivo concatena los valores de otra celda y si es falso lo deja en blanco (" "). Tal vez por eso no funciona.

Y segundo, también puede ser el panorama que en toda la columna A no hayan valores,así que seria genial que no saliera el cuadro de dialogo que dice " no se encontraron celdas", si no que simplemente no pegue nada y ya.

Mil gracias dante.

No lo mencione en la pregunta pero resulta que los valores de la columna A realmente son valores resultado de una fórmula...

Y segundo, también puede ser el panorama que en toda la columna A no hayan valores

Esos son datos que deberías poner en tu pregunta inicial, recuerda que nos estás pidiendo ayuda, debes proporcionar toda la información detallada para brindarte la ayuda.

Prueba la siguiente:

Sub CopiarDatos()
  Dim c As Range
  Dim i As Long
  i = 3
  Range("C:C").ClearContents
  For Each c In Range("A1", Range("A" & Rows.Count).End(3))
    If c.Value <> "" Then
      Range("C" & i).Value = c.Value
      i = i + 1
    End If
  Next
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas