
ご助言いただければ幸いです。
現在、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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 指定文字列が該当するA列をアクティブセルにするには 3 2022/08/17 13:18
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) エクセルVBA ダブルクリックしたら色反転を指定したセルのみにしたい 2 2022/04/06 12:52
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
- Visual Basic(VBA) データのある範囲を選択するVBAについて 2 2022/09/03 00:20
- Excel(エクセル) エクセルの数式で教えてください。 1 2023/02/15 08:30
- Visual Basic(VBA) 正規表現を用いての並び替え 7 2022/04/04 09:27
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ファイル名の一部削除について
-
EXCELのVBAでLenB関数について
-
一番右のスペース以降の文字列...
-
TextFieldParserの固定長桁数を...
-
機種依存文字と特殊文字について
-
文字列の中の1文字を比較するに...
-
StrConvでUnicodeに変換出来な...
-
エクセルで13,410円を数値の134...
-
「シフトJIS X 0213」形式の文...
-
CString型 全角半角を意識せず...
-
VBからID3タグをいじる方法
-
文字の並び替え
-
VB.NET ListBox内の前方一致で...
-
VC++ の コンパイルオプション
-
urlencodeがうまくいかない
-
VBA 変数名に変数を使用したい。
-
『列名 '担当者CD' があいま...
-
構造体配列の特定のメンバーをF...
-
定数配列の書き方
-
SQLを発行とは?クエリの作成と...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXCELのVBAでLenB関数について
-
一番右のスペース以降の文字列...
-
ファイル名の一部削除について
-
TextFieldParserの固定長桁数を...
-
StrConvでUnicodeに変換出来な...
-
CString型 全角半角を意識せず...
-
文字列から、null値を除去する方法
-
機種依存文字と特殊文字について
-
アクセス ステータスバーの文...
-
マルチバイト混在の文字列整形
-
ASC関数
-
WSTRINGとは?
-
全角文字と半角文字を判別して...
-
「シフトJIS X 0213」形式の文...
-
Access VBAの参照設定(DAO)につ...
-
エクセルで13,410円を数値の134...
-
HEX
-
VB6のテキストボックスに入力し...
-
【Excel VBA】セル内テキストの...
-
C言語とWin32APIで全角かなの...
おすすめ情報