Duda Macro VBA Excel para mover filas

tengo un excel, con varias columnas A, B, C, D y E. 

Quiero coger un valor de A, el A1, y mirar si se encuentra en la columna E, recorriéndola entera. Y si el valor de A1 se encuentra en la columna E, coger esa fila y ponerla contigua a la fila de la columna E donde se haya encontrado dicho valor.

Algo así:

Perro - tomate - orégano

Gato - pimiento - patata

Orégano - limón - cuchillo

El programa buscaría y se quedaría tal que así:

Perro - tomate - orégano - orégano - limón - cuchillo

Gato - pimiento - patata

Luego repetiría el comando una vez lo realizara en toda la columna pero cogiendo la columna J en lugar de la E, para repetir por si en la columna A existiera una fila que fuera: cuchillo - melón - sandia, y que la pusiera a continuación de la que ya hay, pero eso sería más sencillo supongo.

1 respuesta

Respuesta
1

Enviame una muestra de tu hoja porque en tu ejemplo no hay referencias de columnas y no se puede desarrollar una macro así. Además hay que comprobar si los datos son realmente textos o no, si tienen fórmula o no, es decir que hay muchos detalles a resolver,

Mis correos aparecen en mi sitio que dejo al pie o dejame un correo tuyo escrito aquí,

Se trata de referencias, códigos alfanuméricos. Pueden ser todo números, números y letras, puede haber símbolos como guiones o puntos. Están en formato general. Las columnas en mi ejemplo yo las equiparé a los guiones con las que separaba las palabras, considerando solo 3 columnas (A, B, C). Y una vez que se suman pasan a ser una fila de 6 columnas (en mi caso pasaría a ser la fila de 10 columnas).

Sería así:

A1=Perro - B1=tomate - C1=orégano

A2=Gato - B2=pimiento - C2=patata

A3=Orégano - B3=limón -C3= cuchillo

El programa buscaría y se quedaría tal que así:

A1=Perro - B1=tomate - C1=orégano - D1=orégano - E1=limón - F1=cuchillo

A2=Gato - B2=pimiento - C2=patata

Bien, así queda entonces la macro, que la tendrás que colocar en un módulo del Editor.

Luego podrás asignarla a un botón, un atajo de teclado o ejecutarla directamente desde el menú Macros. Estos temas los tengo explicados en la sección Macros de mi sitio.

Sub armaTabla()
'x Elsamatilde
'se establece el fin de rango según col A
filx = Range("A" & Rows.Count).End(xlUp).Row
'1er col del grupo es C, la de destino es D
colini = 3: colx = colini + 1       'AJUSTAR colini SEGÚN CUAL ES LA ÚLTIMA COL DE DATOS
'se repite el bucle mientras haya registros encontrados
While colx > colini
'se recorre la col A
For i = 1 To filx
    'se busca el valor de Ci en col A
    Set busco = ActiveSheet.[A:A].Find(Cells(i, colini), LookIn:=xlValues, lookat:=xlWhole)
    'si lo encuentra pasa esa fila a continuación de C
    If Not busco Is Nothing Then
        Range("A" & busco.Row & ":C" & busco.Row).Cut Destination:=Cells(i, colx)
    End If
Next i
'si establece cuál es la última columna ocupada
'si sigue siendo la misma es que ya no hay datos y finaliza el proceso
ActiveSheet.UsedRange.Select
If colini < Selection.Columns.Count Then
    colini = Selection.Columns.Count
    colx = colini + 1
Else
    'marco para finalizar
    colini = colx
End If
Wend
End Sub

Sdos!

Esta sería la macro, solo ajusta el nro de la columna final de la tabla de origen, en tu ejemplo es 3 (col C)

Sub armaTabla()
'x Elsamatilde
'se establece el fin de rango según col A
filx = Range("A" & Rows.Count).End(xlUp).Row
'1er col del grupo es C, la de destino es D
colini = 3: colx = colini + 1
'se repite el bucle mientras haya registros encontrados
While colx > colini
'se recorre la col A
For i = 1 To filx
    'se busca el valor de Ci en col A
    Set busco = ActiveSheet.[A:A].Find(Cells(i, colini), LookIn:=xlValues, lookat:=xlWhole)
    'si lo encuentra pasa esa fila a continuación de C
    If Not busco Is Nothing Then
        Range("A" & busco.Row & ":C" & busco.Row).Cut Destination:=Cells(i, colx)
    End If
Next i
'si establece cuál es la última columna ocupada
'si sigue siendo la misma es que ya no hay datos y finaliza el proceso
ActiveSheet.UsedRange.Select
If colini < Selection.Columns.Count Then
    colini = Selection.Columns.Count
    colx = colini + 1
Else
    'marco para finalizar
    colini = colx
End If
Wend
End Sub

Se coloca en un módulo del Editor y luego podrás ejecutarla con un botón, un atajo de teclado o desde el menú Macros. Estos temas los tengo explicados en la sección Macros de mi sitio.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas