
次はエクセルで既に設定されている罫線の色を一括変更するプロージャーですが、表形式のシートで実行してみると結構動作が遅いです。高速化できますか?
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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
エクセルVBA 罫線 処理時間短縮
Word(ワード)
-
Application.ScreenUpdating = Falseが効きません
Visual Basic(VBA)
-
エクセルVBA Unionはなぜ遅い?
Visual Basic(VBA)
-
-
4
エクセルVBA コードが同じでもファイルによって処理速度が大きく変わるのはなぜ
Visual Basic(VBA)
-
5
エクセルVBAのEntireRow.Hiddenをスピードアップしたいのですが・・・。
Excel(エクセル)
-
6
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
7
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
8
【Excel VBA】マクロでExcel自体を終了させたい
Excel(エクセル)
-
9
エクセルVBAでシートモジュールでのパブリック変数
Excel(エクセル)
-
10
Excelのセルの色指定をVBAから配列を用いて効率的に行う方法はあり
Visual Basic(VBA)
-
11
マクロを実行すると画像がズレてしまいます
その他(Microsoft Office)
-
12
罫線の色をまとめて変更する
Excel(エクセル)
-
13
VBA 複数の行を高速で削除する方法
その他(プログラミング・Web制作)
-
14
同じマクロのプログラムなのに処理速度が違う
Visual Basic(VBA)
-
15
EXCEL VBA マクロ 実行する度に処理速度がどんどん遅くなる原因が知りたい
Excel(エクセル)
-
16
エクセルのメモリ使用状況/Application.Memoryの代替手段
Visual Basic(VBA)
-
17
エクセル マクロ 標準モジュールのマクロから、シートモジュールのマクロを呼び出す
Excel(エクセル)
-
18
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
19
VBAでワークシートを引数としてサンプル関数に渡したい
Visual Basic(VBA)
-
20
Excel vbaについての質問
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでCOPYを繰り返すと、処理が...
-
【ExcelVBA】5万行以上のデー...
-
【マクロ】開いているブックの...
-
Vba セルの4辺について罫線が有...
-
VBAでユーザーフォームを指定回...
-
Vba Array関数について教えてく...
-
【マクロ】シートの変数へ入れ...
-
算術演算子「¥」の意味について
-
[VB.net] ボタン(Flat)のEnable...
-
vbaにてseleniumを使用したedge...
-
vbsでのwebフォームへの入力制限?
-
エクセルのマクロについて教え...
-
エクセルの改行について
-
【マクロ】並び替えの範囲が、...
-
【マクロ】売上一覧YYYYMMDDHHS...
-
vb.net(vs2022)のtextboxのデザ...
-
エクセルのVBAコードと数式につ...
-
Excelのマクロについて教えてく...
-
ダブルクリックで貼り付けた画...
-
Excelのマクロについて教えてく...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBA 作業後に選択範囲...
-
別のフォームで記述している関...
-
VBAでのユーザフォームの表示有...
-
Excel VBA 選択範囲の罫線色の...
-
エクセル マクロ 別シートから...
-
ascW関数の結果がおかしい
-
ACCESSで別DBにあるクエリを...
-
最小化ボタンで最小化したフォ...
-
Sub Auto_Open() 実行されない
-
ステップモードの動作確認方法
-
BASIC ListViewの選択された行...
-
ExcelVBAで毎月月初の最初にBoo...
-
C++Builderのエラー...
-
Excelのマクロ実行後に動作が重...
-
VBAで選択クエリを実行したらデ...
-
excelのvbaを使って日付を置換...
-
円の中に等間隔に線を引くには
-
メニューバーのイベントが2回...
-
MATLABの乱数生成関数 rand( ) ...
-
エクセル VBA
おすすめ情報