
Excel2010(Windows7 64bit)のVBAであるプログラムを作っていたのですが、以下の様な原因不明のエラーが生じてしまいます。
1. 自分では同じ操作をしているつもりなのですが、エラーが出る場合と出ない場合があり、エラーの原因を特定できません。
2. Errオブジェクトを調べたところ、エラー番号が「-2147417848」です。
3. エラー発生後にExcelがフリーズして数分待っても終了しません。仕方がないのでWindowsを再起動しています。
4. エラーが発生する様になる前は、プログラムは問題なく動いてしました。動かなくなった日に行った変更は、時間がかかるループ内にDoEventsを入れたことと、モーダレスダイアログを表示するようにしたことです。ただ、その他にも細かい変更をしましたし、エラーが発生するタイミングが解らないので、これが原因かはわかりません。
以上です。もし、エラーの原因や解決方法等、何かご存じの方がいらっしゃいましたらご教授くださいますようにお願いいたします。
No.4ベストアンサー
- 回答日時:
おはようございます。
モーダレスフォームが応答なしになるの対策ですが
処理の進歩を示すフォームなら、DoEventsでOSに処理を一旦渡さなくても
UserForm1.RePaintで出来ます。
もし
Label1.Caption = s & "% 処理中・・・"
DoEvnets
みたくなっているのでしたら
Label1.Caption = s & "% 処理中・・・"
UserForm1.RePaint
に置き換えてみるとどうでしょう?
このRePaintも頻繁に呼び出すと画面がちらつきますので呼び出す回数は工夫が必要
です。(例えば、10%毎に呼び出すとか)
VBAは処理速度が遅いので、WinApiのSleepを適度にはさんでやるのもいいのかも
しれません。
複数の環境で使われているみたいですから、条件付コンパイルを使ってSleepを宣言します。
#If VBA7 And Win64 Then
'64ビット版
Public PtrSafe Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#Else
'32ビット版
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If
この様に標準モジュールに宣言をして
Do
Sleep 100
処理
Loop
とすると応答なしにならなくなります。CPUも100%使い切る事もなくなります。
このSleepは指定時間だけ処理を止めるものですから、コツは短い時間(ミリ秒)
を何度も挟むことです。長い時間はさむと処理もExcelの操作も一切出来ません
ので注意が必要です。
根本的な解決に繋がるか自信がありませんが、何かの参考になりましたら。
ご回答ありがとうございます。その後、色々試してみました。あるシートのセルにある程度まとまったデータを書き込むループがあったので、その中にDoEventsを入れていたのですが、そのループに入る前にScreenUpdatingをFalseにしていました。これをTrueにしたらエラーが出なくなりました。これが直接の原因だったのかはよく判らないのですが、とりあえずこれで進めてみます。色々お教えいただきましてありがとうございました。
No.3
- 回答日時:
No2です。
このようなパターンでないですか?
DoEventsを入れてある無限ループ中にSheet1を手動で削除してみて下さい。
wsはNothingではありませんが、wsの実体がなくなってしまうと
オートメーションエラーになります。
新規ワークbookで試して下さい。
Sub Sample()
Dim ws As WorkSheet
Set ws = WorkSheets(1) '一番左のワークシートをセット
Do
DoEvents
If Not ws Is Nothing Then 'wsがNothingでないなら
Debug.Print ws.Name 'シートを削除すると、ここでオートメーションエラー
End If
Loop
End Sub
例はワークシートですが、UserFormへの参照や他諸々のオブジェクト変数の実体が
なくなる様な操作またはコーディングをしていませんか?
DoEventsは諸刃の剣と書きましたが、DoEventsをループ毎に読み込むのは逆に
処理速度を下げてしまいます。
Sub Sample2()
Dim i As Long
Dim s As Single
s = Timer
For i = 0 To 300000
DoEvents
Next
MsgBox Timer - s
End Sub
Sub Sample3()
Dim i As Long
Dim s As Single
s = Timer
For i = 0 To 300000
If (i mod 10000) = 0 Then 'iが10000で割り切れる時だけDoEventsを実行
DoEvents
End If
Next
MsgBox Timer - s
End Sub
ループ中にキャンセルを受け入れるのにはDoEventsは必要ですが、使用する回数は
極力少なくするのがいいと思います。(少なくするとキャンセルを受け入れるまで少しもた
つきますが。そこは加減で調整です。)
ご回答ありがとうございます。その後、いろいろ試してある程度原因となる箇所が解ってきました。あるシートに比較的大きな範囲(A~SS×1~86)のセルに値を入力するループがあり、その中にDoEventsを入れていたのですが、そのループをある条件で呼び出すとエラーが起きるようです。但し、複数のパソコンで実行したところ、発生するパソコンと発生しないパソコンがありました(excelのバージョンは同じ)。また、同じパソコンでも、サブルーチンを呼び出す順番を変えるとエラーが発生しなくなりました。更に、問題となるループ内のDoEventsを消せばエラーは発生しない様です。結局、DoEventsが原因だと考えて良いのだと思うのですが、DoEventsが直接の原因なのか、そもそも存在していたエラーがDoEventsによって顕在化したのかよくわかりませんでした。また、ループ内ではセルに出力する値を計算するコードもありますので、大量のセルに出力すること自体が問題かどうかもよくわかりませんでした。
DoEventsを入れる理由ですが、キャンセルを受け付けるだけならそれほど頻繁にDoEventsを呼ばなくても良いのですが、モーダレスダイアログに「...(応答無し)」と表示されてしまうと第3者がフリーズしたと勘違いしてしまうと思っています。ですので、DoEventsを入れなくても「...(応答無し)」と表示されないようにする方法があれば、ループ内のDoEventsをそれに置き換えれば良いと思うのですが...。
No.2
- 回答日時:
こんばんは。
DoEventsは諸刃の剣ですからね。
一概にDoEventsが犯人だと決め付けられませんが怪しいですね。
ループ中にDoEventsを入れ込むと、ループ処理中に割り込みが可能になりますから
何か別の操作をしてしまったりすると、誤動作の原因にはなりますね。
DoEventsを入れた理由は何故でしょう?モーダレスフォームとは、もしかして
処理中を示す自作のプログレスバー的なものですか?
コードの提示がないのでこれ以上はわかりませんが
問題の原因を切り分けて調べて見ましょう。
DoEventsを削除するとエラーはおきなくなるか?
モーダレスフォームの表示をやめると?
この両方をやめると?
など個別に調べてみましょう。
ループ中に別の操作をしているなら"DoEvents"が8割怪しいですよ。
ご回答いただきましてありがとうございます。DoEventsを入れた理由ですが、仰るように、比較的時間がかかるループがいくつかあるので、キャンセルボタンを配置したプログレスバーのようなものを表示して、ループの前後でキャンセルが押されたから調べ、押された場合はプログラムの実行を中止するようにしました。また、そのままだとループ内でダイアログボックスのタイトルに「...(応答なし)」と表示されてしまうので、ループ内にDoEventsを入れました。
エラーの発生原因がわからず、エラーの発生率もそれほど高くないのでなかなか原因を特定できないでいます。DoEventsをコメントアウトしたりして試しているのですが、何となく、DoEventsを頻繁に呼ぶとエラーが発生しているように感じるのですが...。
No.1
- 回答日時:
上記のサイトに紹介されているケースとは違いますか?
エラーの発生箇所が分からないのであれば、絞り込むよう手を打つしか無いと思います。
具体的には「ある処理を行ったら現象が発生する」というのを徐々に絞り込んでいくということです。
残念ながらご質問の文面からではエラー原因を回答することは難しいと思います。
どうしても回答が必要な場合は、ソースコードの開示をお願いします。
ご回答いただきましてありがとうございました。ご紹介いただきましたサイトに示されているエラー番号が私の場合と同じですので、コレが原因かもされません。調べてみます。ソースコードですが、かなりの量を書いているコードのどこが原因なのか特定できていないため、このサイトに載せることができませんでした。もう少し調べてみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) EXCELの外部データ取得ができない 1 2023/03/23 09:03
- Excel(エクセル) Excel起動時にエラーダイアログが表示される 3 2022/07/28 19:52
- ヤフオク! ヤフーかんたん決済について教えて下さい。 落札者になります。 商品を落札し、かんたん決済でクレジット 1 2023/03/18 00:30
- Visual Basic(VBA) VBAのエラーについて 2 2023/08/02 17:46
- Windows 10 数年前からWindows10 の Update ができないです。なぜですか? 7 2022/11/09 06:03
- FX・外国為替取引 MQL5にて謎のエラーが発生!だれか対処を教えてください! 1 2023/03/25 15:59
- プリンタ・スキャナー キャノンmp490プリンター【エラー番号5400】で【プリンタートラブルが発生しました。電源を入れ直 2 2023/07/24 17:45
- au(KDDI) 特定の画面を見るとスマホが固まります ご覧頂き有難うございます。 特定のページを見るとスマホが固まり 1 2023/08/21 19:29
- Excel(エクセル) excelvbaの復元?(excel2003) 2 2023/02/08 14:16
- Excel(エクセル) エクセル VBAの構文について 2 2023/02/10 18:26
このQ&Aを見た人はこんなQ&Aも見ています
-
DoEventsがやはり分からない
Visual Basic(VBA)
-
Excel VBA で処理中断(DoEvents)ができなくて困ってい
Visual Basic(VBA)
-
エクセルVBAが途中で止まります
Visual Basic(VBA)
-
-
4
特定のPCだけ動作しないVBAマクロがあります。その理由は?
Visual Basic(VBA)
-
5
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
6
DoEvents関数って何?
Visual Basic(VBA)
-
7
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
8
エラーになってないのにVBAが中断される
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UserForm1.Showでエラーになり...
-
【Access】Excelインポート時に...
-
VBAでfunctionを利用しようとし...
-
【VBA】ワークブックを開く時に...
-
お助けください!VBAのファイル...
-
String""から型'Double'への変...
-
VBAのリストボックスで、横スク...
-
VBA エクセル で FIND でのエラ...
-
ApplicationとWorksheetFunctio...
-
文字列内で括弧を使うには
-
インポート時のエラー「データ...
-
Filter関数を用いた結果、何も...
-
ACCESSで値を代入できないとは?
-
実行時エラー 438 の解決策をお...
-
Excel ピボットテーブル平均・...
-
【VBAエラー】Nextに対するFor...
-
Accessにアクセスしデータを表...
-
Scilabのstacksizeの増やし方が...
-
On ErrorでエラーNoが0
-
マクロの「SaveAs」でエラーが...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
マクロOn Error GoTo ErrLabel...
-
UserForm1.Showでエラーになり...
-
お助けください!VBAのファイル...
-
VBAでfunctionを利用しようとし...
-
【VBA】ワークブックを開く時に...
-
String""から型'Double'への変...
-
文字列内で括弧を使うには
-
マクロで"#N/A"のエラー行を削...
-
Excel vbaについての質問
-
VBA データ(特定値)のある最...
-
On ErrorでエラーNoが0
-
インポート時のエラー「データ...
-
【VBAエラー】Nextに対するFor...
-
ACCESSで値を代入できないとは?
-
【Access】Excelインポート時に...
-
VBでSQL文のUPDATE構文を使った...
-
【VB.NET】 パワポ操作を非表示で
-
「実行時エラー '3167' レコー...
-
実行時エラー 438 の解決策をお...
-
実行時エラー'-2147467259(8000...
おすすめ情報