2012-07-04 13 views
6

VBA kodunun Excel'deki alt dizeler için farklı renkler ayarlama yeteneğine dayanan bazı ilginç görselleştirmeler yapıyorum. Bir dize içeren bir hücre için bu sözdizimi, bu rCell.Characters(start,end).Font.Color=SomeColourSubstring Excel'den boyama VBA: neden bazı açık yöntemler çalışmıyor?

gibi çalışır. Uygulamam, dizeleri oluşturur ve yeni değerleri varolan değerlere ekleyerek ve ardından yeni dizenin rengini ayarlayarak renk değerlerini tek adımda ayarlar. Bu işe yaramadı. Tam bir dize ile başlayan ve sonra birden fazla alt dizeleri renklendirme çalışır.

İki basit rutinleri farkı göstermektedir:

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 

iki rutinleri aşağıda gösterilen iki farklı sonuçlar neden daha fazla subsegmentli uzun dizeleri için the image in two cells from excel

daha da kötü olduğunu. Excel 2010 kullanıyorum.

Bu benim hatam mı yoksa bir hata mı? VBA'dan dizeleri oluşturmak ve renklendirmek için daha iyi bir yol var mı?

cevap

7

.Value'un atanması, var olan verilere nasıl ekleneceğini sihirli olarak göstermez. Eski verileri siler ve yeni veriyi koyar.

Karakterlerin renklendirmesi durumunda, ilk karakterin rengi yeni dizeyi renklendirmek için kullanılır.

gerçek dosya eklemeyi istiyorsanız, elle Excel'de formül çubuğunu kullanılırsa aynı, o zaman .Characters kullanarak ekleyin:

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 Güzel Done ve kesinlikle çalışır, ancak dize concatenate işlevinde bir sınırlama etrafında almak için garip bir yol gibi görünüyor :) –

+0

açıkladı. Bunun kasıtlı olup olmadığını bilen var mı? –

+0

@matt_black İlgili 'Value' özelliği kadar ** bir dize bitiştirme işlevi yoktur. 'Değer = Değer ve 'çubuk'' yalnızca ödevin sağ tarafında birleşimdir. Ödevin sol kısmı için, 'Değer =' foo bar 'ile aynıdır. 'Değer' dizisi, eski değerle başlayıp başlamadığına bakmak için yeni tedarik edilen değeri analiz etmeyi denemeyecektir ve bu nedenle 'eklenmelidir'. Zihninizde sahip olduğunuz şey için, 'Range''in sahip olmadığı varsayımsal bir' AppendText' yöntemine ihtiyacınız olacaktır. Ancak, yukarıdaki kodu kullanarak kendinizi bir tane yazabilirsiniz. – GSerg

-1

Biçimlendirme (dahil renklendirme) substrigns bir makro ile excel hücre aralığındaki , videoyu izleyin:

http://youtu.be/O0h6T5Z7HwY

+2

Sadece bağlantıya verilen yanıtların kaldırıldığını unutmayın (bağlantılar zamanla bayatmaya eğilimlidir). Lütfen cevabınızı düzenlemeyi ve burada bir özet eklemeyi düşünün. – kleopatra