VBA OPENエラー対策のDoEventsとは

このQ&Aのポイント
  • VBAのDoEventsとは、AccessのVBAプログラムにおいてExcelブックファイルを開く直前に使用されるコマンドです。
  • DoEventsを使用することで、プログラムが一時停止し、他のイベントを処理することができます。
  • 具体的には、Excelのファイルを開く際に発生するOPENエラーを回避するために使用されます。
回答を見る
  • ベストアンサー

VBA OPENエラー対策のDoEventsとは

別の人(不明)が作成したAccessのVBAプログラムを 修正しているのですが、 Excelブックファイルを開く直前で、 DoEvents が書かれていて、 「OPENエラー対応」というコメントがあるのですが、 どのような問題があるのでしょうか。 (削除しても正しく動くので問題がなければ削除したいのですが) もし問題が起きる例がありましたら教えてください。 ----------------------------------------------      : Set oApp = CreateObject("Excel.Application") oApp.Visible = False DoEvents 'OPENエラー対応 oApp.Workbooks.Open strFileNameFullPath, IgnoreReadOnlyRecommended:=True oApp.Workbooks(strFilename).Activate      : ---------------------------------------------- (OS:Windows7 , Access2010 )

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8525/19380)
回答No.2

Set oApp = CreateObject("Excel.Application") によりExcelを起動した場合、遅いパソコンだと「Excelが起動するまで時間がかかる」事がある。 起動が早ければ問題は無いが、起動が遅かった場合に「起動が完了するまで待つ」という目的で DoEvents 'OPENエラー対応 を行なって居ると思われる。 このDoEventsを行なった後は、多分、引き続いて行なわれる oApp.Workbooks.Open strFileNameFullPath, IgnoreReadOnlyRecommended:=True が成功する「筈」である。 本来であれば「DoEventsを入れて誤魔化す」のではなく「正常に起動しているかどうか、別の手段で判断すべき」である。 >削除しても正しく動くので問題がなければ削除したいのですが 「問題が起きる場合を再現できない状況」で「もし問題が起きた場合の対策」を削るのは愚行。 「入っていても問題が無いのなら、入れたままにしておく」のが絶対的な鉄則。 削るのは「プログラムが肥大化し過ぎて、メモリが足りなくて、どこかを削らない限り、正常に動かない」と言う場合のみにすること。

yam2012
質問者

お礼

Excel.Applicationの起動が完了するのを 待っていたわけですね。 本来であれば「DoEventsを入れて誤魔化す」のではなく 「正常に起動しているかどうか、別の手段で判断すべき」である。 という説明が、とても参考になりました。 ありがとうございました。

その他の回答 (2)

  • chie65535
  • ベストアンサー率43% (8525/19380)
回答No.3

追記。 世の中のプログラムには「どうしてそれが入っているのか判らない、不可解なおまじない」というモノが存在する。 そして「そのおまじないを削除すると、どういう訳か、プログラムが動いたり、動かなかったり、不安定になる」という事が起きる。 こういう「動いたり、動かなかったり」と言う不具合は「社内のテストでは不具合が出ないが、客先に導入したら客先で不具合が出る」という、メッチャ厄介な不具合になるので「正しく動いているならば、決して、変更したり、触ったりしてはいけない」と言う事を肝に命じておくこと。 こういうのは「上司や先輩は教えてくれない」ので、自分で経験して覚えるしかない。

yam2012
質問者

お礼

あまり教えてもらえないような 貴重なアドバイスありがとうございました。

  • hahaha86
  • ベストアンサー率14% (82/576)
回答No.1

DoEvents 無限ループ(長時間ループ)時に抜け出す 時のコマンド ループ中CPUを独占してしまうので CTRL+ALT+DEL とか 裏でインタネット閲覧など何もできなくなる ディユアルコア以降でも遅くなる

yam2012
質問者

お礼

ありがとうございました。 今後の参考にさせていただきます。

関連するQ&A

  • ACCESS2013のVBAで、EXCELを操作

    ご質問させて頂きます。 ACCESS2013のVBAで、EXCELを操作するために 下記のようにしています。 ------- Dim oApp As Object Dim oWkb As Object Dim oWks As Object Dim Rw As Integer Dim SQL As String Set oApp = CreateObject("Excel.Application") oApp.Visible = True oApp.DisplayAlerts = Flase '確認メッセージの非表示 ↓↓↓オートメーションエラー Set oWkb = oApp.Workbooks.Open(CurrentProject.Path & "\ひながた.xls") ------- 上記のところでオートメーションエラーになってしまいます。 しかし私の端末ではエラーは出ません。 問題と思われるのは エラーが出る人の端末は、 EXCELが2010と2013と 2つのバージョンがインストールされていることです。 このようなことでエラーが出てしまうことはあるのでしょうか?

  • Access VBAからExcelシートの削除

    お世話になります。 Access VBA から指定したExcelシートの削除を行うプログラムを下記の通りに記載しています。 Set oApp = CreateObject("Excel.Application") oApp.Workbooks.Open FileName:="エクセル.xls" oApp.DisplayAlerts = False oApp.Sheets("シート名1").Delete oApp.DisplayAlerts = True この場合において、"シート名1"が存在していれば問題なく処理されますが、 このシートが存在していなければエラーが起きます。 指定したExcelブックにこのシートが存在するかどうかのチェックを事前に行い、 存在する場合のみ削除処理を行うにはどうすればよいでしょうか? よろしくお願いします。 環境は、Access2007です。

  • アクセスからエクセルを開いてデータを取得するには?

    こんにちは。 MS AccessからExcelを開いて、Excel上のデータを取得したいのですが、下記のようにしたらエラーとなりました。CellsがNGみたいなのですが、AccessではCellsは使用出来ないのでしょうか? 宜しくお願いします。 Dim oApp As Object Set oApp = CreateObject("Excel.Application") oApp.Visible = True On Error Resume Next oApp.UserControl = True oApp.Workbooks.Open Filename:="C:\TEST\Book1.xls" GYO = 1 Do KI = Cells(GYO, 1).Value MsgBox KI GYO = GYO + 1 Loop Until Cells(GYO, 1) = ""

  • DoEvents

    VBSでDoEventsは使えないのでしょうか? *************************** Dim ObjIE dim i Set ObjIE = CreateObject("InternetExplorer.Application") ObjIE.Navigate "http://oshiete.goo.ne.jp/" ObjIE.Visible = True Do While ObjIE.Busy = True DoEvents Loop Do While ObjIE.Document.ReadyState <> "complete" DoEvents Loop Set ObjIE = Nothing *************************** だと、エラーになりました。 Wscript.sleep 3000 ならエラーにならずにコードは動きました。 VBAならDoEventsは使えるのに VBSで使えない理由を教えてください。

  • ACCESSからEXCELの PasteSpecial でエラーになる

    ACCESSからEXCELを操作しています。 範囲コピー後、書式のみペーストしたいのですが、うまくいきません。 以下の PasteSpecial の行でエラーになります。 エラーメッセージは「Range クラスの PasteSpecial メソッドが失敗しました。」です。パラメータを付けないと全てがコピーされ正常に終わります。 パラメータをダブルクォートで囲っても駄目でした。 EXCELのマクロ出力そのままなのですが、書き方が悪いのでしょうか。 Dim oApp As Object Set oApp = CreateObject("Excel.Application") oApp.UserControl = True oApp.Workbooks.Open FileName:="format.xls" oApp.Range("A1:D4").Select oApp.Selection.Copy oApp.Range("C9").Select '↓エラーになる oApp.Selection.PasteSpecial Paste:=xlFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

  • SaveAsでバージョンを指定して保存する方法

    SaveAsでバージョンを指定して保存する方法が分かりません。 WINDOWS7 ACCESS2010のVBAから、EXCEL2000用のファイルとして保存するために、以下のようにしました ------------ Dim oApp As Object Dim oWkb As Object Dim oWks As Object Set oApp = CreateObject("Excel.Application") oApp.Visible = True oApp.DisplayAlerts = Flase '確認メッセージの非表示 Set oWkb = oApp.Workbooks.Open(filename:=CurrentProject.Path & "\" & MyFile, PassWord:="") ・ ・ ・ ↓ここで「オブジェクトがありません」と言うエラー oWkb.SaveAs CurrentProject.Path & "\" & MyFile, FileFormat:=xlExcel9795 どのようにしたら宜しいですか?

  • ACCESS VBA からのワードファイルの起動

    ACCESS97を(未だに!)使用しています。 これから、VBAでワードの既存ファイルを起動したいと考えています。その際、ワードを新規に立ち上げることなく、表示して編集したいわけですが、どうしても新規に起動してしまします。 これまで試したのは、 Dim oApp As Object Set oApp = GetObject("", "word.Application") oApp.Visible = True oApp.Documents.Open FileName:="C:\filename.doc" および Dim oApp As Object Set oApp = CreatObject("word.Application") oApp.Visible = True oApp.Documents.Open FileName:="C:\filename.doc" などです。 しかし、すでにワードが起動していても、どうしても、新たにワードを立ち上げてしまいます。 解決策はあるでしょうか? ちなみにエクセルだと、GetObject で既に起動しているエクセルに追加でアプリが表示されます。

  • Workbooks.Open VBA

    Dim xlApp As Object Dim xlWbk As Object Set xlApp = CreateObject("Excel.Application") xlApp.Visible = True Set xlWbk = xlApp.Workbooks.Open("C:\Users\test.xlsx") の後に、 xlWbk.Sheets("1").Select とするのと、 xlApp.Sheets("1").Select とするのでは、 同じ意味ですか? どちらも C:\Users\test.xlsx の シートを選択することになりますか?

  • vbsでexcelのクリアとフォームの表示をしたい

    お世話になっております。 vbsの以下の記述でexcelを開いています。 開くところまでは行くのですが、その後のsheet1のデータのクリアとUserForm1の表示がどうしてもできません。 申し訳ありませんが、どなたかおわかりの方、教えていただけないでしょうか。 宜しくお願いいたします。 Dim oApp Dim objWshShell Dim scriptPath 'Excelオブジェト作成 Set oApp = CreateObject("Excel.Application") 'WScript.Shellオブジェクト作成 Set objWshShell = CreateObject("WScript.Shell") oApp.Visible = True '不可視にする oApp.UserControl = True 'Excelファイルを開く scriptPath = WScript.ScriptFullName scriptPath = left(scriptPath,len(scriptPath)-len(WScript.ScriptName)) oApp.Workbooks.Open scriptPath & "共同資料.xlsm"

  • バッチファイルからVBA実行でエラー

    バッチファイルからエクセルのマクロを動かそうとしているのですが、 処理はきちんと動いて処理を行なうのに、エラーウィンドウが出力され ”未知実行時エラーです”(画像添付)となり困っています。 どうすれば、このエラーを無くせますでしょうか? 因みにバッチファイルは以下の通りです。 Dim obj Set obj = WScript.CreateObject("Excel.Application") obj.Visible = True obj.Workbooks.Open "C:\Documents and Settings\ne05576\My Documents\Datamove.xls" obj.Application.Run "FileMove" よろしくお願いします。

専門家に質問してみよう