2012-07-04 8 views
6

私はExcelで部分文字列に異なる色を設定するVBAコードの機能に依存する興味深い視覚化を構築しています。文字列を含むセルの場合、構文は次のようになります。rCell.Characters(start,end).Font.Color=SomeColourExcel VBAのサブストリングの色付け:なぜ明らかな方法が機能しないのですか?

私のアプリケーションは、既存の値に新しい文字列を追加し、新しい文字列の色を設定することによって文字列を作成し、色の値を設定します。これはうまくいかなかった。完全な文字列で始まり、複数のサブストリングを着色すると、になります。

2つの単純なルーチンが違いを示しています

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 

2つのルーチンは、以下に示す二つの異なる結果になる:より多くのサブセグメントと長い文字列の場合 the image in two cells from excel

それはさらに悪くなります。私はExcel 2010を使用しています。

これは私のせいですかバグですか? VBAから文字列を作成して色分けするには良い方法はありますか?

答えて

7

.Valueを割り当てると、既存のデータに追加する方法が魔法のようには分かりません。古いデータが消去され、新しいデータが格納されます。

文字に色が付いていた場合、最初の文字の色が新しい文字列の色に使用されます。

あなたは、実際の添付が必要な場合は、手動でExcelの数式バーを使用する場合と同じ、そして.Charactersを使用して追加します。マクロでExcelのセルの範囲内(着色含む)

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ナイスリー完了と –

+0

:)説明それは確かに動作しますが、文字列のCONCATENATE機能に制限を回避するために厄介な方法です。誰がこれが意図的かどうかを知っていますか? –

+0

@matt_black関連する 'Value'プロパティまでは**文字列連結機能**がありません。 'Value = Value&" bar "は、代入の右側だけの連結です。代入の左部分については、 'Value = 'foo bar'と同じです。 'Value'セッターは、新たに供給された値を分析して古い値で始まるかどうかを調べることはしないので、 '追加'する必要があります。あなたが思っていることについては、 'Range'にはない' AppendText'メソッドが必要です。しかし、あなたは上記のコードを使って自分自身を書くことができます。 – GSerg

-1

フォーマットsubstrigns 、ビデオを参照してください。

http://youtu.be/O0h6T5Z7HwY

+2

リンクのみの回答はお勧めできません(リンクは時間が経つにつれて古くなる傾向があります)。 答えを編集し、ここに概要を追加することを検討してください。 – kleopatra

関連する問題