次はエクセルで既に設定されている罫線の色を一括変更するプロージャーですが、表形式のシートで実行してみると結構動作が遅いです。高速化できますか?
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も見ています
-
夏が終わったと感じる瞬間って、どんな時?
まだまだ暑い今日この頃。 しかしながら、もう夏は終わっている!……はず。 あなたが思う「夏が終わった!」エピソードを教えてください。
-
家・車以外で、人生で一番奮発した買い物
どんなものにお金をかけるかは人それぞれの価値観ですが、 誰もが一度は清水の舞台から飛び降りる覚悟で、ちょっと贅沢な買い物をしたことがあるはず。
-
メモのコツを教えてください!
メモを取るのが苦手です。 急いでメモすると内容がごちゃごちゃになってしまったり、ひどいときには全く読めない時もあります。
-
ちょっと先の未来クイズ第4問
11月ごろに発表される、2024年の「新語・流行語大賞」にノミネートされる言葉を書けるだけ書いてください。
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
VBAコードのインデント表示
Visual Basic(VBA)
-
Excel VBA 定義されたプロージャ名、関数名の取得
Visual Basic(VBA)
-
VBAなくなるの?
Visual Basic(VBA)
-
-
4
時間短縮のために、テキストファイルの入出力をメモリを使って出来ないですか?
Visual Basic(VBA)
-
5
Sub 要具ライフ() ActiveSheet.Cells.Find(what:=TOPゴム")."
Visual Basic(VBA)
-
6
Excel-VBAのmsgBox()の不思議
Visual Basic(VBA)
-
7
VBA SaveChanges 上書きされない
Visual Basic(VBA)
-
8
VBAでCOPYを繰り返すと、処理が途中でアイドルする原因はなんでしょうか
Visual Basic(VBA)
-
9
Excel_VBAについて質疑です。(for~next)
Visual Basic(VBA)
-
10
VBA コードどこがおかしいですか?
Visual Basic(VBA)
-
11
VBAの間違い教えて下さい
Visual Basic(VBA)
-
12
現在のブックを閉じないで、マクロ抜きの(現在のブックの)コピーを作成したい
Visual Basic(VBA)
-
13
エクセルVBA
Visual Basic(VBA)
-
14
ExcelVBAマクロで実行した時の疑問
Visual Basic(VBA)
-
15
Vba ファイル書き込み時に書き込みエラーを回避する方法を教えてください
Visual Basic(VBA)
-
16
再質問です。マクロの修正箇所を教えてください。
Excel(エクセル)
-
17
IF文、条件分岐の整理方法
Visual Basic(VBA)
-
18
以下のコードを実行しても、オブジェクト変数または、withブロック変数が設定されていませんとエラーが
Visual Basic(VBA)
-
19
エクセルVBAにて =A1=B1とすれば A1とB1のセル内容が一緒だった場合 TRUE 違っていれ
Visual Basic(VBA)
-
20
VBA 複数条件の分岐処理の上手な方法
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBA 作業後に選択範囲...
-
別のフォームで記述している関...
-
ascW関数の結果がおかしい
-
エクセル マクロ 別シートから...
-
Excelのマクロ実行後に動作が重...
-
ACCESSで別DBにあるクエリを...
-
Excel VBA 選択範囲の罫線色の...
-
VBAでのユーザフォームの表示有...
-
エクセルVBAのコードで質問です...
-
Sub Auto_Open() 実行されない
-
メニューバーのイベントが2回...
-
excelのvbaを使って日付を置換...
-
エクセルのVBAにショートカット...
-
ExcelVBAで毎月月初の最初にBoo...
-
Excelで、チェックボックスにチ...
-
円の中に等間隔に線を引くには
-
Visual Basic 6.0のフォームの...
-
最小化ボタンで最小化したフォ...
-
Javascriptのコールバック関数...
-
エクセルで条件をつけて図形を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBA 作業後に選択範囲...
-
別のフォームで記述している関...
-
Excelのマクロ実行後に動作が重...
-
ascW関数の結果がおかしい
-
Sub Auto_Open() 実行されない
-
VBAでのユーザフォームの表示有...
-
エクセル マクロ 別シートから...
-
ACCESSで別DBにあるクエリを...
-
最小化ボタンで最小化したフォ...
-
GetAsyncKeyState() を利用する...
-
ExcelVBAで毎月月初の最初にBoo...
-
Excelで、チェックボックスにチ...
-
ステップモードの動作確認方法
-
Pycharmにおいてturtle を使う方法
-
メニューバーのイベントが2回...
-
excelのvbaを使って日付を置換...
-
円の中に等間隔に線を引くには
-
excel2010でボタンが反応しなく...
-
エクセルVBAのコードで質問です...
-
エクセルのVBAにショートカット...
おすすめ情報