Buscar y copiar una celda de cada fila que tenga un texto determinado

Hola a todos y gracias por la gran labor que hacéis.

Tengo una hoja de excel con más de 4500 filas. Lo que intento hacer es que en la columna Y me copie la celda del rango Z:AJ (de Z1:AJ1 a Z4500:AJ4500) que contenga el texto "[c]".

Rizando el rizo, lo ideal sería que la copiara eliminando el texto "[c]", pero no sé si eso es posible.

En la muestra que adjunto, en la columna Y deberían aparecer Ferrá, Vert, Ferrá.

Espero haberme explicado bien y gracias de antemano por cualquier ayuda.

Respuesta
1

Entra al Editor de macros (presionando juntas teclas ALT y F11)

Inserta un módulo y allí copia la macro siguiente:

Sub quitaC()
'x Elsamatilde
'se recorre fila 1 hasta la última ocupada en Z
x = 1
While Range("Z" & x) <> ""
    'se recorren todas las col desde Z (26) hasta AJ (36)
    For y = 26 To 36
        'evalúa si el texto se encuentra en la celda guardando su posición
        Z = InStr(1, Cells(x, y), "[c]")
        'si lo encuentra, guarda el texto en col Y terminando el bucle For
        If Z > 0 Then
            Range("Y" & x) = Mid(Cells(x, y), 1, Z - 2)
            Exit For
        End If
    Next y
    x = x + 1
Wend
MsgBox "Fin del proceso."
End Sub

Estoy considerando que no habrá filas vacías en col Z.... sino comenta para que te cambie el bucle While.... Wend por otro.

Podrás ejecutarlo desde el mismo Editor, o desde el menú Desarrollador (o Programador) de la hoja.

La función MID extrae del total de la celda los primeros caracteres hasta llegar al inicio del texto buscado. Se resta 2 porque observo un espacio entre el nombre y el corchete de apertura.

Hola. Lo primero muchas gracias por la respuesta, pero no consigo hacer que funcione. Esta es la tabla, donde los datos están desde la fila 2 hasta la 4932 (columnas Z a AJ):

Así pues he modificado la macro y puesto For y = 2 To 4932 (donde tu habías puesto 26 To 36), entendiendo que era lo que había que hacer. Al ejecutarla me aparece este error:

Al depurar, me señala esta línea de la macro:

También comentarte que, como puedes ver, a veces la celda Z u otra/s están vacías.

Gracias por cualquier nueva ayuda.

No señor. La variable 'y' recorre las columnas tal como lo comenté en el código.

 'se recorren todas las col desde Z (26) hasta AJ (36)

La variable 'x' recorre las filas. Comenzando en 1 porque así lo habías comentado inicialmente.

De Z1:AJ1 a Z4500:AJ4500)

'se recorre fila 1 hasta la última ocupada en Z

Por lo tanto si ahora empieza en 2 debieras cambiar la instrucción al inicio donde dice x = 1 que diga x = 2

Pero en tu modelo original tampoco había celdas libres en col Z... y ahora parece que sí. Por lo tanto, tal como te comenté en mi respuesta anterior, vamos a cambiar de bucle. En lugar de While... Wend vamos a dejar que recorra hasta la última ocupada.

Sub quitaC()
'x Elsamatilde
'se recorre fila 1 hasta la última ocupada en Z
'x = 1
fini = Range("Z" & Rows.Count).End(xlUp).Row
For x = 2 To fini
    'se recorren todas las col desde Z (26) hasta AJ (36)
    For y = 26 To 36
        'evalúa si el texto se encuentra en la celda guardando su posición
        Z = InStr(1, Cells(x, y), "[c]")
        'si lo encuentra, guarda el texto en col Y terminando el bucle For
        If Z > 0 Then
            Range("Y" & x) = Mid(Cells(x, y), 1, Z - 2)
            Exit For
        End If
    Next y
Next x
MsgBox "Fin del proceso."
End Sub

Leé los comentarios con atención pero no cambies el código si no estás seguro... cualquier duda me escribís nuevamente.

Sdos!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas