• ベストアンサー

VBAで、セルの一部の文字色を変更するプログラムで困っています

ループ処理で、1つのセルに次のように1行ずつ追記するプログラムを作成しようとしています。 ■文字列1 ■文字列2 ■文字列3   : セル内で改行したいので、2行目以降はChr(10)でつないでいます。 「文字列」の箇所は黒字でいいのですが、「文字列」の内容によって、「■」の文字色を5色で色分けしたいです。 色は「文字列」の内容によって決まるので、あるときは、1行目の「■」は緑、2行目の「■」はピンク、…であっても、 またあるときは、1行目の「■」はピンク、2行目の「■」は青、…というように、可変です。 そこで、次のようなソースを書いたのですが、うまくいきません。  For i = 1 to 10   out_str = "■" & mojiretsu(i)   Cells(i, j).Select   outchar_start = Len(ActiveCell.Value)   If outchar_start = 0 Then     ActiveCell.Value = out_str   Else     ActiveCell.Value = ActiveCell.Value + Chr(10) + out_str   End If   ActiveCell.Characters(Start:=outchar_start + 1, Length:=1).Font.color _     = RGB(ReturnColor(mojiretsu(i), RR), _        ReturnColor(mojiretsu(i), GG), _        ReturnColor(mojiretsu(i), BB))   ActiveCell.Characters(Start:=outchar_start + 2).Font.color = RGB(0, 0, 0)  Next   ※ ReturnColor関数は、文字列の内容に応じて、RGBのコードを返す自作の関数です。 1回目のループ終了後は、「■」のみ色がつき、「文字列」は黒字という状態なのですが、 2回目以降のループが実行されると、セルのすべての文字に色が付いてしまいます。 (ActiveCell.Value = ActiveCell.Value + Chr(10) + out_str で上書きしているので、その時点で文字のプロパティが無効になってしまうのでしょうか??) ちなみに、上のソースでは、説明の便宜上、For文で10回ループさせていますが、 実際はテキストファイルを読込み、そのファイルの行数によって、1セルに書きだす行数が決まりますので、 何行出力させるかは、固定ではありません。 また、追記させるセルも1セルだけではなく、50セルくらいあるうちのどのセルに追記するかをその他の条件により判定しています。 セルの何文字目を何色にするかという情報を別に記憶しておいて、 最後に文字のプロパティを変更させることも考えたのですが、 上記のことを考慮すると、あまりスマートなやり方ではないのかなと思いました。 不慣れなためプロパティの考え方が間違っているだけかもしれませんが、 何かいい方法がありましたら、ご教示お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 何か、質問内容と、コードが一致していないように思うのですが、何か不足しているのでしょうか? たぶん、アイデア倒れの気がします。本来は、二つの要件をひとつにまとめてしまったことが問題を作ってしまっているのだと思います。もちろん、複雑にすれば可能だと思いますが、回答者側では、文字列が、どのようにして加えていくかは、分からないし、すべてのコードとデータが明かされない限りは良く理解できません。それと、Excel のVersion にもよりますが、ColorIndex で色を加えればよいと思います。 そこで、 ActiveCell.Value = ActiveCell.Value + Chr(10) + out_str これに文字列(mojiretsu)を加えていくということは、それは、そのままにしておいて、文字に色を加えることは別けて、最後にしたほうがよいですね。スマートかどうかは別として、Fontの一文字に色をつけたとしても、文字列を加えれば、そこで、書式は更新されてしまいます。 このサブルーチンの意味は分かると思いますから、細かくは説明しません。 '------------------------------------------- Sub ChangeFontColor(ByVal rng As Range) Dim i As Long Dim j As Long Dim ar As Variant ar = Array(3, 5, 7, 8, 10) '赤,青,ピンク,水色, 緑 For i = 1 To Len(rng.Value)  With rng.Characters(i, 1)   If .Text = "■" Then    .Font.ColorIndex = ar(j)    j = j + 1   End If  End With Next i End Sub

yuri_tti
質問者

お礼

Wendy02様、アドバイスを頂きましてありがとうございます。 急な出張が入り、回答が遅くなってしまいました。申し訳ございません。 また、質問がわかりづらくてすみません。 コードが明かせないわけではなかったのですが、質問の要点を示そうと思い、簡易なプログラムに変更して掲載しました。かえって分かりづらくなってしまい、お手間をお掛けしました。 > スマートかどうかは別として、Fontの一文字に色をつけたとしても、文字列を加えれば、そこで、書式は更新されてしまいます。 文字列を追記した時点で、設定済みの書式は更新してしまうのですね。 設定済みの箇所の書式を残しつつ、追記する方法がもしあったらと思い質問させて頂きました。 Wendy02様に書いて頂いた、サブルーチンを参考にして、最後に書式を設定するプログラムにしたところ、目的を果たすことができました。 本当にありがとうございました。

その他の回答 (1)

  • rukuku
  • ベストアンサー率42% (401/933)
回答No.1

こんばんは >「文字列」の箇所は黒字でいいのですが、「文字列」の内容によって、 >「■」の文字色を5色で色分けしたいです。 「■」と「文字列」の列を分ければ解決するように思えます。 公開できないような固有名詞は○○や△△に置き換えても構いませんので、もう少し「どのようなことをやりたいのか」を教えてください。

yuri_tti
質問者

お礼

rukuku様、早速のアドバイスを頂きましてありがとうございます。 急な出張が入り、回答が遅くなりました。お詫び申し上げます。 コードが明かせないということはまったくなかったのですが、質問の要点を示そうと思い、簡易なプログラムに変更して掲載しました。 かえって分かりづらくなってしまい、申し訳ございません。 できあがりのフォーマットは変更することはできず、「■」と「文字列」は同じセルで、しかも複数行を1セルに出力する必要があるのです。 設定済みの箇所の書式を残しつつ、追記する方法がもしあったらと思い質問させて頂いたのですが、そのような方法はなかったようです。 書式を設定しながら追記する方法は諦め、すべての追記が終了後に、書式を設定するプログラムにしたところ、目的を果たすことができました。 本当にありがとうございました。

関連するQ&A

専門家に質問してみよう