Excel VBA Macro para buscar cadena de texto dentro de otra no funciona (Instr)

Hice una macro para buscar una cadena de texto dentro de otra y, aunque, no me da ningún error, no funciona y me dice que no encuentra nada. Os adjunto el ejemplo.

En la Hoja UNO, columna A hay una cadena de texto y busco si existe en Hoja DOS columna A, si es así rescata de Hoja DOS la columna C y la pega en columna B de hoja UNO. He puesto una tercera hoja con el resultado.

Por ejemplo: En Hoja UNO columna A dice: "El viernes va a hacer calor" y en la Hoja DOS columna A, existe una celda donde dice: "viernes va a", necesito devolver la columna C de esa hoja a la columna B de la Hoja UNO si encuentra cadenas que coincidan. Algo así como la fórmula HALLAR de excel.

Os dejo el código, no me ha dado error, pero no funciona:

Sub ejemplo()
Sheets("UNO").Activate
For x = 2 To Range("A" & Rows.Count).End(xlUp).Row
If InStr(1, (Worksheets("DOS").Range("A" & x)), (Worksheets("UNO").Range("A" & x))) > 0 Then
Worksheets("UNO").Range("B" & x) = Worksheets("DOS").Range("C" & x)
Else
Worksheets("UNO").Range("B" & x) = "No encontrado"
End If
Next
End Sub

1 respuesta

Respuesta
2

Por la forma en que tienes tu ejemplo, debes buscar si la frase de la hoja2 existe en alguna celda de la hoja1. Te explico.

En Hoja UNO columna A dice: "El viernes va a hacer calor"

En Hoja DOS columna A, existe una celda donde dice: "viernes va a"

Entonces, hay que buscar si "viernes va a" está contenida dentro de "El viernes va a hacer calor"

La sintaxis correcta es, ejemplo:

  a = "El viernes va a hacer calor"
  b = "viernes va a"
  R = InStr(1, a, b)

Tú estás buscando la frase larga dentro de la frase corta, entonces nunca la va encontrar.


De acuerdo a lo anterior, puede ser que "El viernes va a hacer calor" tenga más de un resultado, por ejemplo, si en la hoja "DOS" tienes las siguientes frases:

                 A                              C

1     viernes va a                dato1

2      calor                            dato2

Entonces en la hoja "UNO" el resultado debería ser:

                 A                                                            B

1     El viernes va a hacer calor                dato1, dato2


Si todo lo anterior es correcto, prueba la siguiente macro:

Sub Buscar_Frases()
  Dim sh1 As Worksheet, sh2 As Worksheet
  Dim c As Range, r As Range, f As Range, cell As String
  Dim u As Long
  '
  Application.ScreenUpdating = False
  Set sh1 = Sheets("UNO")
  Set sh2 = Sheets("DOS")
  '
  'Establece en la hoja1  el rango de datos para buscar la frase
  u = sh1.Range("A" & Rows.Count).End(3).Row
  Set r = sh1.Range("A2:A" & u)
  sh1.Range("B2:B" & u).ClearContents
  '
  'Por cada frase en la hoja2
  For Each c In sh2.Range("A2", sh2.Range("A" & Rows.Count).End(3))
    'La busca en la hoja1
    Set f = r.Find(c, , xlValues, xlPart, , , False)
    If Not f Is Nothing Then
      'Si encontró la cadena
      cell = f.Address
      Do
        If sh1.Range("B" & f.Row).Value = "" Then
          sh1.Range("B" & f.Row).Value = sh2.Range("C" & c.Row)
        Else
          sh1.Range("B" & f.Row).Value = sh1.Range("B" & f.Row).Value & "," & sh2.Range("C" & c.Row)
        End If
        Set f = r.FindNext(f)
      Loop While Not f Is Nothing And f.Address <> cell
    End If
  Next
  On Error Resume Next
  'Para las frases de la hoja UNO que no tienen frase en hoja2
  sh1.Range("B2:B" & u).SpecialCells(xlCellTypeBlanks).Value = "No encontrado"
  Application.ScreenUpdating = True
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas