次はエクセルで既に設定されている罫線の色を一括変更するプロージャーですが、表形式のシートで実行してみると結構動作が遅いです。高速化できますか?
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も見ています
-
これまでで一番「情けなかったとき」はいつですか?
これまでの人生で一番「情けない」と感じていたときはいつですか? そこからどう変化していきましたか?
-
人生最悪の忘れ物
今までの人生での「最悪の忘れ物」を教えてください。 私の「最悪の忘れ物」は「財布」です。
-
「これはヤバかったな」という遅刻エピソード
寝坊だったり、不測の事態だったり、いずれにしても遅刻の思い出はいつ思い出しても冷や汗をかいてしまいますよね。
-
この人頭いいなと思ったエピソード
一緒にいたときに「この人頭いいな」と思ったエピソードを教えてください
-
お風呂の温度、何℃にしてますか?
みなさん、家のお風呂って何℃で入ってますか? ぬるめのお湯にゆったり…という方もいれば、熱いのが好き!という方もいるかと思います。 我が家は平均的(?)な42℃設定なのですが、みなさんのご家庭では何℃に設定していますか?
-
VBAコードのインデント表示
Visual Basic(VBA)
-
VBAなくなるの?
Visual Basic(VBA)
-
時間短縮のために、テキストファイルの入出力をメモリを使って出来ないですか?
Visual Basic(VBA)
-
-
4
Excel VBA 定義されたプロージャ名、関数名の取得
Visual Basic(VBA)
-
5
Excel-VBAのmsgBox()の不思議
Visual Basic(VBA)
-
6
Sub 要具ライフ() ActiveSheet.Cells.Find(what:=TOPゴム")."
Visual Basic(VBA)
-
7
VBA SaveChanges 上書きされない
Visual Basic(VBA)
-
8
Excel_VBAについて質疑です。(for~next)
Visual Basic(VBA)
-
9
VBA コードどこがおかしいですか?
Visual Basic(VBA)
-
10
VBAでCOPYを繰り返すと、処理が途中でアイドルする原因はなんでしょうか
Visual Basic(VBA)
-
11
VBAの間違い教えて下さい
Visual Basic(VBA)
-
12
エクセルVBA
Visual Basic(VBA)
-
13
ExcelVBAマクロで実行した時の疑問
Visual Basic(VBA)
-
14
Vba ファイル書き込み時に書き込みエラーを回避する方法を教えてください
Visual Basic(VBA)
-
15
現在のブックを閉じないで、マクロ抜きの(現在のブックの)コピーを作成したい
Visual Basic(VBA)
-
16
再質問です。マクロの修正箇所を教えてください。
Excel(エクセル)
-
17
IF文、条件分岐の整理方法
Visual Basic(VBA)
-
18
VBAで大量のファイルをシート名ごとに転記やらいろいろしたい!
Visual Basic(VBA)
-
19
プログラミング
Visual Basic(VBA)
-
20
【ExcelVBA】値を変更しながら連続でPDFを作成し,ファイル名を自動で付して出力するコード
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAで特定の文字が入った行をコ...
-
Excelのマクロについて教えてく...
-
VBAのエラー表示の対処法について
-
VBA 別ブックからコピペしたい...
-
Excelのマクロについて教えてく...
-
Excel 範囲指定スクショについ...
-
【ExcelVBA】インデックスが有...
-
VBAのループ処理について教えて...
-
エクセルでCDOを使ったメール送...
-
EXCEL vbaでシート上に配置した...
-
Excel_VBAについて質疑です。(...
-
【ExcelVBA】dictionaryの重複...
-
VBAでセルの書式を変えずに文字...
-
修正依頼:【VBA】 結合セルに...
-
Excelのマクロについて教えてく...
-
Excelのマクロについて教えてく...
-
Web画面の文字をVB6で取得したい
-
[VB.net] ボタン(Flat)のEnable...
-
エクセルのVBAコードについて教...
-
エクセルvbaの対象セルに色をつ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBA 作業後に選択範囲...
-
別のフォームで記述している関...
-
Excel VBA 選択範囲の罫線色の...
-
VBAでのユーザフォームの表示有...
-
Sub Auto_Open() 実行されない
-
エクセル マクロ 別シートから...
-
ascW関数の結果がおかしい
-
ACCESSで別DBにあるクエリを...
-
ExcelVBAで毎月月初の最初にBoo...
-
最小化ボタンで最小化したフォ...
-
円の中に等間隔に線を引くには
-
Visual Basic 6.0のフォームの...
-
メニューバーのイベントが2回...
-
Excelのマクロ実行後に動作が重...
-
ステップモードの動作確認方法
-
excelのvbaを使って日付を置換...
-
エクセルのVBAにショートカット...
-
Excel VBAのステップイン
-
Excelで、チェックボックスにチ...
-
GetAsyncKeyState() を利用する...
おすすめ情報