domingo, 24 de abril de 2022

56 - Obtener parte del contenido de una celda para dar formato.

 Sabemos dar formato a celdas y rangos: negrita, colores, otra fuente, etc.

Pero ¿cómo podemos dar otro formato a solo parte del contenido parcial de una celda?

Utilizando la función INSTR([posición inicial], cadena donde buscar, cadena a buscar, [coincidencia])

Veamos 2 ejemplos:

Ejemplo 1:  Tenemos una factura (nota de débito, albarán o presupuesto, etc). Y deseamos 'hacer notar' de alguna manera las marcas de los productos facturados.

Lo que se necesita es una columna auxiliar con las marcas de los productos que facturamos. Esta columna se crea directamente desde el mismo código, tomando esa información de la tabla de productos.
Luego se recorrerá esa columna auxiliar en todas las filas de la hoja Factura, cambiando la fuente y color de fuente, no a toda la celda sino solamente al texto encontrado.

Sub marcaNegrita()     'hoja Factura

'x Elsamatilde

'buscar fin de rango en la hoja de productos.... Ajustar al modelo

Set hox = Sheets("Productos")

x = hox.Range("C" & Rows.Count).End(xlUp).Row

'copiar col C a la col auxiliar E y quitar duplicados ... Ajustar al modelo

With hox

    .Columns("C:C").Copy Destination:=.[E1]

    .Range("$E$1:$E$" & x).RemoveDuplicates Columns:=1, Header:=xlYes

    'se guarda el nuevo fin de rango para la col E

    x = .Range("E" & Rows.Count).End(xlUp).Row

End With

'recorre la col E buscando esos textos en la hoja Factura, col B

'se sabe que la lista de productos facturados va de 10 a 13....Ajustar al modelo

For I = 2 To x

    dato = Trim(hox.Range("E" & I).Text)   'se guarda la marca sin posibles espacios

    For y = 10 To 13

        ubica = InStr(1, Range("B" & y), dato, 0)    'se la busca en la celda de la factura, a partir de la posición 1

        If ubica > 0 Then   'si la función InStr devuelve un valor se toma la cadena a partir de esa ubicación

            With Range("B" & y).Characters(ubica, Len(dato)).Font    'la función Len devuelve la longitud del dato

                .FontStyle = "Negrita"

                .ColorIndex = 3

            End With

        End If

    Next y

Next I

MsgBox "Fin del proceso."

End Sub


Ejemplo 2:  A partir de una plantilla o documento modelo, se busca completar los campos modificables mediante un formato en negrita.

Se necesitará una columna con la lista de campos modificables, una columna con los valores con los que se rellenará la plantilla y una hoja auxiliar para dejar el documento formateado listo para imprimir.

Como el documento se rellena con fórmulas utilizando la función BuscarV, luego desde la macro lo que haremos es copiar el rango del documento, en este caso col A:G a la hoja auxiliar, solo valores y formatos. 
Y en esta hoja resultado, recorriendo la col de datos modificables, se irán buscando esos textos en las cadenas de cada fila, marcándolos en negrita.

Sub enNegrita()   'hoja Contrato

'x Elsamatilde

'ultimas filas con datos de la hoja principal, hoja activa

x = Range("K" & Rows.Count).End(xlUp).Row

f = Range("A" & Rows.Count).End(xlUp).Row

'se copia el rango del documento en otra hoja auxiliar, como 'solo valores'

'quitando previamente col utilizadas con anterioridad

Set hox = Sheets("Cto final")     'ajustar el nombre de la hoja auxiliar

hox.Columns("A:G").Delete

Columns("A:G").Copy

    hox.Range("A1").PasteSpecial Paste:=xlValues, Operation:= _

        xlNone, SkipBlanks:=False, Transpose:=False

    hox.Range("A1").PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _

        SkipBlanks:=False, Transpose:=False

'recorre la col de textos a formatear, buscandolos en hoja auxiliar

For I = 2 To x

    If Range("K" & I) <> "" Then

        dato = Trim(Range("K" & I).Text) 'para mantener los formatos de importes y fechas

        For y = 2 To f

            ubica = InStr(1, hox.Range("A" & y), dato, 0)

            If ubica > 0 Then

                With hox.Range("A" & y).Characters(ubica, Len(dato)).Font

                    .FontStyle = "Negrita"

                    '.ColorIndex = 5

                End With

            End If

        Next y

    End If

Next I

'altos de fila

For I = 2 To f

    alto = Range("A" & I).RowHeight

    hox.Range("A" & I).RowHeight = alto

Next I

hox.Select

[A1].Select

MsgBox "Fin del proceso."

End Sub


Descargar libro de ejemplo desde aquí.

Ver video 56 desde aquí.










No hay comentarios.:

Publicar un comentario