[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『マクロコードの改善』(あああ)
いつも大変お世話になっております。
マクロ起動から完了までに時間がかかってしまいます。
自分で修正を行ってはいるのですが、マクロ初心者の自分では改善ができませんでした。
何が問題なのかも見つけることができないため、解決方法を教えて頂きたいです。
以下コード
Sub abc()
Dim cl As Range
Application.EnableEvents = False
Application.ScreenUpdating = False
For Each cl In Range("C3:AG100,AI2:AP90,AS3:AS100")
cl = "" Next
Dim cl1 As Range
Dim i1
ActiveSheet.UsedRange.Select
Selection.Borders.LineStyle = True
For Each cl1 In Range("C2:AG2")
If cl1 = DateSerial(Cells(1, 1), Cells(2, 1) + 1, 1) Then cl1.Offset(-1, 0).Borders(xlEdgeLeft).LineStyle = xlDouble For i1 = 1 To 100 If Cells(i1, 1) <> "" Then cl1.Rows(i1).Borders(xlEdgeLeft).LineStyle = xlDouble ElseIf Cells(i1, 1) = "" Then Exit For End If Next Exit For End If Next
Dim cl2 As Range
Columns("AE:AG").Hidden = False
For Each cl2 In Range("AE2:AG2")
If cl2 = "" Then cl2.EntireColumn.Hidden = True End If Next
Dim rg As Range
Dim nm As Range
Dim i2
ActiveSheet.UsedRange.Interior.ColorIndex = xlNone
For Each rg In Range("C1:AG1")
If rg <> "" Then If Weekday(rg) = 7 Then rg.Rows("1:2").Interior.ColorIndex = 3 For i2 = 3 To 100 If Cells(i2, 1) <> "" Then rg.Rows(i2).Interior.ColorIndex = 3 ElseIf Cells(i2, 1) = "" Then Exit For End If Next
ElseIf Weekday(rg) = 1 Then rg.Rows("1:2").Interior.ColorIndex = 3 For i2 = 3 To 100 If Cells(i2, 1) <> "" Then rg.Rows(i2).Interior.ColorIndex = 3 ElseIf Cells(i2, 1) = "" Then Exit For End If Next
End If ElseIf rg = "" Then Exit For End If Next
Range("A1").Select
Application.ScreenUpdating = True
Application.EnableEvents = ture
End Sub
お手数をおかけしますが、よろしくお願いいたします。
< 使用 Excel:Excel2019、使用 OS:Windows10 >
1、ループ処理の必要がない
For Each cl In Range("C3:AG100,AI2:AP90,AS3:AS100") cl = "" Next
2、いちいち選択する必要がない
ActiveSheet.UsedRange.Select Selection.Borders.LineStyle = True
3、ElseIfである必要がない
If Cells(i1, 1) <> "" Then cl1.Rows(i1).Borders(xlEdgeLeft).LineStyle = xlDouble ElseIf Cells(i1, 1) = "" Then Exit For End If
If rg <> "" Then '省略 ElseIf rg = "" Then Exit For End If
4、動くかもしれないが、記述がちょっと変
rg.Rows("1:2").Interior.ColorIndex = 3
などが気になりました。
必要に応じ改修したうえでステップ実行して処理に時間がかかっている部分(無駄な処理)を洗い出してみてはいかがでしょうか?
(もこな2) 2021/06/02(水) 08:54
アドバイスを頂いた内容で改善を行っていきたいのですが
何が何だかわからず
サルでも分かるようにご教授いただいてもよろしいでしょうか
ご迷惑をおかけします。
(あああ) 2021/06/02(水) 09:06
元のコードだと1セルずつ空白にしていってますけどものすごい処理に時間かかります
範囲が決まっているなら範囲を指定して一度に書き換えましょう
>For i1 = 1 To 100
> If Cells(i1, 1) <> "" Then
> cl1.Rows(i1).Borders(xlEdgeLeft).LineStyle = xlDouble
> ElseIf Cells(i1, 1) = "" Then
> Exit For
> End If
>Next
ここも空白だったらForから抜けるだけですけど
Forから抜けたときのi1から一つ手前までを範囲選択すれば一度に書き換えられます
あとは見てないですけどForNextのコードに無駄が多いんじゃないでしょうか
(砂糖) 2021/06/02(水) 09:34
Dim rng1 As Range '日付欄 Dim rng2 As Range '内容欄 Dim rng3 As Range '集計欄 Dim rng4 As Range '判定欄 Dim ix As Long '表示列数
'セル範囲の定義等 Set rng2 = ActiveSheet.Range("C3:AG100") Set rng1 = .Offset(-2).Resize(2) Set rng3 = rng2.Offset(-1, .rng2.Columns.Count + 2).Resize(91, 2) Set rng4 = rng2.Columns(40) ix = Day(DateSerial(yare(rng1(1).Value), Month(rng1(1).Value + 1), 1) - 1)
'初期化 Union(rng2, rng3, rng4).ClearContents '値のクリア With rng2 .Borders.LineStyle = True '罫線を細線に .EntireColumn.Hidden = True '列全体を非表示に With .Resize(, ix) .EntireColumn.Hidden = False '必要列分を表示 .Borders(xlEdgeLeft).LineStyle = xlDouble '右側を2重線に End With End With End Sub
こんな感じで個々のセルではなく、
セル範囲に対して命令してください。
個々のセルでセルの書式設定をすると、ファイルも大きくなりがちです。
まとめられるところはまとめましょう。
まずはセル範囲の表現方法を学ぶとよいかと。
(まっつわん) 2021/06/02(水) 11:59
大変分かりやすく、改善点、勉強すべき内容が見えました。
本当にありがとうございました。
(あああ) 2021/06/02(水) 13:59
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.