¿Como buscar una palabra dentro de un texto en vba?

A tod@s!

Tan sencillo como esto... Solo que se trata en un rango de celdas.

Si busco la palabra corazza en el string que me encuentre:

Corazza, corazza, corazza7 y micorazza.

¿Cómo puedo hacerlo para que me detecte en estos 4 ejemplos?

¿Se puede hacer todo a la vez?

2 Respuestas

Respuesta
2

Puedes utilizar un formato condicional

En la fórmula:

=HALLAR("corazza",A1)

Se aplica (el rango que necesites)

=$A$1:$A$10

Ejemplo:

Con vba. 

Solamente ajusta el rango A1:A10

Sub Macro1()
  Range("A1:A10").Replace What:="corazza", Replacement:="", LookAt:=xlPart, _
      SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=True
End Sub

En esta parte puedes ajusta el color. Va la macro:

Sub Macro2()
  With Application.ReplaceFormat
    .Clear
    .Interior.Color = vbYellow
    Range("A1:A10").Replace What:="corazza", Replacement:="", LookAt:=xlPart, _
      SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=True
    .Clear
  End With
End Sub

Te muestro la forma correcta de declarar la variables y con Range también busca en la fila del encabezado:

Option Explicit
Private Sub CommandButton1_Click()
  Dim valorbuscado As String, celda As String
  Dim HojaDatos As Worksheet
  Dim Tabla As ListObject
  Dim Rng As Range, valorencontrado As Range
  '
  valorbuscado = "corazza"
  Set HojaDatos = ThisWorkbook.Sheets("MasterDATA")
  Set Tabla = HojaDatos.ListObjects("TablaAccionesLanzadas")
  Set Rng = Tabla.Range.Columns(2)
  Set valorencontrado = Rng.Find(valorbuscado, Lookat:=xlPart)
  '
  If valorencontrado Is Nothing Then
    MsgBox "Valor no encontrado"
  Else
    celda = valorencontrado.Address
    Do
      MsgBox "Valor encontrado en la fila " & valorencontrado.Row
      Set valorencontrado = Rng.FindNext(valorencontrado)
    Loop While Not valorencontrado Is Nothing And valorencontrado.Address <> celda
  End If
End Sub

¡Gracias!

Muchas gracias Elsa, hoy me he levantado pronto y con la cabeza despejada, depurando el código para mis necesidades y con tu ayuda, me ha funcionado a la primera.

No tengo más que palabras de agradecimento, por compartir conocimiento, dar soluciones e incluso ejemplos.

Eres un muy buen referente...así que muchísimas gracias.

Un saludo

¡Gracias!

Hola Dante!

Efectivamente ha sido con tu código con el que me ha funcionado.

Tenia explicaciones de Elsa quien ha colaborado en este tema, también se lo he agradecido.

Aunque bien es cierto que ha sido con tu código.

Gracias Dante (una vez más)

Un saludo

Respuesta
1

Tengo una consulta abierta con el tema:

¿Crear procedimiento para vaciar todos los textbox de cualquier formulario?

Si el tema quedó comprendido y resuelto agradeceré valores la respuesta. Sino comenta (*)

Con respecto a la consulta actual, si buscas una palabra en un rango de celdas debieras aclarar cómo quieres que te devuelva el resultado: indicando la referencia, contar todas las apariciones,¿?

De todos modos te paso un ejemplo que pintará de color todas las celdas con coincidencias en un rango dado (*)

Sub busqueda_01()
'x Elsamatilde
Set hox = Sheets("Hoja1")
rango = "A2:E10"     'ajustar rango de búsqueda
dato = "corazza"     'ajustar
Set busco = hox.Range(rango).Find(dato, LookIn:=xlValues, Lookat:=xlPart)
'si el dato no se encuentra devuelve un mensaje
If busco Is Nothing Then
    MsgBox "Dato no encontrado."
Else
    dire = busco.Address
    'marca de color la celda encontrada
    Do
    hox.Range(busco.Address).Interior.ColorIndex = 5
    Set busco = hox.Range(rango).FindNext(busco)
    Loop While Not busco Is Nothing And busco.Address <> dire
End If
End Sub

Sdos y no olvides valorar la respuesta.

Elsa

En mi canal encontrarás más ejemplos de búsqueda y búsqueda continua en los videos N° 16 - 23 y 25 entre otros.

Hola Elsa!

1º Gracias por contestar, es de agradecer que compartas tus conocimientos.

2º Estoy trabajando con una tabla (buscando en columna 2) y siguiendo tu explicación encuentro el primer dato pero el siguiente con Findnext me origina un error... ¿esto por qué? Te paso el código.

¿Cómo solucionarlo?

Por cierto tampoco me encuentra en la fila 1 el dato...esto porque?

El error en la línea que marcas se debe a que en el FindNExt utilizaste otro término en lugar de valorencontrado.

Te dejo la macro ajustada:

Private Sub CommandButton1_Click()
Dim fila As Object
Dim linea As Integer
valorbuscado = "corazza"
Set HojaDatos = ThisWorkbook.Sheets("MasterDATA")
Set Tabla = HojaDatos.ListObjects("TablaAccionesLanzadas")
Set valorencontrado = Tabla.DataBodyRange.Columns(2).Find(valorbuscado, Lookat:=xlPart)
If valorencontrado Is Nothing Then
    MsgBox "Valor no encontrado"
Else
    'guarda la primer fila encontrada para no repetir el bucle DO....Loop
    filx = valorencontrado.Row
    Do
        MsgBox "Valor encontrado en la fila " & valorencontrado.Row
        Set valorencontrado = Tabla.DataBodyRange.Columns(2).FindNext(valorencontrado)
    Loop While Not valorencontrado Is Nothing 'And valorencontrado.Row <> filx
End If
End Sub

La expresión DataBodyRange solo devuelve el rango de datos, no los títulos de la tabla.

Sdos y te recuerdo la consulta anterior que aún sigue abierta.

Elsa

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas