ご助言いただければ幸いです。
現在、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も見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
Excel VBA : 文字列の属性も含めて結合する方法
Excel(エクセル)
-
テキストをhtml変換するには
Access(アクセス)
-
Excel VBA で Richtextboxを使うことは出来ますか?
Visual Basic(VBA)
-
-
4
EXCEL VBA 文中の書式ごと複写するには
Visual Basic(VBA)
-
5
Excel VBAでn行毎に行の選択
Excel(エクセル)
-
6
ExcelVBAでセルを編集状態にする方法
Excel(エクセル)
-
7
split関数で区切り文字がない場合
Visual Basic(VBA)
-
8
EXCEL VBA 1つのセル内の文字に複数色の色指定について
Visual Basic(VBA)
-
9
エクセルマクロ 赤色の文字を検索するについて
Excel(エクセル)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
StrConvでUnicodeに変換出来な...
-
EXCELのVBAでLenB関数について
-
文字列から、null値を除去する方法
-
ファイル名の一部削除について
-
一番右のスペース以降の文字列...
-
WSTRINGとは?
-
アクセス ステータスバーの文...
-
TextFieldParserの固定長桁数を...
-
VB6.0 文字列のファイル書...
-
CString型 全角半角を意識せず...
-
VBA 変数名に変数を使用したい。
-
コンボボックスのインデックス...
-
構造体配列の特定のメンバーをF...
-
VBとアクセスでSQL文に変...
-
【C#】textBoxの指定行のデータ...
-
RPG 配列宣言について
-
Access 追加クエリについて
-
access vba 『○○件づつ表示』を...
-
INT64対応のprintf系関数はあり...
-
【VB】コンボボックスにデータ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXCELのVBAでLenB関数について
-
ファイル名の一部削除について
-
StrConvでUnicodeに変換出来な...
-
CString型 全角半角を意識せず...
-
TextFieldParserの固定長桁数を...
-
アクセス ステータスバーの文...
-
VBからID3タグをいじる方法
-
一番右のスペース以降の文字列...
-
VB6のテキストボックスに入力し...
-
文字列から、null値を除去する方法
-
エクセルで13,410円を数値の134...
-
VB6.0 文字列のファイル書...
-
ワードのVBAで
-
「シフトJIS X 0213」形式の文...
-
VBScriptで半角カナと半角英数...
-
【Excel VBA】セル内テキストの...
-
機種依存文字と特殊文字について
-
VB.NET ListBox内の前方一致で...
-
バイナリデータの取り方
-
ASC関数
おすすめ情報