2012-07-04 16 views
6

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=SomeColourColor 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: the image in two cells from excel

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?

Respuesta

7

Al asignar .Value, mágicamente no se explica cómo anexar a los datos existentes. Borra los datos antiguos y pone los nuevos datos.

Si los caracteres tienen color, el color del primer carácter se usa para colorear la nueva cuerda.

Si desea que la Anexión real, igual que si se ha utilizado manualmente la barra de fórmulas en Excel, a continuación, añadir usando .Characters:

Dim rngTestString As Range 

Set rngTestString = Range("colour_string") 

Range("colour_string").Characters(Len(Range("colour_string").Value) + 1).Text = "red " 
rngTestString.Characters(1, 4).Font.Color = RGB(255, 0, 0) 

Range("colour_string").Characters(Len(Range("colour_string").Value) + 1).Text = "green " 
rngTestString.Characters(5, 10).Font.Color = RGB(0, 255, 0) 

Range("colour_string").Characters(Len(Range("colour_string").Value) + 1).Text = "blue" 
rngTestString.Characters(11, 14).Font.Color = RGB(0, 0, 255) 
+2

+ 1 muy bien hecho y explicado :) –

+0

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? –

+0

@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

-1

de formato (incluyendo colorante) substrigns en una gama de celdas de Excel con una macro , ver el video:

http://youtu.be/O0h6T5Z7HwY

+2

Tenga en cuenta que las respuestas de solo enlace no se recomiendan (los enlaces tienden a quedarse obsoletos a lo largo del tiempo). Considere editar su respuesta y agregar una sinopsis aquí. – kleopatra