
ご助言いただければ幸いです。
現在、Excel2013にて、以下の処理を行おうとしております。
<前提>
A1セルに「ABC123DEF」が記載
※123のみ、文字色が青
<処理内容>
セル内にある文字列の、文字の色が黒以外である場合、
その文字のみを赤に変更する。
<サンプルコード>
Sub Test()
For i = 1 To Len(Range("A1"))
If Range("A1").Characters(i, 1).Font.ColorIndex <> 0 Then
Range("A1").Characters(i, 1).Font.ColorIndex = 3
End If
Next i
End Sub
<相談内容>
いくつかのサイトを参照した結果、Charactersで1文字ずつチェックする方法が主流のようですが、
この方法だと、セルの文字列が長文であった場合、かなりの処理時間がかかってしまいます。
可能でれば、フォントカラーが変更されている範囲、
「ABC」「123」「DEF」をRangeなどで取得し、
その後に一括で着色処理をしたいのですが、書式変更箇所の範囲取得は可能でしょうか。
ご助言いただければ幸いです。
No.1ベストアンサー
- 回答日時:
こんにちは
文字を色などの情報を保持したままオブジェクトとして取得するにはCharacters(start, length) しか方法がないと思いますので、色を順に調べたいのですから、1文字ずつテストするしかないと思います。
若干でも処理を速くできそうな可能性があるのは、ご提示の方法のように変更対象を発見したら即座に1文字ずつ色を変更するのではなく、連続している限りは走査を続け、連続が終わったところでその文字数分だけまとめて色を変更するような仕組みにすることでしょうか?
(対象の文字列にもよりますが、色を変更する処理回数が減るので、速くなる可能性はあります)
対象の文字列の状態によっても時間は変わるので一概には言えませんが、100文字のアルファベットで5か所ほどに異なる色の文字があり、全体で約40%程度の文字の色を変えるというサンプルでテストしてみました。
1行だけでは処理時間の差がわからないので、同じサンプルを100行(=100回)処理した結果の比較をしてみました。
ご提示の方法で約5秒のところが、約3秒になりましたので多少は速くなる可能性があるものと思います。
方法としては上述の通りなので繰り返しになりますが、文字の走査は1文字ずつ順に行い、変更対象があったところから連続して変更するべき文字数を数えます。
連続が終わったところで、その文字数分をまとめて
.Characters(start, length).Font.ColorIndex = 3
で変更するといった要領です。
加えて(どれだけ効果に寄与したかは不明ですが)、複数回同じオブジェクトを参照するのなら、一旦変数に置き換えて参照するようにするか、あるいはwith構文を利用するなどといったことでも短縮を図ってみました。
結果的には
>可能でれば、フォントカラーが変更されている範囲、
>「ABC」「123」「DEF」をRangeなどで取得し
に近いのかもしれませんが、1文字ずつ調べているのは変わりませんし、変更箇所をまとめて.Characters(start, length)で指定しているだけとも言えます。
ご確認ありがとうございます。
実はまとめて着色はすでの実施しております。
どうしても一文字ずつチェック、がボトルネックになってしまうんですよね…。
時間計測までしていただき、ありがとうございました!
No.2
- 回答日時:
こんばんは。
マクロとしては作っていませんが、一旦、web フォーマット(.htm)で保存し、その中で、該当する
>123のみ、文字色が青
<font class="font76749">123</font>
>その文字のみを赤に変更する。
<font class="font66749">123</font>
と置き換えて上げればよいです。
それを保存し、もう一度、Excelで開いて、Excel用のフォーマットに保存し直せばよいです。
ただし、注意点は、Web フォーマットに保存する時に、セル幅が優先されますので、AutoFit で列幅を確保しておく必要があります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXCELのVBAでLenB関数について
-
ファイル名の一部削除について
-
TextFieldParserの固定長桁数を...
-
VB6のテキストボックスに入力し...
-
VBScriptで半角カナと半角英数...
-
アクセス ステータスバーの文...
-
一番右のスペース以降の文字列...
-
機種依存文字と特殊文字について
-
CString型 全角半角を意識せず...
-
「シフトJIS X 0213」形式の文...
-
VBA 変数名に変数を使用したい。
-
VB6.0の「vbFromUnicode」はVB....
-
エクセルでXY座標に並べられた...
-
SQLを発行とは?クエリの作成と...
-
[C#] DataGridViewでコンボボッ...
-
フォームからのデータの受け渡...
-
C#でbyte配列から画像を表示さ...
-
【VB】コンボボックスにデータ...
-
2つ目のレコードの値を取得す...
-
C# DataTableに最後に追加した...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXCELのVBAでLenB関数について
-
ファイル名の一部削除について
-
StrConvでUnicodeに変換出来な...
-
CString型 全角半角を意識せず...
-
一番右のスペース以降の文字列...
-
エンコード・デコードの仕方
-
「シフトJIS X 0213」形式の文...
-
文字列から、null値を除去する方法
-
TextFieldParserの固定長桁数を...
-
VB6のテキストボックスに入力し...
-
VBからID3タグをいじる方法
-
【Excel VBA】セル内テキストの...
-
C#文字コードについて
-
HEX
-
文字列の中に半角文字があるか...
-
ASC関数
-
機種依存文字と特殊文字について
-
Err.Number
-
chrをintに変換すると…
-
C言語とWin32APIで全角かなの...
おすすめ情報