2012-07-04 10 views
6

Ho costruito alcuni effetti grafici interessanti che si basano sulla capacità di codice VBA per impostare diversi colori per sottostringhe in Excel. Per una cella contenente una stringa la sintassi funziona in questo modo rCell.Characters(start,end).Font.Color=SomeColourColorazione delle sottostringhe da Excel VBA: perché alcuni metodi ovvi non funzionano?

La mia applicazione crea le stringhe e imposta i valori del colore in un unico passaggio aggiungendo nuove stringhe ai valori esistenti e quindi impostando il colore della nuova stringa. Questo non ha funzionato. A partire da una stringa completa e quindi la colorazione più sotto-stringhe fa lavoro.

due semplici routine illustrano la differenza:

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 

Le due routine risultato nei due risultati diversi riportati di seguito: the image in two cells from excel

Per le stringhe più lunghe con più sottosegmenti è ancora peggio. Sto usando Excel 2010.

Quindi questo è colpa mia o è un bug? C'è un modo migliore per creare e colorare le stringhe da VBA?

risposta

7

Assegnazione del .Value non magicamente capire come aggiungere ai dati esistenti. Cancella i vecchi dati e inserisce i nuovi dati.

Se i personaggi hanno avuto la colorazione, il colore del primo carattere viene utilizzato per colorare la nuova stringa.

Se si desidera che l'apposizione reale, come se si è utilizzato manualmente la barra della formula in Excel, quindi aggiungere con .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 ben fatto e spiegato :) –

+0

funziona certo, ma sembra un modo scomodo per aggirare una limitazione nella funzionalità stringa di concatenare. Qualcuno sa se questo è intenzionale o no? –

+0

@matt_black Non v'è alcuna funzionalità ** ** concatenare stringa per quanto riguarda la proprietà 'Value' interessato. 'Valore = Valore e" barra "' è la concatenazione solo sul lato destro del compito. Per la parte sinistra del compito, è uguale a "Valore = 'foo bar''. Il setter "Valore" non tenterà di analizzare il valore appena fornito per vedere se inizia con il vecchio valore e quindi dovrebbe essere "aggiunto". Per quello che hai in mente, avresti bisogno di un ipotetico metodo 'AppendText' che' Range' non ha. Ma puoi scriverne uno usando il codice sopra. – GSerg

-1

formattazione (tra cui la colorazione) substrigns in un intervallo di celle di Excel con una macro , vedere il video:

http://youtu.be/O0h6T5Z7HwY

+2

Si noti che le risposte di solo collegamento sono scoraggiate (i collegamenti tendono a diventare obsoleti nel tempo). Si prega di considerare la modifica della risposta e aggiungere una sinossi qui. – kleopatra