2016-06-25 22 views
0

インターネットから情報をダウンロードするマクロがあり、特定の時刻に開始され、設定された時間間隔で自動的に実行されるようにスケジュールする必要がありますマクロによって出力されます。タイマーからvbscript経由でマクロを自動的に実行

私は2つの方法で問題にアプローチしましたが、どちらも問題を明らかにしていません。最初の方法は、マクロによって更新されたブック内のセルから派生したランタイムでApplication.OnTimeコマンドを使用してマクロを実行するタイマーサブを使用することです。

私がコンピュータに何か他のことをしている場合、この方法はうまくいきます。しかし、私が去ると、たとえコンピュータがスリープ状態にならなくても、プログラムは30分後に再起動することが必然的に中止されることに気づいた。時々、私はコンピュータ上でアクティブであっても再実行を停止します。どうしてこれなの?これを引き起こす原因は何ですか?また、当然ながら、マクロ内から自動的にプログラムを開いて実行するようにスケジュールすることはできませんので、ソリューションのこの部分についてはVBScript &タスクスケジューラメソッドを参照しました。

しかし、私はVBScriptの実行に2つの問題がありました。まず、タスクスケジューラで実行すると起動が失敗することがよくあります。次に、実行されると、マクロ内のApplication.OnTimeコマンドが機能しません。これは、マクロが繰り返し実行されるときに、1日のコース中に決定される不規則な時間間隔でマクロを実行する必要があるため、問題です。タスクマネージャが試行したときにvbscriptが実行されないのはなぜですか?また、手動で実行するときにマクロが行うようにapplication.ontimeコマンドを起動しないのはなぜですか?

VBAタイマーコード:

Sub Timer() 
    Dim Runtime As Date 

    If Time <= TimeValue("17:45:00") Then 
     Workbooks("10am_Swing_Report").Sheets("Parameters").Cells(17, 2).Value = 10 
    ElseIf Time > TimeValue("17:45:00") And Time <= TimeValue("18:15:00") Then 
     Workbooks("10am_Swing_Report").Sheets("Parameters").Cells(17, 2).Value = 13 
    ElseIf Time > TimeValue("18:15:00") And Time <= TimeValue("18:45:00") Then 
     Workbooks("10am_Swing_Report").Sheets("Parameters").Cells(17, 2).Value = 16 
    ElseIf Time > TimeValue("18:45:00") And Time <= TimeValue("19:15:00") Then 
     Workbooks("10am_Swing_Report").Sheets("Parameters").Cells(17, 2).Value = 19 
    End If 

    Workbooks("10am_Swing_Report").Sheets("Parameters").Range("B16").Calculate 
    If Time > Workbooks("10am_Swing_Report").Sheets("Parameters").Range("B16").Value Then 
     Runtime = Time + TimeValue("00:00:30") 
    Else 
     Runtime = Workbooks("10am_Swing_Report").Sheets("Parameters").Range("B16").Value 
    End If 

    Application.OnTime TimeValue(Runtime), "Swingtimer" 

    Workbooks("10am_Swing_Report").Sheets("Parameters").Range("C16").Value = Runtime 
    Workbooks("10am_Swing_Report").Save 
End Sub 

ありがとう!

ランタイムが渡されたという検証を含むようにVbsコードを更新しましたが、まだタスクスケジューラがタスクを開始できないという問題が発生しています。次のエラーが表示されます。「起動要求は無視されました。インスタンスはすでに実行中です。」続いて「タスクが失敗しました」。私はもともと、Vbscriptが以前のインスタンスからまだ実行されていたためだと考えていましたが、私はこれを最初から取得しています。

Option Explicit 


Dim xlApp  
Dim xlBook  
Dim runtime 
Dim xlSheet 



Set xlApp = CreateObject("Excel.Application") 
xlApp.DisplayAlerts = False 
'xlApp.Application.DisplayAlerts = True 
Set xlBook = xlApp.Workbooks.Open("C:\Users\DORIAN\Dropbox\Swing_Report.xlsm",1,False) 
Set xlSheet = xlBook.Sheets("Parameters") 

'xlBook.application.Visible = True 

'MsgBox FormatDateTime(xlSheet.Range("B16").Value,3) 
runtime = TimeValue(FormatDateTime(xlSheet.Range("B16").Value,3)) 
'MsgBox runtime 


If Time > runtime Then 
    xlApp.Run "Swingtimer" 
    'MsgBox "Running..." 
    WScript.Sleep 30000 
Else 
xlApp.Application.OnTime runtime, "Swingtimer" 
'MsgBox "Timer Set" 
End If 


xlbook.close True 

WScript.Quit 
+0

VBAとVBScriptの両方のコードを入力してください。それが今述べられているように、答えとして提供できるものはあまりありません。 – trincot

答えて

0

これは別の方法で行いますか? 1) Windowsスケジューラでvbscriptを実行すると、1分ごとまたは1時間ごとなどと表示されます。

2)

は、おそらくのOnTimeイベントハンドラを取り除くことができ、この

敬具を使用した場合の条件は、その後 があなたのコードエルス 停止するVBScript 終了を実行している場合VBスクリプト
内のいくつかの検証を置きます アレックス

+0

ありがとうございます。私は現在、タスクスケジューラで5分ごとに実行するように設定しています。頻繁に実行したくない場合もありますが、5分間隔で実行する必要がある場合もあります。つまり、通常8時50分と8時55分に実行されます。私は、vbaの代わりにvbscriptにブックから実行時間を引き出すことができるかどうか疑問に思っていた。しかし、私はそれを動作させる方法を理解できません。 何らかのバリデーションに関しては、何も検証していません。私はプログラムを5分ごとに実行したいが、時にはその間も実行したい。 – Dorian821

+0

@ Dorian821では、イベントとタイマー(vbsを使用してイベントを作成する方法についてはstackoverflowで検索)によって起動されるようにタスクスケジューラを変更できます。 – Jules

+0

@ Dorian821私が「検証」という言葉を使用したとき、あなたの条件に基づいて実行するかどうかを決定することを意味しました。たとえば、あなたのスケジューラは1分ごとに起動します:8:50 - 実行(時間別)。 8:51 - 実行されません。 8:52 - 走る(余分な条件によって); 8:53 - 実行されていないなど – Alex

0

あなたは物事を複雑にしていると思います。 Workbook_OpenイベントとWindowsタスクスケジューラが必要です。

このようなもの(ニーズに合わせてカスタマイズ)

Private Sub Workbook_Open() 
    Msgbox Date 
    Worksheets("Sheet1").Range("A1").Value = Date 
End Sub 

Windowsタスクスケジューラを使用してイベントをスケジュールします。

http://www.sevenforums.com/tutorials/11949-elevated-program-shortcut-without-uac-prompt-create.html

+0

あなたは私がそれをもっと簡単にすることができるのです。しかし、現在のところ、コードはうまく動作し、vbaコードが不必要に実行されないようにするための検証が好まれます。この問題は、実際にはタスクスケジューラで検出されているようです。このスクリプトは手作業で大きく動作しますが、タスクスケジューラを使用してスケジュールに沿って実行するには、引き続き問題が発生します。現時点では、スクリプトを開くことさえしていないようです。それは "作成されたタスクのプロセス"で停止し、ちょうどそこに何時間も残っています。一方、タスクマネージャーにwscriptまたはExcelプロセスの痕跡はありません – Dorian821

+0

これはより良い解決策です。アドホック実行が必要な場合は、イベントログで実行するようにタスクを変更します。 vbsモジュールを作成してイベントを作成し、それをデスクトップのショートカットに配置することができます。 – Jules

+0

私はそれが物事を助けるか簡略化する方法を見ていません。プログラムの基準は単純に時間ベースであり、サーバー上で毎日自動的に実行されます。したがって、デスクトップのショートカットとイベントログを使用して別のプログラムを設定すると、時間ベースのスケジュールよりもうまく機能するのですか? – Dorian821

関連する問題