excel関数の計算について
office2016
oracleのテーブル1からデータ取得し、データ加工してoracleのテーブル2にデータを登録という流れの中で、データ加工処理に時間がかかっています。
下記excel VBAの内容は
sheet1のC列:シリアルデータ(8桁文字列 例ABCD0001)
sheet1のAE列:日付データ(8桁文字列 例20200612)
sheet1のC列全体をsheet2のA列へコピー
sheet1のAE列全体をsheet2のB列へコピー
sheet2のF列に開始時刻データ(14桁文字列)
sheet2のG列に終了時刻データ(14桁文字列)
を設定
という内容になっています。
F列は日付データの稼働日3日前で時刻が0845 例20200609084500
G列は日付データの時刻が1700 例20200612170000
という計算を実施します。
T_非稼働日シートには工場の非稼働日データ(2020/05/05みたいな休日等)をA列に設定しています。
excel上で計算方法の設定は”手動”にしておき700件くらいのデータに関して下記マクロ実行すると約30[s]程度かかります。
sub test()
Application.Calculation = xlCalculationManual
'sheet1 最終行の取得
Dim LASTROW As Long
LASTROW = Worksheets("sheet1").Cells(Rows.Count, 3).End(xlUp).ROW
'sheet1のシリアルデータ(C列)をsheet2 A列へコピー
Worksheets("sheet1").Range(Worksheets("sheet1").Cells(1, 3), Worksheets("sheet1").Cells(LASTROW, 3)).copy _
Destination:=Worksheets("sheet2").Cells(1, 1)
'sheet1の納期データ(AE列)をsheet2 B列へコピー
Worksheets("sheet1").Range(Worksheets("sheet1").Cells(1, 31), Worksheets("sheet1").Cells(LASTROW, 31)).copy _
Destination:=Worksheets("sheet2").Cells(1, 2)
'F列 日付データの稼働日3日前で時刻が084500
Worksheets("sheet2").Range("F1:F" & Range("A" & Rows.Count).End(xlUp).ROW).Value = "=TEXT(WORKDAY(DATE(MID(RC[-4],1,4), MID(RC[-4],5,2), MID(RC[-4],7,2)),-3,T_非稼働日!C[-5]),""yyyymmdd"")&""084500"""
'G列 日付データの時刻が170000 例20200612170000
Worksheets("sheet2").Range("G1:G" & Range("A" & Rows.Count).End(xlUp).ROW).Value = "=RC[-5]&""170000"""
Application.Calculation = xlCalculationAutomatic
end sub
A列 B列
ABCD0001 20200612
ABCE0001 20200608
ABCE0002 20200610
ABDD0001 20200616
ABDD0002 20200623
…
約600行
これを
end sub
A列 B列 F列 G列
ABCD0001 20200612 20200609084500 20200612170000
ABCE0001 20200608 20200603084500 20200608170000
ABCE0002 20200610 20200605084500 20200610170000
ABDD0001 20200616 20200611084500 20200616170000
ABDD0002 20200623 20200618084500 20200623170000
…
の様にするのに30[S]くらいの時間がかかっている。F列データ作成が遅い状況。
ところが、
Application.Calculation = xlCalculationManual
Application.Calculation = xlCalculationAutomatic
の内容を削除し、計算方法の設定を”自動”で実施すると8[S]程度で終了します。
計算方法は手動の方が早いはずなのに自動の方が速いのは何故なのでしょう?
また600行の計算(F列データを作成する部分です)に関して、もう少し早く出来る構成がありましたら教えていただきたく。
お礼
ご回答ありがとうございました! ANo.1、ANo.2いずれの方法でも成功しました! どちらにも20P付与したいところですが不可能ですので・・・ 先にご回答いただいた方から、ということでご了承ください。