|
はじめまして。AccessVBA初心者です。
現在、処理速度の改善を行う為、
他者が作成したコードを解析しています。
(Excelへのインポート・エクスポートなどを行っている処理。)
その中で気になったのが、DoEventsです。
DoEventsの意味をはっきりわかっていないので、
必要性がわかりません。これはやはり絶対必要なものなのでしょうか。
以下に、解析中のソースの一部を記載します。
*********************************************
With rs
Do Until .EOF
strFileName = txtFolder & !FileName
CurrentDb.Execute "DELETE * FROM wrk1;"
DoEvents
CurrentDb.Execute "DELETE * FROM wrk2;"
DoEvents
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, "wrk1", strFileName, False, "", True
DoEvents
FUC_DropTable "Sheet1$_インポート エラー"
DoEvents
CurrentDb.Execute "DELETE * FROM wrk1 WHERE F1 = '2';"
DoEvents
strSQL = "SELECT F1 FROM wrk1 WHERE (F2 Is Null AND F5 Is Null);"
Set rs2 = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)
Do Until rs2.EOF
CurrentDb.Execute "INSERT INTO wrk3 ( AName ) VALUES ( '" & rs2!F1 & "' );"
DoEvents
strAName = rs2!F1
rs2.MoveNext
If rs2.EOF Then Exit Do
DoEvents
Loop
rs2.Close
strSQL = "UPDATE wrk4 AS A INNER JOIN wrk3 AS B ON A.AName = B.AName "
strSQL = strSQL & "SET B.ACode = A.ACode;"
CurrentDb.Execute strSQL
DoEvents
strSQL = "SELECT * FROM wrk1 WHERE F1 Is Null;"
Set rs2 = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)
Do Until rs2.EOF
For i = 0 To intMAX - 1
If Not IsNull(rs2.Fields(i + 1)) And Len(Trim(rs2.Fields(i + 1))) <> 0 Then
strSQL = "INSERT INTO wrk2 ( ID, ProductCode ) "
strSQL = strSQL & "VALUES ( " & i + 1 & ", '" & rs2.Fields(i + 1) & "' );"
CurrentDb.Execute strSQL
DoEvents
End If
If i >= 4 And (IsNull(rs2.Fields(i + 1)) Or Len(Trim(rs2.Fields(i + 1))) = 0) Then Exit For
Next i
rs2.MoveNext
If rs2.EOF Then Exit Do
DoEvents
Loop
*********************************************
上記は本当に一部を抜粋したものなのですが、
異様にDoEventsが多いようです。
DoEventsありのまま実行すると、処理時間が約17分。
DoEventsを全てコメントアウトすると、処理時間が約3分になりました。
今悩んでいるのは、DoEventsを消してしまって良いものか、
消しても問題がないものかの説明があまりつかないことです。
上記処理にて、DoEventsを取ってしまっても(必要な箇所があれば残す)
問題ないでしょうか。
逆にここには必要だという箇所があれば、アドバイス頂ければ幸いです。
すみませんが、回答お願い致します。
|
|