[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『高速処理するには…。』(マイマイ)
ユーザーフォームに集計期間とモール名と手数料を入力し、集計ボタンを押す。
するとSheet"出力データ"に結果が出る、というマクロを組んでいます。
望んだ通りの結果が出るのですが、処理が重く1分ほどかかってしまいます。
高速処理化したいのですが、どのように手直しすればいいか分かりません。
Sheet"売上高"にはA〜Wまでデータが入っています。
Sheet"出力データ"の上から5行目までは計算式などが入っています。
列数は変わらず、行数が毎回変化します。
流れとしては以下の通りです。
罫線をクリア → 各項目の転写 → ソートA>M → 小計 → 罫線を引く
※転写の部分は作っていただきました。
Private Sub CommandButton3_Click() '集計クリック '画面の再描画/自動計算を停止 Application.ScreenUpdating = False Application.Calculation = xlCalculationManual '罫線クリア Rows("5:5").Select Range(Selection, Selection.End(xlDown)).Select Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone Selection.Borders(xlEdgeLeft).LineStyle = xlNone Selection.Borders(xlEdgeTop).LineStyle = xlNone Selection.Borders(xlEdgeBottom).LineStyle = xlNone Selection.Borders(xlEdgeRight).LineStyle = xlNone Selection.Borders(xlInsideVertical).LineStyle = xlNone Selection.Borders(xlInsideHorizontal).LineStyle = xlNone '入力項目のチェック Dim i As Long Dim lst As String Dim msg As String If Not IsDate(TextBox1.Value) Then msg = msg & vbCrLf & "集計期間に日付が入力されていません。" If Not IsDate(TextBox2.Value) Then msg = msg & vbCrLf & "集計期間に日付が入力されていません。" If Not IsNumeric(TextBox3.Value) Then msg = msg & vbCrLf & "店舗手数料に数値が入力されていません。" For i = 0 To ListBox1.ListCount - 1 If ListBox1.Selected(i) = True Then lst = lst & Chr(2) & ListBox1.List(i) Next i If lst = "" Then msg = msg & vbCrLf & "対象店舗が選択されていません。" If msg <> "" Then MsgBox "未入力または誤った値が入力されています。" & msg Else lst = Mid$(lst, 2) With Sheets("検索") .Cells.ClearContents .[A1:B1] = [{"日付";"日付"}] .[A2] = ">=" & TextBox1.Value .[B2] = "<=" & TextBox2.Value .Range("D1").Resize(UBound(Split(lst, Chr(2))) + 1).Value = Application.Transpose(Split(lst, Chr(2))) .Range("C2").Formula = "=COUNTIF($D:$D,売上高!D2)" End With Sheets("売上高").Range("A1").CurrentRegion.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Sheets("検索").Range("A1:C2"), CopyToRange:=Sheets("集計").Range("A5:R5"), Unique:=False With Sheets("集計") .Activate .[K2] = TextBox1.Value .[L2] = "〜" .[M2] = TextBox2.Value .[C3] = lst .[E3] = TextBox3.Value End With ' ソート Macro Dim lastRow As Long, lastCol As Long lastRow = Cells(Rows.Count, "A").End(xlUp).Row lastCol = Cells(5, Columns.Count).End(xlToLeft).Column Range(Cells(5, "A"), Cells(lastRow, lastCol)).Sort key1:=Range("A5"), order1:=xlAscending, _ key2:=Range("M5"), Order2:=xlDescending, Header:=xlYes With ActiveWorkbook.Worksheets("集計").Sort .SetRange Range(Cells(5, "A"), Cells(lastRow, lastCol)) .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With ' 小計 Macro lastRow = Cells(Rows.Count, "A").End(xlUp).Row lastCol = Cells(5, Columns.Count).End(xlToLeft).Column Range(Cells(5, "A"), Cells(lastRow, lastCol)).Select Selection.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(4, 6, 7, _ 8, 9, 10, 11, 12), Replace:=True, PageBreaks:=False, SummaryBelowData:=True Cells.ClearOutline ' 罫線 Macro lastRow = Cells(Rows.Count, "A").End(xlUp).Row lastCol = Cells(5, Columns.Count).End(xlToLeft).Column Range(Cells(5, "A"), Cells(lastRow, lastCol)).Select Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone With Selection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .ThemeColor = 9 .TintAndShade = -0.249946592608417 .Weight = xlThin End With
With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .ThemeColor = 9 .TintAndShade = -0.249946592608417 .Weight = xlThin End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .ThemeColor = 9 .TintAndShade = -0.249946592608417 .Weight = xlThin End With With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .ThemeColor = 9 .TintAndShade = -0.249946592608417 .Weight = xlThin End With With Selection.Borders(xlInsideVertical) .LineStyle = xlContinuous .ThemeColor = 9 .TintAndShade = -0.249946592608417 .Weight = xlThin End With With Selection.Borders(xlInsideHorizontal) .LineStyle = xlContinuous .ThemeColor = 9 .TintAndShade = -0.249946592608417 .Weight = xlHairline '画面の再描画/自動計算を再開 Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End With Unload Me
End If
End Sub
< 使用 Excel:unknown、使用 OS:unknown >
まるで自分で組んだかのような口ぶりですねぇ [[20190226094805]] 『売上高からデータを絞込み、データ出力がしたいで』(マイマイ) >>BOT
前回の質問に続けてもらえればよかったと思うのですが。 (稲葉) 2019/03/13(水) 14:40
稲葉様に作っていただいた部分ではなく、私が作った部分が何度も同じ処理が出てくるのでここに問題があると思って別件で立てさせてもらいました。
(マイマイ) 2019/03/13(水) 14:51
たぶん、問題があるのは私のほうだと思います。
> .Range("C2").Formula = "=COUNTIF($D:$D,売上高!D2)" > Sheets("売上高").Range("A1").CurrentRegion.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Sheets("検索").Range("A1:C2"), CopyToRange:=Sheets("集計").Range("A5:R5"), Unique:=False こちらのコードで処理が重くなっているような気がしました。
店名のor条件検索ですので、手抜きせずに作り変えます。 他の見直しできそうなところもやりますので、少々お待ちください。
(稲葉) 2019/03/13(水) 14:58
もう一点 ご自身で記述されたコードに、シート名が一切ないのですが、どのシートが対象ですか? (稲葉) 2019/03/13(水) 15:01
前回のマクロ本当に感激しました。
5行目の各項目名を参照して転写してくれるので、項目の入れ替えも容易で自由度の高さに驚きました。
テーブル設定のおかげで容量も軽くなりましたし、本当に助かってます。
(マイマイ) 2019/03/13(水) 15:15
コンパイルは通ったけど、最初に作った時とセル配置が違うから、テストしてません。 重い原因は私のところと、おそらく小計機能だと思います。 小計実行する前にStop入れましたので、そこまでが早ければ、あとは小計機能をピボットに置き換えるほうが 懸命だと思います。
Option Explicit Private Sub CommandButton3_Click() Dim i As Long Dim lst As String, n As Long Dim msg As String Dim rng As Range '出力後の書式設定に使用 '入力項目のチェック If Not IsDate(TextBox1.Value) Then msg = msg & vbCrLf & "集計期間に日付が入力されていません。" If Not IsDate(TextBox2.Value) Then msg = msg & vbCrLf & "集計期間に日付が入力されていません。" If Not IsNumeric(TextBox3.Value) Then msg = msg & vbCrLf & "店舗手数料に数値が入力されていません。" For i = 0 To ListBox1.ListCount - 1 If ListBox1.Selected(i) = True Then lst = lst & Chr(2) & ListBox1.List(i) Next i If lst = "" Then msg = msg & vbCrLf & "対象店舗が選択されていません。" If msg <> "" Then MsgBox "未入力または誤った値が入力されています。" & msg Else '集計クリック '画面の再描画/自動計算を停止 Application.ScreenUpdating = False Application.Calculation = xlCalculationManual '罫線クリア Sheets("集計").Range("A5:A" & Rows.Count).Borders = False lst = Mid$(lst, 2) n = UBound(Split(lst, Chr(2))) + 1 With Sheets("検索") .Cells.ClearContents .[A1:B1] = [{"日付";"日付"}] .[C1] = "モール" .Range("C2").Resize(n).Value = Application.Transpose(Split(lst, Chr(2))) .Range("A2:A" & n).Value = ">=" & TextBox1.Value .Range("B2:B" & n).Value = "<=" & TextBox2.Value End With Sheets("売上高").Range("A1").CurrentRegion.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Sheets("検索").Range("A1:C" & n), CopyToRange:=Sheets("集計").Range("A5:R5"), Unique:=False With Sheets("集計") .Activate .[K2] = TextBox1.Value .[L2] = "〜" .[M2] = TextBox2.Value .[C3] = lst .[E3] = TextBox3.Value ' ソート Macro Set rng = .Range(.Cells(Rows.Count, "A").End(xlUp), .Cells(5, Columns.Count).End(xlToLeft)) With .Sort .SortFields.Clear .SortFields.Add Key:=.Range("A5") .SortFields.Add Key:=.Range("M5"), Order:=xlDescending .SetRange rng .Header = xlYes .Apply End With ' 小計 Macro 'この部分はピボットテーブルのほうがいいかも知れない。 Stop rng.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(4, 6, 7, 8, 9, 10, 11, 12), Replace:=True, PageBreaks:=False, SummaryBelowData:=True .Cells.ClearOutline Set rng = .Range(.Cells(Rows.Count, "A").End(xlUp), .Cells(5, Columns.Count).End(xlToLeft)) ' 罫線 Macro With rng.Borders .LineStyle = xlContinuous .ThemeColor = 9 .TintAndShade = -0.25 .Weight = xlThin End With rng.Borders(xlInsideHorizontal).Weight = xlHairline '画面の再描画/自動計算を再開 End With Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True Unload Me End If End Sub (稲葉) 2019/03/13(水) 15:45
2か所訂正 > .Range("A2:A" & n).Value = ">=" & TextBox1.Value > .Range("B2:B" & n).Value = "<=" & TextBox2.Value こちらを以下に置き換えてください .Range("A2").Resize(n).Value = ">=" & TextBox1.Value .Range("B2").Resize(n).Value = "<=" & TextBox2.Value (稲葉) 2019/03/13(水) 15:47
ここのところで実行時エラー423が出ます。
シート名も合ってますし、スペルミスもないように思うのですが。
(マイマイ) 2019/03/13(水) 16:06
False をxlnoneに直してもらえますか?
(稲葉) 2019/03/13(水) 16:56
ちなみに一度罫線クリアの部分だけ元に戻して実行してみたら、参照まではめちゃくちゃ早かったです!
おっしゃる通り小計部分がどうしても時間がかかるようなのでピボットも考えてみます。
(マイマイ) 2019/03/13(水) 17:04
あ、ボーダーのプロパティーが抜けてるからえらーだ ラインスタイル = Falseでどうでしょう?
ビボットなら、いちいち作らず、データ範囲大きめに設定して 範囲内のデータが書き変わったときだけ、リクエリすれば大丈夫です (稲葉) 2019/03/13(水) 18:26
それから転写の際、モールと日付の両方とも絞込みが効いてません。
検索シートに日付とモールは正確に表示されています。
(マイマイ) 2019/03/14(木) 10:13
Sheets("集計").Range("A5:AA" & Rows.Count).Borders.LineStyle = False A列しか範囲してなかった。~~ 訂正箇所 すません。
そしたら、検索部分は以前のコードに直してもらえますか? そのうえで、小計前までの速度をStopで体感してもらってから修正でもよいかなと。
(稲葉) 2019/03/14(木) 10:23
罫線バッチリです。
速度も素晴らしいです。ありがとうございます!
小計はピポットの方向で考えてみます。
(マイマイ) 2019/03/14(木) 11:43
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.