自作したプログラムで、ある計算をした結果をCommonDialog
を使用してファイルに出力しています。
この作業を5000回ぐらいするのですが、計算途中で
「実行時エラー"70"書き込みできません。」
というメッセージがでます。
これは、どういうことなのでしょうか。
そんな質問の仕方だと誰も答えないよ。
どうやってそのエラーを再現させればいいの??
どんな計算かもわからない
どのタイミングで書き込んでるかもわからない
エラーが起きてるタイミングすらわからない
説明下手ならソースをだしてください。
そうですよね。どうもすいません。
説明が下手なので、ソースを書きます。
For i=1 to 10000
call keisan
CommonDialog1.filename = "kekka.dat"
If i = 1 Then
Open CommonDialog1.filename For Output As #5
Print #5, kotae(i)
ElseIf 1 < i < 10000 Then
Print #5, kotae(i)
Else
Print #5, kotae(i)
Close #5
End If
If i > 10000 Then GoTo 15
15:
next i
keisan という計算サブルーチンでは、Shellを使いexeファイルを
実行しkotae(i)を算出しています。
ここでは、エラーは発生していません。
現在、パソコンを2台使用して計算しているのですが、
このプログラムを作成したパソコンではエラーは発生していません。
しかし、作成したプログラムを別のパソコンに移して計算すると、
エラーが発生します。
”vb 実行時エラー70”でネット検索すると、
http://support.microsoft.com/default.aspx?scid=kb%3Bja%3B257757
というのがあり、officeの問題なのかもしれません。
しかし、パソコンに詳しくないのでよくわかりません。
まだ、説明不足かもしれませんがよろしくお願いします。
> 説明が下手なので、ソースを書きます。
掲示板上に直接書くのではなく、現象を再現できるコードを貼って下さい。
> ElseIf 1 < i < 10000 Then
少なくとも、上記のコードはおかしいですよね。
(この式だと、常にTrueとなってしまいますから…)
本当は、
ElseIf 1 < i And i < 10000 Then
と書きたかったのですよね?
すいません。
コードは長いので書き込みました。
コードを貼りたいのですが、とても長いです。よろしいのでしょうか?
> コードは長いので書き込みました。
??
> コードを貼りたいのですが、とても長いです。よろしいのでしょうか?
もちろん駄目でしょう。
こういう時は、コードの全文を貼るのではなく、現象を再現可能な
最低限のコードを貼ってください。
第3者でも検証可能なコードが掲載されれば、原因の特定も容易になりますが、
長いコードがそのまま貼られるのは、聊か問題です。
(デバッグは、あくまで本人がやるべき事ですし)
まずは「エラーが起きる最低限のコード」を作るためにも、
現在のコードのどの行でエラーが発生しているのかを突き止めて下さい。
どこでエラーが起きているのかさえ分からない状態で質問しても、
有効な回答は得られないでしょうから…。
何度もみなさんすいません。
どこでエラーが起こっているかわかりました。
exeファイルを使い計算しているのですが、
おかしい条件の時にexeファイルが無限ループに陥る
ことがあり、ある時間が経過した時exeファイルを強制的に
終了させていました。この次の条件を計算する時にエラーが
起こっていました。強制的に終了した時に、時間を空けてやると
うまく実行できました。
<時間を空けてやるところ>
Public Function WaitTimer(SC As Single) As Double
Dim sv As Single
sv = Timer
Do Until Timer > sv + SC
DoEvents
Loop
WaitTimer = Timer
End Function
<exeファイルの計算>
Dim Ret
STRDATA = ""
'****** exeファイルが終了するまで待機する ******
lngProcessID = Shell("D:\VB\Kaiseki.exe", vbNormalFocus)
hProcess = OpenProcess(SYNCHRONIZE Or PROCESS_TERMINATE, True, lngProcessID)
ShellEnd (lngProcessID)
Call TerminateProcess(hProcess, 0&)
Call CloseHandle(hProcess)
If ti >= 10 Then
WaitTimer 0.1
End If
上の3行を追加。
<exeファイルの終了まで待機>
Private Sub ShellEnd(ProcessID As Long)
Dim hProcess As Long
Dim EndCode As Long
Dim EndRet As Long
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 1, ProcessID)
ti = 0
Do '10秒経過するとexeファイルを終了させる
If ti > 10 Then GoTo 2
EndRet = GetExitCodeProcess(hProcess, EndCode)
DoEvents
Loop While (EndCode = STILL_ACTIVE)
2:
EndRet = CloseHandle(hProcess)
End Sub
今頃遅いかもしれませんが、
Timer関数は日付が変わると0に戻ることをので処理の終了判定に使うと
日付の変わる直前に起動した処理が永久に終わらないことがあります。
今回みたいに短い時間の処理なら無限ループに嵌る可能性は低いですけど。
ツイート | ![]() |