2017-07-07 13 views
0

私は書いた2つのVBAスクリプトでかなり奇妙なエラーに遭遇しました。 ..VBA「キルファイル」は最初の実行では動作しませんが、その後のすべての実行で

これは、Word用とExcel用の2つの同じ機能を処理するVBAマクロです。 何マクロがやっていることは、このようなとして作成された一時的な.txtファイルにいくつかの情報を解析している。

Dim Appl 
Set Appl = CreateObject("WScript.Shell").Exec("cmd.exe /k im viewissue " & issue & " > " & "D:\temp" & issue & ".txt") 
Appl.Terminate 

その後、いくつかの情報は.txtファイルから抽出され、resprectivelyエクセル/ Wordファイルに書き込まれます。

EDIT:ように:編集の

Set FileNum = CreateObject("Scripting.FileSystemObject").OpenTextFile("D:\temp" & issue & ".txt", 1) 
    'Read some lines and write them into the Word/Excel files... 
FileNum.Close 

終了。マクロがファイルに行われた後

は、それを削除します。

Kill "D:\temp" & issue & ".txt" 

すべてが問題なく動作します:ファイルが作成され、情報抽出の作品は、ファイルが削除され...初めての場合を除きますそれを実行しようとします。

初めて起動しようとすると(起動したばかりのマシンで)、「実行時エラー70:アクセスが拒否されました」という行がkillコマンドで接続されます。 エラーメッセージウィンドウをキャンセルしてもう一度やり直しても問題ありません。

私は次のことをチェックしました:

  • .txtファイルは問題
  • せずに手動で削除することができるように
  • 権限が正しく設定されている(でも最初の実行時に)作成されます起動後にWordとExcelの両方のマクロで同じ問題が発生する
  • Wordでスクリプトを実行すると(エラーメッセージで)Excelスクリプトの最初の実行時に問題がなくなります。逃した試みの後に)

私は本当に問題がどのようなものかわかりません...最初の実行とそれ以降のものの違いはよく分かりません。

どのようなヒントもありがとうございます。 乾杯。

EDIT:別の注意FileSystemObjectが問題の原因である可能性を排除することができました。なぜなら、ファイルで実際に何も実行せずにスクリプトを実行するときに同じ問題が発生するからです。

+0

前にApplication.Doeventを試してください。 – Jochen

+0

Jochenはどのようにして正確に関数を呼び出しますか? – budekatude

答えて

1

だから私は偶然ソリューションに遭遇しました:

が、私は「イム」と-commandコマンドラインで呼んでいる新鮮なマシンのIntegrityクライアント、上の最初の実行時に判明していますコネクションについての情報が返されます。

この出力では、コマンドウィンドウを閉じずに.txtファイルにファイルハンドルを保持するスクリプトが混乱しているようです。 権限の問題のためにkillコマンドがファイルを削除できないことがありました。

あなたのご意見ありがとうございます! まだ高く評価されています。

0

「デバッグ中または2回目に動作する」コードの問題は、クリーンアップまたはバックグラウンド処理から出現することがよくあります。多くの場合、関連する部品を呼び出した後に「doevents」を追加すると役立ちます。あなたの場合、あなたは試すことができます:

Dim Appl 
Set Appl = CreateObject("WScript.Shell").Exec("cmd.exe /k im viewissue " & issue & " > " & "D:\temp" & issue & ".txt") 
DoEvents 
Appl.Terminate 
Doevents 
Kill "D:\temp" & issue & ".txt" 

希望に役立ちます。

+0

あなたの提案をありがとうJochen、それでも動作していません。私はまだ最初の実行で同じ問題が発生します... 上記の問題の説明に私の編集も見てください。 – budekatude

0

MS Officeの内部プロセスは、削除するときに削除したいファイルでは実行されないという前提で作業するのが最も簡単な方法は、削除を他の時間まで遅らせることです。たとえば、 Before_Close。別の明白な時間は、ファイルを再度使用する前の状態になりますが、名前が再利用されたときに既存のファイルが上書きされるため、直感的ではありません。私は、ファイルを削除するような急いで急いではないことを指摘し、そのプログラムを直ちに放棄しないように設計したMSエンジニアは、その事実を考慮している可能性があります。

+0

良い提案ですが、スクリプトの最後でファイルが削除されています... ファイルがあるので、スクリプトが実行される次のインスタンスでのみ古いファイルを削除するという考えのように私は辞めることはありませんスクリプトが定期的に実行されていない場合、かなりの時間、マシンの周りに横たわっています... – budekatude

関連する問題