ExcelでVBAを高速化する

画像

まえがき



たまたま、今日、多くの人々がExcelのVBAで作業(マクロを作成)する必要があります。 一部のマクロには、毎日(週、月、四半期など)実行しなければならない数百行のコードが含まれており、同時にかなりの時間がかかります。 プロセスは自動化されており、人間の介入は不要であるように見えますが、マクロの実行にかかる時間は数十分または数時間かかる場合があります。 彼らが言うように、時間はお金であり、この投稿ではマクロの実行時間を大幅にスピードアップしようとします。そしておそらく、それはあなたの業務、そして最終的にはお金にプラスの影響を与えます。



始める前に



要点を説明する前に、次の投稿に注目したいと思います。ExcelでVBAを操作するためのヒント 。 特に、「Macro Acceleration」ブロックには、最大の結果を得るために作業を高速化するためのヒントと一緒に使用する必要がある有用なコード例があります。



マクロの高速化



だから、要点... EcxelでVBAの作業を実際にスピードアップするには、ワークシート上のセルへのアクセスに時間がかかることを理解する必要があります。 セルに1つの値を書き込みたい場合、それほど時間はかかりませんが、数千のセルに書き込み(読み取り、アクセス)する必要がある場合は、はるかに時間がかかります。 そのような場合はどうすればいいですか? アレイが助けになります。 配列はメモリに保存され、VBAはメモリ内の操作を数百倍または数千倍も高速に実行します。 したがって、データに数千、数十万の値がある場合、マクロの実行時間は数分から数時間かかることがあり、このデータを配列に転送する場合、マクロの実行は数秒(分)に短縮できます。



コードの例を示し、コメントで何が何であるかを説明します。より明確になります。 さらに、アクセラレーションプロセスに直接関係しないコード行が役立つ場合があります。





「Sheet1」(「Sheet1」)に関するデータがあるとします。 データは50列(列に名前が含まれる)と10,000行に含まれます。 たとえば、最後の列に値を追加する必要があります。これは、2番目の列の値に等しい値を3番目の列の値で除算します(最初の列にはタイトルが含まれているため、2行目から開始します)。 次に、最初の10列を取得し、それらを「Sheet2」(「Sheet2」)にコピーして、さらに処理します(他のニーズのため)。 例はありふれたものにしましょう。しかし、私には思えるように、それはこの投稿の本質全体を反映することができます。



'   ,    '     Option Explicit Sub Test() '      Dim Sheet1_WS, Sheet2_WS As Worksheet '      ( ) Dim i As Long ',       Dim R_data As Variant '     Dim FinalRow, FinalColumn As Long '     ,     'Set Sheet1_WS = Application.ThisWorkbook.Worksheet("Sheet1") Set Sheet1_WS = Application.ThisWorkbook.Sheets(1) Set Sheet2_WS = Application.ThisWorkbook.Sheets(2) '        ',      ,         '   ,   ,     . ,       .        . FinalRow = Sheet1_WS.Cells(Rows.Count, 1).End(xlUp).Row '=10 000 '        FinalColumn = Sheet1_WS.Cells(1, Columns.Count).End(xlToLeft).Column '=50 '      1 R_data = Sheet1_WS.Range(Sheet1_WS.Cells(1, 1), Sheet1_WS.Cells(FinalRow, FinalColumn)) For i = 2 To FinalRow '     . ',       . ',    2  3    '    If R_data(i, 3) <> 0 Then R_data(i, FinalColumn) = R_data(i, 2) / R_data(i, 3) End If Next i '      1 '      (    ,   Sheet1_WS.Cells.ClearContents) Sheet1_WS.Cells.Delete Sheet1_WS.Range(Sheet1_WS.Cells(1, 1), Sheet1_WS.Cells(FinalRow, FinalColumn)) = R_data '   2,   10 . Sheet2_WS.Range(Sheet2_WS.Cells(1, 1), Sheet2_WS.Cells(FinalRow, 10)) = R_data '     Workbooks(Application.ThisWorkbook.Name).Close SaveChanges:=True End Sub
      
      







この例では、配列は指定された範囲で埋められます。 明示的に定義された2次元配列がある場合、次の方法でその値をシートにコピーします。



 Dim R_new() As Variant ............................................ '     ReDim R_new(1 To FinalRow, 1 To 50) As Variant ........................................... Sheet1_WS.Range(Sheet1_WS.Cells(1, 1), Sheet1_WS.Cells(FinalRow, 50)) = R_new()
      
      







おわりに



データのほとんどの操作は配列で実行できますが、シートには結果のみが表示されます。 結果をシートに表示してから、いくつかのアクション(並べ替えなど)を実行し、データを再度配列に読み込むことをお勧めします。



実際、シート上のデータは2次元配列であるため、配列が原因でマクロの動作を高速化できたことは大きな驚きでした。 しかし、結局のところ、メモリアクセスはシート上のセルよりもはるかに高速です。



将来、シート上のデータのクイック検索に関するヒント(例)を書く予定ですが、これは別の投稿になります。 質問、コメントがありましたら、書いてください。



ご清聴ありがとうございました。 成功した開発。



All Articles