VBA para copiar y pegar datos de rango de fila, pero solo celdas con valores

Buenas tardes.

Solicito de la colaboración de algún experto, ya que mi conocimiento en macros es nulo. El ejemplo a continuación es a manera de ejemplo, ya que lo voy a utilizar en una hoja con un cuadro mucho más grande, pero si funciona aquí, reemplazando los datos de los rangos a copiar y donde pegar debería de funcionar.

Tengo un cuadro desde la columna A:E, esta columna tiene datos y fórmulas, pero se puede apreciar que algunas celdas están vacías y otras no, necesito que si estoy en cualquier parte de la hoja EJ: "M1" y ejecuto la macro, copie el rango de la fila (A1:E1) y pegue en la celda (G1), pero solo las celdas con valores. Coloque a manera de ejemplo como debería arrojar el resultado la macro, en este caso como todas las celdas de la fila tenia valores, pues copio y pego todos los valores, fin de la macro.

Ahora supongamos que estoy posicionado en la celda "M2" o "L2", y ejecute la macro, entonces solo copiaría los valores de el rango en la fila A2:E2, pero no todas las celdas tiene valores como en la anterior, entonces solo copiaría las celdas que tuvieran valores y los pegaría a partir de la celda G:2, pero solo copia 3 celdas, ya que en ese rango solo habían 3 celdas con valores. Y así sucesivamente con la celdas de la fila 4 y 5 y 5 etc.. Pero yo la ejecuto manualmente por fila, de acuerdo a la fila donde yo este seleccionado en la hoja.

En la imagen coloque manualmente el resultado que debería dar la macro a partir de la columna "G"

Espero haber sido claro, creo que es algo básico pero realmente no he podido hacerla.

1 respuesta

Respuesta
1

Prueba lo siguiente:

Sub CopiarValores()
  Dim a As Variant, b As Variant, lr As Long, i As Long, j As Long, k As Long
  lr = ActiveSheet.Range("A:E").Find("*", , xlValues, , xlByRows, xlPrevious).Row
  a = Range("A1:E" & lr).Value2
  ReDim b(1 To UBound(a, 1), 1 To UBound(a, 2))
  For i = 1 To UBound(a)
    k = 1
    For j = 1 To UBound(b)
      If a(i, j) <> "" Then
        b(i, k) = a(i, j)
        k = k + 1
      End If
    Next
  Next
  Range("G1").Resize(UBound(a, 1), UBound(a, 2)).Value = b
End Sub

Dante mil gracias por tu respuesta

la macro hace el trabajo, pero lo que pasa es que hace el trabajo de todo la hoja  al ejecutarla , yo necesito que lo haga a una sola fila, dependiendo si me encuentro seleccionando una celda de esa fila, ejemplo:

si estoy seleccionando  cualquier celda de la hoja en la fila 1, ejemplo"(M1 o L1 o N1),  al ejecutar la macro solo haga el trabajo de copiar y pegar en esa fila, en ese caso (A1:E1) y no de toda la  hoja. y si despues estoy seleccionando cualquier celda de la fila 2, copie y pegue el rango de las celdas de esa fila, osea A2:E2 y asi sucesivamente. 

en este caso la macro esta haciendo el trabajo perfecto, pero de toda la hoja al ejecutarla, y no de acuerdo a la fila donde yo este ubicado, yo lo que necesito  es en el caso de mi ejemplo de la foto, hay 5  filas, entonces tuviera que ejecutarla 5 veces fila por fila para terminar el cuadro. porque yo con otra macro que tengo la unifico, y se va automatizando y ejecutando de acuerdo a la fila que este selecionando en ese momento.

espero hacerme entender :) mil gracias

Prueba esto:

Sub CopiarValores2()
  Range("A" & ActiveCell.Row & ":E" & ActiveCell.Row).SpecialCells(xlCellTypeConstants).Copy
  Range("G" & ActiveCell.Row).PasteSpecial xlPasteValues
  Application.CutCopyMode = False
End Sub

O de esta manera:

Sub CopiarValores3()
  With ActiveCell
    Range("A" & .Row & ":E" & .Row).SpecialCells(xlCellTypeConstants).Copy Range("G" & .Row)
  End With
End Sub

Dante muchas gracias

Me gustomas la ultima y me gusto más porque al ejecutar la macro, no se mueve la celda que tengo seleccionada, en la otra pegaba pero quedaban seleccionadas en donde pegaba, así que me quedo con la ultima, PERO tengo un problemilla, el cuadro que coloque en la foto es a manera de ejemplo, donde necesito ejecutarlo es un cuadro que contiene fórmulas y algunas celdas están con valores y otras vacías de acuerdo a alguna condición, entonces al no tener números como tal, si no que tiene fórmulas, arroja un error al ejecutar "error 1004" y abajo, "no se encontraron celdas"

Parece que no reconociera las celdas vacías o llenas porque contienen es fórmulas y no números como tal.

Mil gracias ya estamos cerca :)

Prueba esta

Sub CopiarValores4()
  Dim c As Range, j As Long
  j = 7
  With ActiveCell
    For Each c In Range("A" & .Row & ":E" & .Row).SpecialCells(xlCellTypeConstants)
      Cells(.Row, j).Value = c.Value
      j = j + 1
    Next
  End With
End Sub

No dante aun no, has este ejemplo para ver si te queda más fácil, tenemos 2 cuadros, el de arriba tiene fórmulas como te lo señalo, y el de abajo es igual pero esta en formato texto, el de arriba en formato general, yo necesito es copiar y pegar pero del cuadro que tiene fórmulas, el de arriba, ves que la fórmula es muy sencilla y básicamente esta diciendo que si la celda señalada en la fórmula es superior a por numero, la concatene o la deje vacía según su condición, como ves la celda B2 esta vacía porque en la fórmula le diría que si la celda B9 es mayor a "000" la concatene, pero como esa celda esta vacía su valor lo arroja (" "), pero de igual forma el cuadro superior que es donde necesito que l macro funcione. No lo hace porque al parecer como sus celdas están es con fórmulas y no números, tal vez por eso no lo reconoce.

Me aparece este error

Disculpa si tal vez estoy pegado en una bobada, pero no se nada de macros, realmente la macro la voy a usar en una hoja con muchos más datos pero ya después de que esta me funcione aquí, la acomodo en el otro archivo.

Solo falta que la macro reconozca esos datos que están en fórmulas y lo pegue en valores.

Nuevamente gracias :)

Utiliza la siguiente:

J = 7 significa la columna donde va a poner el resultado, si pones 1000 te va a poner el resultado en la columna mil.

Hice un cambio para puedas ver la columna y la puedas modificar.

Sub CopiarValores4()
  Dim c As Range, j As Long
  j = Columns("G").Column
  With ActiveCell
    For Each c In Range("A" & .Row & ":E" & .Row)
      If c.Value <> "" Then
        Cells(.Row, j).Value = c.Value
        j = j + 1
      End If
    Next
  End With
End Sub

¡Gracias! Dante

Ahora si hace exactamente lo que necesitaba, si había notado que la J= era para el numero de la columna donde lo iba a pegar y coloque 1000 porque el archivo real donde necesito aplicarlo consta de un rango de 1000 datos, por eso colocaba como ejemplo solamente ese cuadrito pequeñito para que fuera más fácil explicarlo.

Pero ya como la actualizaste la ultima vez quedo perfecta, disculpa si era algo básico pero realmente no tengo idea de las macros.

Mil y mil gracias, feliz tarde

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas