プロが教えるわが家の防犯対策術!

ループ処理で、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セルくらいあるうちのどのセルに追記するかをその他の条件により判定しています。

セルの何文字目を何色にするかという情報を別に記憶しておいて、
最後に文字のプロパティを変更させることも考えたのですが、
上記のことを考慮すると、あまりスマートなやり方ではないのかなと思いました。

不慣れなためプロパティの考え方が間違っているだけかもしれませんが、
何かいい方法がありましたら、ご教示お願いします。

A 回答 (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
    • good
    • 0
この回答へのお礼

Wendy02様、アドバイスを頂きましてありがとうございます。
急な出張が入り、回答が遅くなってしまいました。申し訳ございません。

また、質問がわかりづらくてすみません。
コードが明かせないわけではなかったのですが、質問の要点を示そうと思い、簡易なプログラムに変更して掲載しました。かえって分かりづらくなってしまい、お手間をお掛けしました。

> スマートかどうかは別として、Fontの一文字に色をつけたとしても、文字列を加えれば、そこで、書式は更新されてしまいます。

文字列を追記した時点で、設定済みの書式は更新してしまうのですね。
設定済みの箇所の書式を残しつつ、追記する方法がもしあったらと思い質問させて頂きました。
Wendy02様に書いて頂いた、サブルーチンを参考にして、最後に書式を設定するプログラムにしたところ、目的を果たすことができました。
本当にありがとうございました。

お礼日時:2009/12/15 10:45

こんばんは



>「文字列」の箇所は黒字でいいのですが、「文字列」の内容によって、
>「■」の文字色を5色で色分けしたいです。

「■」と「文字列」の列を分ければ解決するように思えます。

公開できないような固有名詞は○○や△△に置き換えても構いませんので、もう少し「どのようなことをやりたいのか」を教えてください。
    • good
    • 0
この回答へのお礼

rukuku様、早速のアドバイスを頂きましてありがとうございます。
急な出張が入り、回答が遅くなりました。お詫び申し上げます。

コードが明かせないということはまったくなかったのですが、質問の要点を示そうと思い、簡易なプログラムに変更して掲載しました。
かえって分かりづらくなってしまい、申し訳ございません。

できあがりのフォーマットは変更することはできず、「■」と「文字列」は同じセルで、しかも複数行を1セルに出力する必要があるのです。
設定済みの箇所の書式を残しつつ、追記する方法がもしあったらと思い質問させて頂いたのですが、そのような方法はなかったようです。

書式を設定しながら追記する方法は諦め、すべての追記が終了後に、書式を設定するプログラムにしたところ、目的を果たすことができました。
本当にありがとうございました。

お礼日時:2009/12/15 10:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!