
次はエクセルで既に設定されている罫線の色を一括変更するプロージャーですが、表形式のシートで実行してみると結構動作が遅いです。高速化できますか?
Sub 罫線色変更()
Application.ScreenUpdating = False
Dim r As Range
Dim i As Long
Application.Dialogs(xlDialogEditColor).Show (1)
For Each r In Selection
For i = 7 To 10
If r.Borders(i).LineStyle <> xlNone Then
r.Borders(i).Color = ActiveWorkbook.Colors(1)
End If
Next i
Next r
Application.ScreenUpdating = True
End Sub
No.9ベストアンサー
- 回答日時:
RangeをFor Eachでループしているように、BorderもFor Eachでループした方が早いと思います。
実際にやってみて、処理時間を報告して頂けると嬉しいです。その際、選択した(処理した)行列数もよろしくです。
回答ありがとうございます。
ご助言のとおり処理時間が過去1番早くなりました!
よろしければ、その理屈を教えていただけると嬉しいです。
参考までに、13万個のセルの表罫線について処理した結果は「7秒」でした。
※先の回答者様の、隣合うセルの共通罫線の走査の無駄を排除した場合のコードでは9秒
※罫線色 = ActiveWorkbook.Colors(1) の工夫による処理速度の向上は僅かでした
※何も工夫しないこのQAの最初のコードは15秒
Sub 罫線色変更その4() ' For Each obj In r.Borders作戦
Dim start As Variant, finish As Variant
start = Time
Application.ScreenUpdating = False
Dim 罫線色 As Double
Application.Dialogs(xlDialogEditColor).Show (1)
罫線色 = ActiveWorkbook.Colors(1)
Dim r As Range
Dim obj As Object
For Each r In Selection
For Each obj In r.Borders
If obj.LineStyle <> xlNone Then obj.Color = 罫線色
Next obj
Next r
Application.ScreenUpdating = True
finish = Time
MsgBox Format(finish - start, "nn分ss秒")
Debug.Print Format(finish - start, "nn分ss秒")
End Sub
No.7
- 回答日時:
No4です。
>表形式のシートで実行してみると結構動作が遅いです。
表形式のシートということなので、No4のように
「選択範囲のすべてのセルが全く等しく罫線をもっている」という前提かと思いましたが、前提が違うようですね。
>今回は、各セルの罫線の状態が異なる場合を想定していました。
ということなので、役に立たないかもしれませんが、
「選択範囲のすべてのセルが全く等しく罫線をもっている」場合のマクロです。
以下のようにしてください。
Sub 罫線色変更()
Application.ScreenUpdating = False
Application.Dialogs(xlDialogEditColor).Show (1)
Selection.Borders.Color = ActiveWorkbook.Colors(1)
Application.ScreenUpdating = True
End Sub
回答ありがとうございます。
「表形式」という言葉から想像を巡らしていただきありがとうございました。表形式ではありますが、異種の罫線が混じっていることを想定しておりました。
コードをご紹介していただきありがとうございました。
No.6
- 回答日時:
>colr ですが、Double型にする必要はありますか?
独学なので習慣というか・・確か?どこかで覚えたような気がする程度です
少し調べました と言いてもVBEのオブジェクトブラウザーで
Excelライブラリ Bordersクラスの Colorメンバーで見ると
Property Color As Variant
Excel.Borders のメンバー
とあります という事は Variant ですね
これは取得できなかった時にEmptyを返す必要があるのかもしれません?
簡単に確かめると
Sub a()
Dim c As Variant
c = Range("A1").Borders(7).Color
Debug.Print TypeName(c) 'Double
End Sub
Doubleと出力されます
Variant/Double なのですね
必要があるかはわかりません
ただ、処理速度という意味ではVariant型は使わない方が良いというのも
昔どこかで見た覚えがありますのでAs Double としました
あやふやな情報(記憶)になりますので確認が必要と思います
回答ありがとうございます。
お時間をさいてTypeを調べ、その調べたコードまでご紹介いただきありがとうございました。当方でもVBEで上記コードを試し、Doubleとなることを確認いたしました。
ありがとうございます。
No.5
- 回答日時:
こんばんは 既にある回答と重複いたしますが
Selectionの形状とLineの有無の形で処理を短絡(範囲を一度に設定)できない状態になりますので 複雑な状態(ランダムな選択範囲と飛び飛びな罫線)での処理手順は 示されているような手順になるかと思います
ご質問に示されているコードで少しでもという事でしたら
#3様が回答されている事とオブジェクトなのでWith でくくり さらに
条件(同色の場合の処理をしない)を増やすくらいでしょうか・・・
早くなるといってもわずか かも
Dim r As Range
Dim i As Long
Dim colr As Double
Application.Dialogs(xlDialogEditColor).Show (1)
colr = ActiveWorkbook.Colors(1)
Application.ScreenUpdating = False
For Each r In Selection
For i = 7 To 10
With r.Borders(i)
If .LineStyle <> xlNone Then
If .Color <> colr Then .Color = colr
End If
End With
Next i
Next r
Application.ScreenUpdating = True
回答ありがとうございます。
Withステートメントについても反映してみました。劇的な処理速度の向上にはなっていませんが、Withステートメントによって処理が高速化するといくインターネトの記事もありましたので、新たな気づきになりました。
colr ですが、Double型にする必要はありますか?
No.3
- 回答日時:
> ActiveWorkbook.Colors(1)
これを変数に代入して だけ参照するようにすれば
かなり速くなると思われます。
Dim col As Long
Application.Dialogs(xlDialogEditColor).Show (1)
col = ActiveWorkbook.Colors(1)
For Each r In Selection
For i = 7 To 10
If r.Borders(i).LineStyle <> xlNone Then
r.Borders(i).Color = col
回答ありがとうございます。
教えていただいたとおりにコードを修正しました。
「かなり」とまではいきませんが、少し処理が早くなった印象があります。
ありがとうございます。
No.2
- 回答日時:
現在のマクロは、選択された範囲内のセルの罫線の有無を判定し、罫線がある場合に、色付けを行っています。
もし、選択された範囲には必ず罫線があるものとして、色付けを行ってよいなら、高速化は可能です。
その場合は、罫線がある範囲を選択してマクロを実行することになりますが、いかがでしょうか。それで良ければ、マクロの提供は可能です。
回答ありがとうございます。
「罫線がある」について詳しく教えてください。
セルには、上下左右や対角線などの罫線がありますが、「選択した範囲のいずれかのセルについて、いずれかの罫線が少なくとも1つ存在する」という解釈でしょうか?それとも、「選択範囲のすべてのセルが全く等しく罫線をもっている」という解釈でしょうか?
No.1
- 回答日時:
こんばんは
簡単にテストしてみましたが・・
VBAで時間がかかる原因のひとつに、シート情報へのアクセスがあります。
罫線の有無をチェックせずに、色をまとめてセットするだけで上手く行かないかと思いましたが、罫線が設定されていない部分にまで罫線が引かれてしまうようで、どうやら、ご提示のように一つ一つの罫線をチェックして設定せざるを得ないようですね。
とはいえ、対象が表であるなら、隣接するセル間の罫線を重複して2回処理していることになりますので、2辺だけをチェックするロジックに変えればだいぶ速くできそうであろうと考えてみました。
上記でチェックできない外側の2辺(=1行と1列分)はそれぞれ別にチェックすることになりますが、処理量が「半分+α(=6割以下程度か?)」くらいになることが期待できます。
簡単なものでテストしてみると、期待には届かず、約6.5割くらいの処理時間(=約3.5割減)となりました。
ただし、上記は選択が単純な矩形エリアの場合を想定していますので、複数のエリアを選択することも許容する場合には、処理のロジックとして、エリア毎に処理するようにしないと上手くいきません。(Area属性は矩形なので)
こちらの場合でも大きくは変わらないと思いますが、もう少し時間がかかる可能性はあります。
速度は大幅には向上しませんけれど、多少なりとも速くはなりますので、ご参考までに。
回答ありがとうございます。
「シート情報のアクセスに時間がかかる」は覚えておきたいな、と参考になりました。今回の処理の高速化について、根本的な解決法は難しい(無いかもしれない)のですね。判定の重複を避けて効率化する視点は参考になります。数十パーンセントの時間の削減 と コードの可読性 のどちらを優先するかを考えていきます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA 罫線について B列3行目から21行毎にデータがはいります。 データがはいったらデータが入った 6 2022/11/15 17:22
- Visual Basic(VBA) VBAの繰り返し処理について教えてください。 3 2022/08/02 13:21
- Visual Basic(VBA) 重複確認 2 2024/06/30 12:17
- Visual Basic(VBA) VBAが止まります。 1 2022/09/02 14:51
- Excel(エクセル) VBA Private Sub Worksheet_Changeで 1 2024/05/01 16:59
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Visual Basic(VBA) xmlドキュメントから別拡張子で保存したい 4 2023/09/12 11:08
- Visual Basic(VBA) 動きっぱなしです。止め方とプロシージャの間違いを教えて下さい! 5 2022/08/15 23:08
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) VBA 1 2024/02/03 22:51
このQ&Aを見た人はこんなQ&Aも見ています
-
好きな人を振り向かせるためにしたこと
大好きな人と会話のきっかけを少しでも作りたい、意識してもらいたい…! 振り向かせるためにどんなことをしたことがありますか?
-
人生最悪の忘れ物
今までの人生での「最悪の忘れ物」を教えてください。 私の「最悪の忘れ物」は「財布」です。
-
今の日本に期待することはなんですか?
目まぐるしく、日本も世界も状況が変わる中、あなたが今の日本に期待することはなんですか?
-
コーピングについて教えてください
皆さんはストレスを感じたとき、どのような方法や手段、テクニックで対処していますか?
-
泣きながら食べたご飯の思い出
泣きながら食べたご飯の思い出を教えてください。
-
VBAコードのインデント表示
Visual Basic(VBA)
-
時間短縮のために、テキストファイルの入出力をメモリを使って出来ないですか?
Visual Basic(VBA)
-
エクセルVBA 罫線 処理時間短縮
Word(ワード)
-
-
4
VBAでCOPYを繰り返すと、処理が途中でアイドルする原因はなんでしょうか
Visual Basic(VBA)
-
5
Excel_VBAについて質疑です。(for~next)
Visual Basic(VBA)
-
6
VBA コードどこがおかしいですか?
Visual Basic(VBA)
-
7
VBAの間違い教えて下さい
Visual Basic(VBA)
-
8
再質問です。マクロの修正箇所を教えてください。
Excel(エクセル)
-
9
IF文、条件分岐の整理方法
Visual Basic(VBA)
-
10
Vba ファイル書き込み時に書き込みエラーを回避する方法を教えてください
Visual Basic(VBA)
-
11
ExcelVBAマクロで実行した時の疑問
Visual Basic(VBA)
-
12
VBA 2次元配列の出力
Visual Basic(VBA)
-
13
Excel(M365) Vlookup/セル反転(VBA)について
Visual Basic(VBA)
-
14
【ExcelVBA】値を変更しながら連続でPDFを作成し,ファイル名を自動で付して出力するコード
Visual Basic(VBA)
-
15
データチェックを行うエクセルマクロをおしえてほしい
Excel(エクセル)
-
16
VBA初心者です。次のVBAコードで、17行目を削除したいのですがうまく動きません 改善策を教えてく
Visual Basic(VBA)
-
17
エクセル タブの下のメニューを選択 実行するコード
Visual Basic(VBA)
-
18
VBAでセルの書式を変えずに文字列を置換する方法をご教示ください
Visual Basic(VBA)
-
19
VBAのエラー表示の対処法について
Visual Basic(VBA)
-
20
VBの色を変えるにはどうしたらいいですか?
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBA 作業後に選択範囲...
-
VBAでのユーザフォームの表示有...
-
Excelのマクロ実行後に動作が重...
-
ステップモードの動作確認方法
-
C++Builderのエラー...
-
エクセル マクロ 別シートから...
-
別のフォームで記述している関...
-
excelのvbaを使って日付を置換...
-
Excel VBA 選択範囲の罫線色の...
-
エクセルで条件をつけて図形を...
-
ワードで、グレーの部分しか入...
-
家電量販店で購入した新品ゲー...
-
エクセルでの6ヶ月平均の出し方
-
VB6でXMLを作成すると変になります
-
ツールバーの「ファイル(F)、...
-
メフィスト賞の応募歴は無しだ...
-
EXCELで選択範囲の中で、上から...
-
エクセルで非表示行を抜かして...
-
翻訳API
-
Google Mapsを利用して屋根の面...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBA 作業後に選択範囲...
-
別のフォームで記述している関...
-
VBAでのユーザフォームの表示有...
-
エクセル マクロ 別シートから...
-
Sub Auto_Open() 実行されない
-
Excel VBA 選択範囲の罫線色の...
-
ascW関数の結果がおかしい
-
ACCESSで別DBにあるクエリを...
-
Excel VBAのステップイン
-
最小化ボタンで最小化したフォ...
-
ExcelVBAで毎月月初の最初にBoo...
-
円の中に等間隔に線を引くには
-
メニューバーのイベントが2回...
-
Excelのマクロ実行後に動作が重...
-
Excelで、チェックボックスにチ...
-
GetAsyncKeyState() を利用する...
-
ステップモードの動作確認方法
-
エクセルのVBAにショートカット...
-
excelのvbaを使って日付を置換...
-
C++Builderのエラー...
おすすめ情報