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:
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:
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:
- vbUseCompareOption ó valor -1 := Realiza una comparación con los valores de la instrucción Option 'comparación'.
- vbBinaryCompare ó valor 0 := Realiza una comparación binaria.
- vbTextCompare o valor 1 := Realiza una comparación textual.
- vbDatabaseCompare ó valor 2 := Sólo para Microsoft Access. Realiza una comparación basada en la información en las bases de datos.
Increíble, Doy gracias a Dios por el día en que te inspiró hacer este articulo.
ResponderEliminar;-)
Eliminargracias y un saludo
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.
ResponderEliminarSaludos cordiales!
Hola Alberto,
Eliminarlo 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!
Muy buen aporte, pero tengo una duda...¿?
ResponderEliminarNecesito 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
Hola Alberto,
Eliminarla 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