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=SomeColour
Colorazione 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:
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?
+ 1 ben fatto e spiegato :) –
funziona certo, ma sembra un modo scomodo per aggirare una limitazione nella funzionalità stringa di concatenare. Qualcuno sa se questo è intenzionale o no? –
@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