jueves, 5 de junio de 2014

VBA: Cambiar color de la fuente dentro de una celda...

Quizá te preguntes de qué voy a hablar hoy... El asunto es sencillo, mediante un procedimiento Sub vamos a conseguir cambiar el color de la fuente dentro de una celda, pero para caracteres específicos (NO para todos).
Se trata por tanto de conseguir 'remarcar' ciertos caracteres dentro de una celda. Y como una imagen vale más que mil palabras, este es el objetivo y resultado:



Probablemente la idea esté algo más clara ahora...

En un módulo cualquiera de nuestro proyecto de VBA insertamos el siguiente procedimiento:

Sub CambiaFuentePalabra()
'para palabras y Letras.
Dim Rng As Range, celda As Range, posicion As Integer
Dim palabra As String

'rango donde actuamos
Set Rng = Range("B1:B11")
On Error Resume Next
palabra = Application.InputBox(Prompt:="Introduce una palabra o letra", Title:="Para cambiar el color de la fuente de una palabra o letra", Type:=2)
'si se queda vacío salimos del proceso....
If palabra = "" Then Exit Sub

'realizamos la búsqueda para celda del rango
For Each celda In Rng
    'encontramos la posición donde comienza la palabra o letra
     posicion = InStr(1, celda, palabra, vbTextCompare)
        'lanzamos un bucle dentro de cada celda del rango
        'hasta que no encontremos nada
        Do Until posicion = 0
             'cambiamos la Fuente de la palabra o letra a color azul y negrita
             With celda.Characters(posicion, Len(palabra)).Font
                .Color = vbBlue
                .Bold = True
             End With
             'y seguimos buscando en la celda a partir de la última posición encontrada
             posicion = InStr(posicion + 1, celda, palabra, vbTextCompare)
        Loop
Next celda
End Sub



Vemos que el procedimiento es simple, nos pregunta el texto (palabra, letra o caracter) a buscar, y a continuación recorre celda por celda del rango dado (en mi caso B1:B11); y dentro de cada celda realiza un barrido de los caracteres mediante la función de VBA: InStr.

Esta función, bastante empleada, tiene la siguiente sintáxis:
InStr([inicio,] cadena1, cadena2[, comparación])
siendo los argumentos:
inicio (opcional): Expresión numérica que establece la posición inicial para cada búsqueda. Si se omite, la búsqueda comienza en la posición del primer carácter. Si inicio contiene un valor Null, se produce un error. El argumento inicio se requiere si se especifica 'comparación'.
cadena1 (obligatorio): Expresión de cadena en la que se busca.
cadena2 (obligatorio): Expresión de cadena buscada.
comparación (opcional): Especifica el tipo de comparación de cadena. Si compare es Null, ocurre un error. Si se omite 'comparación', el valor Option 'comparación' determina el tipo de comparación, que puede ser:
  1. vbUseCompareOption ó valor -1 := Realiza una comparación con los valores de la instrucción Option 'comparación'.
  2. vbBinaryCompare ó valor 0 := Realiza una comparación binaria.
  3. vbTextCompare o valor 1 := Realiza una comparación textual.
  4. vbDatabaseCompare ó valor 2 := Sólo para Microsoft Access. Realiza una comparación basada en la información en las bases de datos.

6 comentarios:

  1. Increíble, Doy gracias a Dios por el día en que te inspiró hacer este articulo.

    ResponderEliminar
  2. Hola Ismael, excelente post como todos los que publicas. Una pregunta, cómo puedo asignar un rango variable para esta macro? es decir, ya sea sólo una celda o un rango diferente al que especificas en el ejercicio.
    Saludos cordiales!

    ResponderEliminar
    Respuestas
    1. Hola Alberto,
      lo más sencillo es trabajar sobre un campo de una tabla, así la fila 7 sería en vez de
      Set Rng = Range("B1:B11")
      esto otro
      Set Rng = Range("Tabla1[Campo1]")

      Gracias y un saludo!

      Eliminar
  3. Muy buen aporte, pero tengo una duda...¿?

    Necesito completar un cuadro de texto con el resultado de dos celdas, pero con diferente color para destacar una de las celdas... a modo de ejemplo:

    5 cerrados de 8 emitidos - 3 por cerrar

    Lo después del "-" en rojo.
    Los valores y el texto se concatena en diferentes celdas, ya que, vienen de diferentes cálculos.

    Lo ideal sería una función, esto por que, se utiliza en varias concatenaciones diferentes.

    Muchas gracias



    ResponderEliminar
    Respuestas
    1. Hola Alberto,
      la idea sería localizar las posiciones de una parte y otra (de la celda concatenada), y así poderles asignar colores por caracteres...
      En tu caso ayudará ese '-' en medio de la cadena de texto.

      Una función no lo veo factible (no me cierro a la posibilidad), pero es habitual no poder conseguir estos cambios de colores con funciones...

      Saludos

      Eliminar

Nota: solo los miembros de este blog pueden publicar comentarios.