• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Excel VBAについてご教ください)

Excel VBAについての質問

このQ&Aのポイント
  • Excel VBAについての質問です。特定の条件に基づいてデータを振り分け、並べ替える作業を効率的に行いたいです。
  • 質問者は今まで自己学習でVBAを学んできましたが、書いたコードが重く動作しなかったため、よりシンプルで効率的な方法を知りたいと思っています。
  • 具体的には、エリア1ごとに同じブックの別シートにデータを振り分け、各シートを累計売上の降順で並べ替えたいです。また、データを貼り付ける前に前回のデータを削除する必要もあります。

質問者が選んだベストアンサー

  • ベストアンサー
  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.2

見た感じ、そんなに鈍重なコードではないように見えますが・・ 貼り付け位置がAJ列と言うことですから、 「このコードのほかに何か処理」をさせていませんか? その「他の処理」に関して動きが悪いのであれば何とも言えません。 ですので、とりあえず質問文からわかる範囲で。 > 前に残っている前回のデータを削除して コレも「行全体を削除」なのか、貼り付けるべき「AJ:ATの範囲を消去」するのか 質問文からは判断できませんので、両方の可能性を見越して。 *「行全体を削除する」の場合 Sub 指定行削除()     For i = 2 To Sheets.Count         Sheets(i).Rows(5 & ":" & Cells(Rows.Count, 36).End(xlUp).Row).Delete     Next End Sub *「AJ:ATの範囲を消去する」場合 Sub 指定範囲消去()     For i = 2 To Sheets.Count         Sheets(i).Range("AJ5:AT" & Cells(Rows.Count, 36).End(xlUp).Row).ClearContents     Next End Sub どちらも元データシートが先頭に在ると仮定し、その他の全てのシートに処理をかけています。 このどちらかをコードの始めに持っていくと「今あるデータを削除(消去)して」先に進みます。 ちなみにエラーは考慮しておりません。 続いて > 各シートで「累計売上」順(降順)に並べ替え 「マクロの記録」機能はご存知でしょうか。 単純にこの「降順に並べ替え」の処理を記録してやると     Selection.Sort Key1:=Range("AL6"), Order1:=xlDescending, Header:=xlGuess _     , OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _     SortMethod:=xlPinYin こんな感じで記録されると思いますので、コレをちょっと書き直せば出来ますね。 ソレを先ほどの「削除」同様、対象の全シートで走るように手を加えれば良いです。 Sub 降順で並べ替え()     For i = 2 To Sheets.Count         Sheets(i).Range("AJ5").Sort Key1:=Sheets(i).Range("AL6"), _                       Order1:=xlDescending, _                       Header:=xlGuess, _                       OrderCustom:=1, _                       MatchCase:=False, _                       Orientation:=xlTopToBottom, _                       SortMethod:=xlPinYin     Next End Sub 同様に、元データシートが先頭に在ると仮定し、その他の全てのシートに処理をかけています。 これはコードの最後に付け加えてやれば良いですね。 これもエラーの考慮はしていません。 ちなみに、7000件でコチラで走らせてみましたが 消去~転記~並べ替えの作業を続けても1秒かからずくらいですね。 「速度」だけ考えると立派な数字だと思いますよ。 書き方は色々有るのかなぁ、とも思いますが、 質問文中の「コードの一部」だけでは判断できません。 悪しからずご了承下さいませ。

tanaya56
質問者

お礼

ありがとうございます。 言葉足らずなところがあり、ご迷惑をおかけいたしました。 >「このコードのほかに何か処理」をさせていませんか? 貼り付け位置以外には、関数が入っております。 しかしながら、貼り付け位置に手動で(オートフィルターなどを駆使し)貼り付けていたときは、ファイルサイズが3Mほどであったものが、なぜかマクロ組み入れ後に22Mとなっており、困っていたものです。 > 前に残っている前回のデータを削除して 「AJ:ATの範囲を消去する」という解釈であっております。 パーツごとに書いてくださり、とても分かりやすく勉強になります。 ありがとうございます。

その他の回答 (2)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

No.1です! たびたびごめんなさい。 (2)の降順に並び替え!を忘れていました。 もう一度コードを最初から載せてみます。 Sub Macro2() Dim endRow As Long Application.ScreenUpdating = False With Worksheets("元データシート") .Range("A5").AutoFilter Field:=9, Criteria1:="京前" endRow = .Cells(Rows.Count, "F").End(xlUp).Row Worksheets("前 品別").Cells.ClearContents .Range("F4:P" & endRow).Copy Worksheets("前 品別").Range("AJ5") Worksheets("前 品別").Range("AJ5").CurrentRegion.Sort key1:=Worksheets("前 品別").Range("AL5"), _ order1:=xlDescending, Header:=xlYes .Range("A5").AutoFilter Field:=9, Criteria1:="京中" endRow = .Cells(Rows.Count, "F").End(xlUp).Row Worksheets("中 品別").Cells.ClearContents .Range("F4:P" & endRow).Copy Worksheets("中 品別").Range("AJ5") Worksheets("中 品別").Range("AJ5").CurrentRegion.Sort key1:=Worksheets("中 品別").Range("AL5"), _ order1:=xlDescending, Header:=xlYes .Range("A5").AutoFilter Field:=9, Criteria1:="京後" Worksheets("後 品別").Cells.ClearContents endRow = .Cells(Rows.Count, "F").End(xlUp).Row .Range("F4:P" & endRow).Copy Worksheets("後 品別").Range("AJ5") Worksheets("後 品別").Range("AJ5").CurrentRegion.Sort key1:=Worksheets("後 品別").Range("AL5"), _ order1:=xlDescending, Header:=xlYes .AutoFilterMode = False End With Application.ScreenUpdating = True MsgBox "各地区シートにデータを振分けました。" End Sub ※ じっくり考えればもっと簡単になると思います。 取り急ぎ投稿します。m(_ _)m

tanaya56
質問者

お礼

回答いただきありがとうございます。 >(1)各シートに振り分けるたびにオートフィルタを解除・設定と繰り返していますが、それをやめてみてはどうでしょうか? その通りだと思いますf(――;) >(2)データがあるなしにかかわらずF4~P65500の範囲をコピー&ペーストしていますが、データの最終行を取得してその範囲だけをコピー&ペーストしてはダメですか? 全然かまわないです。 ただ、指定範囲外には関数が入っておりますので、消したくはないです。 言葉足らずなところがあり、また、 考え方が、まだまだ甘かったことを痛感いたしております。 これからも、ご教授いただければと思います。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんばんは! 気になる点が2か所あります。 (1)各シートに振り分けるたびにオートフィルタを解除・設定と繰り返していますが、それをやめてみてはどうでしょうか? (2)データがあるなしにかかわらずF4~P65500の範囲をコピー&ペーストしていますが、データの最終行を取得してその範囲だけをコピー&ペーストしてはダメですか? 一応上記のコトを考慮して少し手を加えさせていただきました。 Sub Macro2() Dim endRow As Long Application.ScreenUpdating = False With Worksheets("元データシート") .Range("A5").AutoFilter Field:=9, Criteria1:="京前" endRow = .Cells(Rows.Count, "F").End(xlUp).Row Worksheets("前 品別").Cells.ClearContents .Range("F4:P" & endRow).Copy Worksheets("前 品別").Range("AJ5") .Range("A5").AutoFilter Field:=9, Criteria1:="京中" endRow = .Cells(Rows.Count, "F").End(xlUp).Row Worksheets("中 品別").Cells.ClearContents .Range("F4:P" & endRow).Copy Worksheets("中 品別").Range("AJ5") .Range("A5").AutoFilter Field:=9, Criteria1:="京後" Worksheets("後 品別").Cells.ClearContents endRow = .Cells(Rows.Count, "F").End(xlUp).Row .Range("F4:P" & endRow).Copy Worksheets("後 品別").Range("AJ5") .AutoFilterMode = False End With Application.ScreenUpdating = True MsgBox "各地区シートにデータを振分けました。" End Sub ※ 各シートにコピー&ペーストする前に、各シートのデータをすべてクリアしていますので、 消してはいけないデータがある場合は別途考える必要があります。 少しは早くなりますかね?m(_ _)m

関連するQ&A