martes, 17 de septiembre de 2013

VBA: El operador de comparación LIKE.

A través de un comentario un lector preguntaba por la manera de verificar si un texto estaba contenido dentro de una celda:

...Si de esta forma la celda que tiene la palabra exacta "Color" es la que cambiara de color. Para cambiar de color la celda solo que la palabra 'Color' esta dentro de una frase y/o conjunto de otras palabras....


Se trata por tanto de comprobar mediante algún operador o instrucción si nuestras celdas contienen alguna otra cadena. En particular hablaremos de comodines, de operadores de comparación (like) y de la función InStr.

Analizaremos, en primer lugar, cuáles son los caracteres comodín empleados en nuestros procedimientos de VB:
1 - Cierre interrogación (?): representa cualquier carácter único.
2 - Asterísco (*): puede indicar cero o más caracteres (indeterminados).
3 - Almohadilla (#): Cualquier dígito único
4 - Cadena entre corchetes ([lista de caracteres]): Cualquier carácter único en la lista dada de caracteres.
Esta 'lista de caracteres' puede especificar un rango de caracteres mediante el uso de un guión (-) para separar los límites superiores e inferiores del rango, pero deben aparecer en orden de clasificación ascendente (por ejemplo, A-Z ó 0-100).


Por otra parte la función InStr nos retorna un tipo Long que especifica la posición de la primera aparición de una cadena dentro de otra.
La sintáxis de la función es:
InStr([inicio, ]CadenaDondeSeBusca, CadenaBuscada[, TipoComparación])


Por último el operador Like, con el que funcionan perfectamente nuestros comodines, y que utilizamos para comparar dos cadenas de caracteres. A la hora de emplear nuestros caracteres comodín, debemos tener presente que es posible utilizar un grupo de uno o más caracteres (en nuestra 'lista de caracteres') entre corchetes ([]) para establecer una coincidencia con un carácter cualquiera de la cadena buscada.

Una vez repasados los conceptos esenciales a la hora de comparar cadenas en nuestras macros, planteemos un ejemplo. Tenemos en nuestra hoja de cálculo en el rango A1:A7

VBA: El operador de comparación LIKE.


Se trata de contruir un sencillo proceso que identifique las celdas que contienen la cadena 'Excel'. Y nuestro primer procedimiento será con el operador Like y algún comodín. Asi que, en un módulo del Editor de VBA añadiremos las líneas de nuestra macro.

Sub OperadorLike()
Dim celda As Object
Dim rng As Range
Set rng = Range("A1:A7")
  
'recorremos cada celda del rango indicado
For Each celda In rng
valor = celda.Value
    'asignamos color si la celda contiene el texto Excel
    'con el operador Like
    If valor Like "*Excel*" Then celda.Interior.Color = 65535
Next celda
End Sub



En este segundo procedimiento que sigue, y que realiza la misma acción, empleamos la función InStr. En el mismo módulo del Editor de VBA anterior añadiremos las líneas de la macro.

Sub FuncionInStr()
Dim celda As Object
Dim rng As Range
Set rng = Range("A1:A7")
  
'recorremos cada celda del rango indicado
For Each celda In rng
valor = celda.Value
    'asignamos color si la celda contiene el texto Excel
    'con la función InStr
    If InStr(valor, "Excel") > 0 Then celda.Interior.Color = 65535
Next celda
End Sub



El resultado en ambos casos es idéntico, se busca celda por celda en el rango indicado, dentro de cada cadena contenida en dicha celda, sólo cuando la cadena 'Excel' esté contenida en ella, se marcará con un color el fondo:

VBA: El operador de comparación LIKE.

11 comentarios:

  1. Doc Excelente aporte y si en vez de pintar de amarillo el fondo de la celda quisieramos escribir un texto determinado por cada like en la celda de la columna del costado?

    ResponderEliminar
    Respuestas
    1. Hola Moises,
      si he entendido bien, bastaría reemplazar:
      If InStr(valor, "Excel") > 0 Then celda.Interior.Color = 65535
      por
      If InStr(valor, "Excel") > 0 Then celda.offset(0,1).value="texto que quieras"

      or
      If valor Like "*Excel*" Then celda.Interior.Color = 65535
      por
      If valor Like "*Excel*" Then celda.offset(0,1).value="texto que quieras"

      Saludos cordiales !

      Eliminar
    2. Doc te pasaste, gracias por el aporte esta excelente! Saludos Cordiales

      Eliminar
    3. Ismael una consulta mas, entiendo que las funciones se refieren a una busqueda estrictamente igual diferenciando mayusculas y minusculas, hay la opcion que sea insensible a mayusculas y minusculas?

      Eliminar
    4. Encontre la respuesta estimado Ismael era colocando Option Compare Text Arriba de los sub!!! =)

      Eliminar
  2. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  3. Necesito ayuda: Tengo varias aplicaciones en VBA Excel, cuando ejecuto un form desde un menu, concluyo con el form y lo ejecuto de una vez, no carga los datos en los combos y se inhibe excel. Puedo enviarle la aplicación para que la revisen.

    ResponderEliminar
    Respuestas
    1. Hola Danilo,
      entiendo que esas 'aplicaciones' serán códigos de procedimientos Sub incluidos en algún UserForm...
      Envíame si quieres el fichero .xlsm y le echo un vistazo.
      excelforo@gmail.com
      Saludos

      Eliminar
  4. Este comentario ha sido eliminado por el autor.

    ResponderEliminar