Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


7015 / 9994 ←次へ | 前へ→

【6176】DoEventsの必要性?
質問  たな  - 05/9/6(火) 17:56 -

引用なし
パスワード
   はじめまして。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を取ってしまっても(必要な箇所があれば残す)
問題ないでしょうか。

逆にここには必要だという箇所があれば、アドバイス頂ければ幸いです。

すみませんが、回答お願い致します。
2,670 hits

【6176】DoEventsの必要性? たな 05/9/6(火) 17:56 質問
【6180】Re:DoEventsの必要性? 小僧 05/9/6(火) 20:08 回答
【6182】Re:多分、必要 たん 05/9/7(水) 8:39 回答
【6184】Re:多分、必要 たな 05/9/7(水) 9:08 発言
【6185】Re:多分、必要 たん 05/9/7(水) 9:22 回答
【6187】Re:多分、必要 たな 05/9/7(水) 9:37 お礼
【6186】Re:多分、必要 たな 05/9/7(水) 9:31 質問
【6183】Re:DoEventsの必要性? たな 05/9/7(水) 8:49 お礼
【6188】Re:DoEventsの必要性? 小僧 05/9/7(水) 10:00 発言
【6189】Re:Executeメソッドのヘルプより たん 05/9/7(水) 10:17 回答
【6190】Re:Executeメソッドのヘルプより 小僧 05/9/7(水) 10:26 発言
【6192】Re:Executeメソッドのヘルプより たん 05/9/7(水) 11:22 回答
【6195】Re:Executeメソッドのヘルプより 小僧 05/9/7(水) 12:02 発言
【6221】Re:Executeメソッドのヘルプより たな 05/9/8(木) 8:50 お礼

7015 / 9994 ←次へ | 前へ→
ページ:  ┃  記事番号:
1078255
(SS)C-BOARD v3.8 is Free