He estado construyendo algunas visualizaciones interesantes que dependen de la capacidad del código VBA para establecer diferentes colores para subcadenas en Excel. Para una celda que contiene una cadena, la sintaxis funciona de la siguiente manera: rCell.Characters(start,end).Font.Color=SomeColour
Color de subcadena de Excel VBA: ¿por qué algunos métodos obvios no funcionan?
Mi aplicación crea las cadenas y establece los valores de color en un paso al agregar nuevas cadenas a los valores existentes y luego establecer el color de la nueva cadena. Esto no funcionó. Comenzando con una cadena completa y luego coloreando múltiples subcadenas funciona.
Dos rutinas simples ilustran la diferencia:
Sub TestColourString1()
'designed to show that substring colour can be done to preexisting string
Dim rngTestString As Range
Set rngTestString = Range("colour_string")
rngTestString.Value = "red green blue"
rngTestString.Characters(1, 4).Font.Color = RGB(255, 0, 0)
rngTestString.Characters(5, 10).Font.Color = RGB(0, 255, 0)
rngTestString.Characters(11, 14).Font.Color = RGB(0, 0, 255)
End Sub
Sub TestColourString2()
'designed to show that setting colour while building string doesn't work
Dim rngTestString As Range
Set rngTestString = Range("colour_string")
rngTestString.Value = "red "
rngTestString.Characters(1, 4).Font.Color = RGB(255, 0, 0)
rngTestString.Value = rngTestString.Value & "green "
rngTestString.Characters(5, 10).Font.Color = RGB(0, 255, 0)
rngTestString.Value = rngTestString.Value & "blue"
rngTestString.Characters(11, 14).Font.Color = RGB(0, 0, 255)
End Sub
Las dos rutinas dan lugar a los dos resultados diferentes que se muestran a continuación:
Para las cadenas más largas con más subsegmentos que es aún peor. Estoy usando Excel 2010.
¿Esto es culpa mía o es un error? ¿Hay una mejor manera de crear y colorear cadenas desde VBA?
+ 1 muy bien hecho y explicado :) –
ciertamente funciona, pero parece una manera torpe de moverse por una limitación en la funcionalidad de la cadena de concatenación. ¿Alguien sabe si esto es intencional o no? –
@matt_black No hay ** funcionalidad de concatenación de cadenas ** en lo que concierne a la propiedad 'Valor '. 'Value = Value &" bar "' es concatenación solo en el lado derecho de la asignación. Para la parte izquierda de la tarea, es lo mismo que 'Value = 'foo bar''. El "valor" setter no intentará analizar el valor recién suministrado para ver si comienza con el valor anterior y, por lo tanto, debe ser 'anexado'. Por lo que tienes en mente, necesitarías un método hipotético de 'AppendText' que 'Range' no tiene. Pero puedes escribir uno usando el código de arriba. – GSerg