¿Cómo copiar valores de celdas de forma ordenada según criterios?

Estoy ajustando las lineas de una macro, la cual debe copiar los valores contenidos desde la columna E hasta la columna H en orden de lista en las celdas disponibles (vacias) de la columna D, sabiendo que estos valores (los contenidos en las columanas desde la E hasta la H) son variables, en cuanto a que en algunos casos pueden estar distribuidos de forma diferente o no estar en todas las columnas ya mencionadas, sino, solo en una o algunas de ellas; en el siguiente link - https://drive.google.com/file/d/11ge-xeXMKCEV4TiqlNqnBpp2-_6N6aLi/view?usp=sharing - les comparto el libro .xlsm que estoy trabajando como prueba macro de este procedimiento, con dos hojas las cuales clasifico de forma visual con un antes y un despues del procedimiento que anteriormente describo.

He intentado obtener este resultado con la siguinete macro:

Sub InsertarItem()
Dim Celda As Range
Dim UltimaFila As Long, x As Long
Dim Valores(1 To 4) As Integer
Let UltimaFila = Cells(Rows.Count, 5).End(xlUp).Row
Valores(1) = 0: Valores(2) = 2: Valores(3) = 3: Valores(4) = 4
For Each Celda In Range("E3:E" & UltimaFila)
    For x = 1 To 4
        If Celda.Offset(0, Valores(x)) > "0" Or Celda.Offset(0, Valores(x)) > " " Or Celda.Offset(0, Valores(x)) > "REEMPLAZAR" Then
            If Valores(x) = 0 Then
                Celda.Offset(Valores(x) + 1, -1).Formula = "=" & Celda.Offset(0, Valores(x)).Address(0, 0)
            ElseIf Valores(x) = 2 Then
                Celda.Offset(Valores(x), -1).Formula = "=" & Celda.Offset(0, Valores(x)).Address(0, 0)
            ElseIf Valores(x) = 3 And Valores(x) = 4 Then
                Celda.Offset(Valores(x) - 1, -1).Formula = "=" & Celda.Offset(0, Valores(x)).Address(0, 0)
            End If
        End If
    Next x
Next Celda
End Sub

pero no he logrado del todo lo que pretendo, ya que al ejecutarla copia los valores pero sin tener en cuenta la celda disponible en la columna D y la distribucion de la informacion contenida en las columnas desde la E hasta la H, en el libro que les comparto en la hoja asociada al "conprocedimiendo" muestro los seis (6) casos que son los que pueden ocurrir en la tabla en orden aleatorio con el resultado deseado.

A continuación propongo la situación que he mencionado anteriormente en imágenes, aclarando que todos los casos que se presentan están coloreados en razón de que están asociados entre si, es decir, las celdas con color entre si tienen relación en como deben resultar luego del procedimiento de copiado de valores (de los valores contenidos en las columnas desde la E hasta H) en los campos disponibles de la columna D.

Sin procedimiento

Con procedimiento

1 respuesta

Respuesta
1

Podrías comentar en el siguiente orden:

1. En tu imagen "sin procedimiento", en todos los casos, siempre aparece en la primera posición de la columna D el dato (azul) de la columna F. Esto siempre será así.

2. En las celdas de la columna D, siempre habrá suficientes espacios para poner los valores de las celdas E a H. Es decir, si tienes valor en las celdas E3, F3, G3 y H3, entonces en la columna D tienes 4 filas disponibles para poner los valores.

Saludos Dante Amor, de antemano agradezco el interés por ayudarme y el tiempo que te tomas para analizar esta macro, a continuación te respondo las inquietudes que me planteas:

1. Correcto, en todos los casos siempre me va a aparecer en la primera intentar de la columna D el dato (azul) de la columna F; ya que esta formulado para que así sea.

2. Correcto, siempre habrán los espacios suficientes para que se puedan poner o copiar los valores dispestos en las celdas E a H, ya que para esto tengo una macro especifica que me inserta filas de acuerdo a los datos contenidos en las celdas E a H, es decir, si tengo valores en las celdas E3, F3, G3 y H3, entonces en la columna D tendré 4 filas disponibles para poner los valores en todos los casos.

Nuevamente agradezco el tiempo que te tomas para revisar esta situación que se me presenta.

Hola Dante Amor, con toda la consideración del caso hago una aclaración adicional al punto 1 que me solicitaste anteriormente. En todos los casos siempre me va a aparecer en la primera intentar de esa misma fila de la columna DE el dato (azul) de la columna F; ya que esta formulado para que así sea, de igual manera si solo hay un registro en alguna de las celdas E3, F3, G3 y H3, en especifico en las celdas de la columna H (Asociado al valor constante de la columna I = "RETIRAR" el cual posiciono como caso 4) siempre me va a aparecer en la primera intentar de esa misma fila de la columna DE el dato (rojo) de la columna H.

Saludos y agradezco la ayuda que me podas prestar a esta situación.

Prueba la siguiente macro:

Sub InsertarItem()
  Dim i As Long, j As Long, k As Long
  Dim arr As Variant
  '
  arr = Array("F", "E", "G", "H")
  '
  For i = 3 To Range("B" & Rows.Count).End(3).Row
    k = i
    For j = 0 To UBound(arr)
      If Range(arr(j) & i) <> "" Then
        Range("D" & k) = Range(arr(j) & i)
        k = k + 1
      End If
    Next
    i = k - 1
  Next
  '
End Sub

¡Gracias! Dante Amor funciona perfecto, justo lo que necesitaba.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas