エクセルVBAのコードで処理を高速化する方法

このQ&Aのポイント
  • エクセルVBAのコードを実行すると処理が遅くなる場合、以下のコードを追加することで処理を高速化できます。
  • 1. `Application.ScreenUpdating = False` を追加する 2. データの範囲を絞る 3. ソートを高速化する 4. 不要な行を非表示にする 5. `Application.ScreenUpdating = True` を追加する
  • これらのコードを追加することで、エクセルVBAの処理速度を向上させることができます。
回答を見る
  • ベストアンサー

エクセルVBA

よろしくお願いいたします。 エクセルのVBAですが、下記のコードを実行すると処理が遅いです。処理が早くなるコード教えてください。 よろしくお願いいたします。 Sub Macro3() Dim aa As Variant Dim i As Variant Application.ScreenUpdating = False Range("A14:i46").Select aa = ActiveSheet.Name ActiveWorkbook.Worksheets(aa).Sort.SortFields.Clear ActiveWorkbook.Worksheets(aa).Sort.SortFields.Add Key:=Range("B15:B46"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal ActiveWorkbook.Worksheets(aa).Sort.SortFields.Add Key:=Range("C15:C46"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets(aa).Sort .SetRange Range("A14:i46") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With For i = 0 To 31 Cells(15 + i, 7).Select If Selection.Value = 0 Then Selection.EntireRow.Hidden = True End If Next i Range("A1").Select Application.ScreenUpdating = True End Sub

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.2

それで遅いというと,必ずしもそのマクロだけの問題じゃないんじゃないかな?とは思います。 まぁ,何が遅い原因なのかの追求はご自分でやっていただくとして,できるだけ手を打ってみると。 作成例: sub macro1()  dim i as long  application.screenupdating = false  application.calculation = xlcalculationmanual  application.enableevents = false  activesheet.usedrange.entirerow.hidden = false  range("A14:I46").sort key1:=range("B14"), order1:=xlascending, key2:=range("C14"), order2:=xlascending, header:=xlyes  for i = 15 to 46   If cells(i, 7) = 0 Then cells(i, 7).entirerow.hidden = true  next i  application.enableevents = true  application.calculation = xlcalculationautomatic  application.screenupdating = true end sub #余談 描画抑制(screenupdating)とか諸々使いますが,これをしていると原因の追及には邪魔になるだけなので,原因を調べたいときは全て行わないでおきます。

その他の回答 (1)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

>For i = 0 To 31 以下を省いて実行しても処理が遅いか? ーー 前半は何がしたいのか。ソートだと思うが、どういうセル範囲のどういうソートか。 今までのソーとコード例に比べ記述が複雑なようだ。 エクセルのバージョンも書いてないが、2007以降に係わるものかな。 ーー 先生や、下請けに対するのように、コードだけ挙げて、読み解かして、結果がだけこうなるようにしろと言うのは、失礼ではないか。 自分で少しは変えてやってみたのか。

関連するQ&A

  • VBA エクセルでオートフィルタをされているデータ

    エクセルでオートフィルタをされているデータを 昇順で並べ替えするコードを取得したのですが ActiveWorkbook.Worksheets("置換").AutoFilter.Sort.SortFields.Clear ActiveWorkbook.Worksheets("置換").AutoFilter.Sort.SortFields.Add Key:=Range("A1:A5203"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("置換").AutoFilter.Sort .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With なのですが どれが並べ替えのコードなのでしょうか? ActiveWorkbook.Worksheets("置換").AutoFilter.Sort.SortFields.Clear これはオートフィルタの並べ替えを解除するコードだと思いますが ActiveWorkbook.Worksheets("置換").AutoFilter.Sort.SortFields.Add Key:=Range("A1:A5203"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal これは何のコードでしょう?

  • エクセルのvba(最終行を取得する並び替え)

    初めまして、エクセルのvbaについて質問をさせてください。 マクロの記録を使って、以下の通りF列→M列→J列の順に優先して、A列からAL列を昇順に並び替えるvbaを作成したのですが、10000行までとう不恰好な書き方になっています。最終行までという書き方に変えたいのですが、色々試したもののうまくいきません…!この場合、最終行を取得するにはどのような書き方にすれば良いのでしょうか…??(T-T) '並び替え ActiveWorkbook.Worksheets("当月").Sort.SortFields.Clear ActiveWorkbook.Worksheets("当月").Sort.SortFields.Add Key:=Range("F2:F10000"_ ), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ xlSortTextAsNumbers ActiveWorkbook.Worksheets("当月").Sort.SortFields.Add Key:=Range("M2:M10000"_ ), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal ActiveWorkbook.Worksheets("当月").Sort.SortFields.Add Key:=Range("J2:J10000"_ ), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("当月").Sort .SetRange Range("A1:AL10000") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With

  • エクセルVBAでデータ並べ替え

    マクロ記録をとると次のようになりました。 これをA列をキーに並べるもっと簡単なコードを教えてください。 Range("A2:G501")となっていますが、これ以上でも対応できるようにしたいです。 どなたか教えていただけないでしょうか。 Sub Macro1() Range("A1").Select ActiveWorkbook.Worksheets("***").Sort.SortFields.Clear ActiveWorkbook.Worksheets("***").Sort.SortFields.Add Key:=Range("A1"), SortOn _ :=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("***").Sort .SetRange Range("A2:G501") .Header = xlNo .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub

  • エクセルの並べ替えをマクロで

    知識が無くなかなか解決しません。教えて下さい。 エクセル(2000)のマクロの記録で並べ替えを記録すると下記の様になりました。 Range("A1:M57").Select ActiveWorkbook.Worksheets("表2").Sort.SortFields.Clear ActiveWorkbook.Worksheets("表2").Sort.SortFields.Add Key:=Range("C2:C57"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal ActiveWorkbook.Worksheets("表2").Sort.SortFields.Add Key:=Range("D2:D57"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("表2").Sort .SetRange Range("A1:M57") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With Range("A2").Select End Sub 次のように改良する方法を探しています。 (1)Range("A1:M57").Select → 表によって行数が違う為、行数とおりに範囲選択したい。 M65536とすれば良いのかもしれませんが、パソコンの処理能力が低く、なるべく負担が掛からない様にしたいのですが。列数はA列からM列の限定です。 (2)ActiveWorkbook.Worksheets("表2")  → ("表2")限定ではなく他のシート名でも並べ替えが出来る様にするにはどのようにすれば良いのでしょうか。 いろいろ試しましたがうまく出来ません。お知恵をお貸し下さい。よろしくお願い致します。

  • ワードVBAからエクセルのソートができない

    こんにちは MS Word 2007から条件に合う語を抜き出してエクセルに貼り付けた後、ソートをするマクロを書いているのですが、ソートの部分で「型が一致しない」というエラーが出てしまい困っています。エクセルのVBAでは問題なく動作しています。 次がエクセルVBAで作ったソートのVBAです。 ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("A1"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("Sheet1").Sort .SetRange Range("A1:A6") .Header = xlNo .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With これをWord VBAに貼り付けて、一部を変更しました。 myExcel.workbooks(BookName).sheets(1).Sort.SortFields.Clear myExcel.workbooks(BookName).sheets(1).Sort.SortFields.Add Key:=Range("A1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With myExcel.workbooks(BookName).sheets(1).Sort .SetRange Range("A1:A6") .Header = xlNo .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With myExcelは事前に作成したExcelオブジェクトです。BookNameは作成したブックのファイル名です。2行目「myExcel.workbooks(BookName).sheets(1).Sort.SortFields.Add Key:=Range("A1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal」でエラーになります。 「型が一致しない」と表示されます。ちょこちょこ書き換えているのですがエラーは解消されません。 Windows 7/8 64bit Word 2007. Excel 2007 解決策をご存じでしたら教えてください。

  • エクセルのマクロ記録を他のシートでも実行したい

    エクセル2010を使用しています。 シート1でマクロ記録を使用しデータの並び替えをし、 同じブック内にシート1をコピーしてシート2としました。 このシート2でもシート1で行ったデータの並び替えをしたいのですが シート2ではマクロは実行されませんでした。 わからないながらもVBAを見たところ下記のように 記述されおりましたが、どのような修正をすればよいかご教授いただけると助かります。 ちなみに、シート1でマクロを記録し、そのシートを同ブック内に複数コピーして それぞれのシートでマクロを実行させるということを考えています。 Sub Macro1() ' ' Macro1 Macro ' ' Range("A11:Q17").Select ActiveWorkbook.Worksheets("1").Sort.SortFields.Clear ActiveWorkbook.Worksheets("1").Sort.SortFields.Add Key:=Range("B11:B17"), _ SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:="日,月,火,水,木,金,土" _ , DataOption:=xlSortNormal ActiveWorkbook.Worksheets("1").Sort.SortFields.Add Key:=Range("A11:A17"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("1").Sort .SetRange Range("A11:Q17") .Header = xlGuess .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub

  • EXCELでマクロが

    昨日から、期待する動きでなくなりました。 シートに新たに数式を加え、rank関数ではきちんと表示するのですが、マクロを動かすと、 期待した動きでなくなりました。 Sub Sheet2STD昇順並べ替え() ' ' Sheet2STD昇順並べ替え Macro ' ' Range("B6:V24").Select ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Clear ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Add Key:=Range("C7:C24") _ , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("Sheet2").Sort .SetRange Range("B6:V24") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With Range("A1").Select End Sub 図にある下向きの矢印にマクロを登録しています。

  • 【VBA】全てのシートを並び替え 反映せず

    For Each Ws In Worksheets Ws.Activate 「並び替えの処理」 Next Ws を記述したのですが、 「並び替えの処理」を記憶マクロからコピペした為、 ("Sheet1")しか並び替えの処理がされません。(全シート並び替えの処理がしたい) 下記コードをどの様に修正すれば良いでしょうか。 ご教示願います。 '5行目から最終行迄範囲選択し、W列で昇順に並び替え Rows("5:5").Select Range(Selection, Selection.End(xlDown)).Select ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("W5:W40") _ , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("Sheet1").Sort .SetRange Range("A5:X40") .Header = xlGuess .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With

  • エクセルVBA

    お世話になります。 マクロの記録で、下記のようにC列を基準に表内を並べ替えるように記録されました。 Range("C4").Select Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("AQ5:AQ39" _ ), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("Sheet1").Sort .SetRange Range("A4:EJ39") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With ご教授いただきたい点が2点あります。 1. end行 (今のところ39行め) が毎回変わっても その位置を認識して、対応するようにしたいのですが、 どのように書き換えるとよいのでしょうか? C4は、タイトル行で、毎回固定です。 やはり、毎回最終行の次の行 (今回のケースでいうと、40行目に)に、 endと手作業で入力する方法しかないでしょうか? それしかない場合は、その記述の仕方をお願いします。 例えば、最大500行もあればいいので、途中の空白セルは、無視して 並べ替えをしてくれる記述などで教えていただけるとありがたいのですが・・・ 2. 必ず、active なシートを選択しておいてから、マクロを実行するとして、 シート名の sheet1 も可変にしたいです。 よろしくお願いします。m(_ _)m

  • 複数シートでしょう可能なマクロ作成法

     マクロ初心者です。お教えください。  マクロを用いてデータ処理を行っています。1月のシートを用いてマクロ作成をすると、プログラムの 途中ですが以下のようになります。    Application.CutCopyMode = False ActiveWorkbook.Worksheets("1月").Sort.SortFields.Clear ActiveWorkbook.Worksheets("1月").Sort.SortFields.Add Key:=Range("R13"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("1月").Sort  この1月限定部分を変更して12ヶ月のいずれの月でも使用可能にしたいのですが、  どのように変更すべきかお教えください。  よろしくご教授ください。  

専門家に質問してみよう