- ベストアンサー
Excel関数の計算について
- oracleのテーブル1からデータ取得し、データ加工してoracleのテーブル2にデータを登録する処理で、データ加工に時間がかかっています。
- ExcelのVBAを使用して、シリアルデータと日付データを加工して別のシートにコピーしています。
- Excelの計算方法を手動にすると時間がかかるが、自動にすると早く終了します。なぜでしょうか?また、600行の計算方法を改善できるか教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
事象に興味を惹かれ、やってみました。 当方でも容易に30秒を超える事象を再現できます。 私もよくわかりませんが、 計算方法を手動に変更し、 セル群に(課題の)計算式を埋め、自動に変更すると 再計算の時間が長くなることから、 どのセルを再計算すべきかの判定が甘く 同じセルに対して複数回再計算が行われているんじゃないかと思います。 課題のマクロでは、 F列とG列にワークシート関数の計算式を埋め その計算式によって期待の結果を求めているわけですが 計算式である必要がないのであれば マクロ側で計算を行い、セル値を埋めるほうが 再計算といったことを意識しなくて済み より速い動作で、よりシンプルなコードになるだろうと思います。 例えば、以下です。 Sub test3() Dim RowCounter Dim wsGet As Worksheet Dim wsPut As Worksheet Dim PutDt1 As String Dim WDay As Range Dim LASTROW As Long With ThisWorkbook '作業範囲を定義、クリアー Set wsGet = .Sheets("Sheet1") Set wsPut = .Sheets("Sheet2") With .Sheets("T_非稼働日") LASTROW = .Cells(Rows.Count, 1).End(xlUp).Row Set WDay = Range(.Cells(1, 1), .Cells(LASTROW, 1)) End With wsPut.Cells.ClearContents RowCounter = 1 Do If wsGet.Cells(RowCounter, 3).Value = "" Then Exit Do wsPut.Cells(RowCounter, 1).Value = _ wsGet.Cells(RowCounter, 3).Value wsPut.Cells(RowCounter, 2).Value = _ wsGet.Cells(RowCounter, 31).Value wsPut.Cells(RowCounter, 6).NumberFormatLocal = "@" wsPut.Cells(RowCounter, 7).NumberFormatLocal = "@" PutDt1 = Format(Application.WorksheetFunction.WorkDay(DateSerial( _ Mid(wsPut.Cells(RowCounter, 2).Value, 1, 4), _ Mid(wsPut.Cells(RowCounter, 2).Value, 5, 2), _ Mid(wsPut.Cells(RowCounter, 2).Value, 7, 2)), _ -3, WDay), "yyyymmdd") & "084500" wsPut.Cells(RowCounter, 6).Value = PutDt1 wsPut.Cells(RowCounter, 7).Value = _ wsPut.Cells(RowCounter, 2).Value & "170000" RowCounter = RowCounter + 1 Loop End With End Sub
その他の回答 (1)
- kon555
- ベストアンサー率51% (1844/3562)
手動と自動での速度差については分からないですね。 ただ速度アップについてなら、コピーしてペーストするよりも、直接セルに値をする処理の方が迅速に実行できると思いますよ。 参考ページ http://officetanaka.net/excel/vba/speed/s13.htm https://officedic.com/excel-vba-copy-paste-highspeed/#toc3 個人的にはfor nextで上から処理してしまって、F列とG列のデータについてもその流れで捌いてしまえば、あんまり複雑なコードにもならず、処理も早く済むと思います。
お礼
回答ありがとうございます。 for nextで上から処理やってみましたが処理時間短縮にはなりませんでした。 処理が遅いのは、コピーの部分ではなくて計算の部分なのです。
お礼
回答ありがとうございます。 やってみた所、30[s]くらいかかっていたのが0.4[s]くらいになりました。 大変助かりました。ありがとうございます。 ”同じセルに対して複数回再計算”というのもなるほどと思いました。