
ループ処理で、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セルくらいあるうちのどのセルに追記するかをその他の条件により判定しています。
セルの何文字目を何色にするかという情報を別に記憶しておいて、
最後に文字のプロパティを変更させることも考えたのですが、
上記のことを考慮すると、あまりスマートなやり方ではないのかなと思いました。
不慣れなためプロパティの考え方が間違っているだけかもしれませんが、
何かいい方法がありましたら、ご教示お願いします。
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
Wendy02様、アドバイスを頂きましてありがとうございます。
急な出張が入り、回答が遅くなってしまいました。申し訳ございません。
また、質問がわかりづらくてすみません。
コードが明かせないわけではなかったのですが、質問の要点を示そうと思い、簡易なプログラムに変更して掲載しました。かえって分かりづらくなってしまい、お手間をお掛けしました。
> スマートかどうかは別として、Fontの一文字に色をつけたとしても、文字列を加えれば、そこで、書式は更新されてしまいます。
文字列を追記した時点で、設定済みの書式は更新してしまうのですね。
設定済みの箇所の書式を残しつつ、追記する方法がもしあったらと思い質問させて頂きました。
Wendy02様に書いて頂いた、サブルーチンを参考にして、最後に書式を設定するプログラムにしたところ、目的を果たすことができました。
本当にありがとうございました。
No.1
- 回答日時:
こんばんは
>「文字列」の箇所は黒字でいいのですが、「文字列」の内容によって、
>「■」の文字色を5色で色分けしたいです。
「■」と「文字列」の列を分ければ解決するように思えます。
公開できないような固有名詞は○○や△△に置き換えても構いませんので、もう少し「どのようなことをやりたいのか」を教えてください。
rukuku様、早速のアドバイスを頂きましてありがとうございます。
急な出張が入り、回答が遅くなりました。お詫び申し上げます。
コードが明かせないということはまったくなかったのですが、質問の要点を示そうと思い、簡易なプログラムに変更して掲載しました。
かえって分かりづらくなってしまい、申し訳ございません。
できあがりのフォーマットは変更することはできず、「■」と「文字列」は同じセルで、しかも複数行を1セルに出力する必要があるのです。
設定済みの箇所の書式を残しつつ、追記する方法がもしあったらと思い質問させて頂いたのですが、そのような方法はなかったようです。
書式を設定しながら追記する方法は諦め、すべての追記が終了後に、書式を設定するプログラムにしたところ、目的を果たすことができました。
本当にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Excel(エクセル) VBAで “:” を含むセルの特定 2 2023/05/11 16:30
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- Visual Basic(VBA) vba 等間隔の列に対しての計算 6 2022/05/17 20:15
- Visual Basic(VBA) VBA 改行コードの取り方 1 2022/03/22 14:14
- Visual Basic(VBA) EXCEL VBA 単語置き換え について質問です ブック名 ぶぶぶ シート名 ししし セル V3〜 3 2023/03/08 01:41
- Excel(エクセル) エクセルの条件付き書式で*を使いたい 4 2022/05/13 16:49
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
VBAでの Replace関数で、ワイル...
-
16表記の文字列を数字に直した...
-
エクセルで文字列の最大値を抽...
-
エクセルでSQLでいうところの「...
-
【Excel VBA】複数ある特定の文...
-
VBA2005 16進を2桁で表示したい。
-
vbsからバッチファイル実行時の...
-
Access2000 (VBA) ' & "など...
-
Excelで3E8を3.00E+8にしない方...
-
VBの「As String * 128」とは?
-
ORCLEでの小数の表示方法の変更...
-
VB6.0のString関数に代わるVB20...
-
エクセル 数値データを桁をそ...
-
C++のdefine文の使い方の質問で...
-
テキストエディタ 検索、置き換...
-
LEFT関数で文字数を指定しない...
-
bashスクリプトでの文字列から...
-
変数に入れた文字列(定数)で書...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
文字列からタブコードを取り除...
-
VBAでの Replace関数で、ワイル...
-
エクセルで文字列をtxtファイル...
-
【Excel VBA】複数ある特定の文...
-
エクセル 数値データを桁をそ...
-
Excelで3E8を3.00E+8にしない方...
-
VBA2005 16進を2桁で表示したい。
-
エクセルで文字列の最大値を抽...
-
同一セル内に関数と文字列を同...
-
Left関数とRight関数を合わせた...
-
Excelで指数表現しないようにす...
-
MS SQLServer のSQLで文字列の...
-
VBの「As String * 128」とは?
-
エクセルでセル内の文字列の最...
-
ORCLEでの小数の表示方法の変更...
-
bashスクリプトでの文字列から...
-
LEFT関数で文字数を指定しない...
-
アクセスで特定の数字以外(複...
おすすめ情報