アプリ版:「スタンプのみでお礼する」機能のリリースについて

おねがいします。

Sub SetTimer()

On Error Resume Next

'時間変更注意
Application.OnTime TimeValue("00:00:30"), "強制終了"

'時間変更注意
Application.OnTime TimeValue("00:10:00"), "SetTimer"
'時間変更注意
Application.OnTime TimeValue("00:10:30"), "フォルダ作成"



'時間変更注意
Application.OnTime TimeValue("23:52:00"), "プリント"

'時間変更注意
Application.OnTime TimeValue("23:54:00"), "DB保存"

'時間変更注意
Application.OnTime TimeValue("23:56:00"), "DBから日別保存へコピー"

'時間変更注意
Application.OnTime TimeValue("23:58:00"), "表のクリア"


UserForm16.Show

End Sub

以上ののマクロを作成、実行します。
23時52分から一連の作業をして、0時10分に自ら次回のタイマー予約を踏むマクロです。

エクセルは、無人で24時間自動起動させています。

一番最初(ブックを開く)に、どのタイミングでスタートするかわからないので、
workbookプロシージャに
workbook.openのタイミングで
Call SetTimerを入れてあります。

印刷が二回発生して気付いたのですが、
このままだと、0時2分に再起動がかかり、ブックを開きなおします。
(SetTimer)
で、0時10分に自己発動タイマーが働きますよね。(SetTimer二回目)

すると、一連の作業は二重実行されてしまい、困ってます。

マクロ自身にフラグを持たせるんですか?
なんとか、一度だけ実行をすることはできないんでしょうか?

教えてください。おねがいします。

A 回答 (4件)

返事が遅れました。



>実行命令は二回分になっているのでしょうか?
昔、何度も、ここらは実験しています。Excelを終了したら、OnTime 設定はクリアされます。

>命令自体は実行予約をした回数(Settimerをした回数)してしまうものなんですか?

そのとおりです。だから、再帰(ここでは、SetTimerの呼び出し)する場合は、OnTime の命令される側のマクロの中に、SetTimer の呼び出しをさせます。時々、SetTiemr 側に書く人がいますが、別に特に問題はないものの、命令される側のマクロの実行に関係なくマクロの実行を行ってしまうものです。

なお、実行ファイルをUWSCを、他社の環境で使うわけに行かない場合は、Excelの外に出て、多少のクリックの命令などは送ることは可能だと思いますが、最終的に、ハンドルを取らないといけませんので、非公開のツールだと難しいかと思います。
    • good
    • 0

もう一度、書き直すつもりですが、この部分だけ。


>>(自動実行では、UserForm は使わないほうが無難です。)
>なにかあるんですか?

UserForm は、Application のオブジェクトのひとつですが、もともと、UserForm は、対話型のツールのひとつで、VBのように単体インスタンスとはいえないし、UserForm を他のオブジェクト(シートやActiveX コントロール)を抱えながらでメモリから解除されるときに、タイムラグが生じるらしいのです。単に、VBAエラーではなくて、アプリケーションのフリーズやエラーが起きることがあります。UserForm なしで使っているよりも、トラブル率が高くなります。

Excel 97 時代には、そのようなことはなかったというか、別のトラブルも多かったのではっきりしないのですが、Excel2000移行は、対話型以外には、UserForm はお勧めできないのです。

>アドインが機能せず、呼び出し方法も、呼び出すものも(EXEファイルの実行だけでは機能しなくて)わからなかったので、
EXE型のアドインというのは、単に、Excelのオートメーションを探しているだけではありませんか?アドインというのは、xla や dll が一般的ですから、拡張子EXE は、COMアドインでしょうか?

普通は、アドインの呼び出しというのは、VBAで、CALLしたり、AddFromFile を使いますが、COMアドインでしたら、

''CreateObject として、Application 単独で起動した場合のアドインの入れ方
 Application.COMAddIns.Item(1).Connect = True 'Item プロパティの引数は具体的な名称を入れても良い
-------------------------------------------

>Userform11自体にUnload meをいれてあるのですが、ちがいがありますか?
Me がUserform11であれば、違いはありません。

>実は、明日このプログラムを客先に導入なんです
それは厳しいですね。一度、こちらも自分なりにコードを通してみないと、はっきりしたことが言えませんが、私なら、WSHで作ることになると思います。何かあっても、及ぶ範囲が少ないからです。それと、私なら、UserForm を使いません。もし使わなくてならないなら、DialogSheet で作ります。負担が少ないからです。

今日は、別の用事ですので、もう一度、読み直して細かく見てみます。
    • good
    • 0

こんばんは。



起動自体を、先に書いたように、オートメーション(CreateObject)にするのが、制約が少ないと思います。ただし、アドインに対しては、起動するときに、呼び出さないといけません。そうしないと、アドインを含まずに起動してしまいます。

>「ExcelVBAにてアプリをタスクマネージャーから強制終了させたいのですが」
>これは、なんとかコード化でき、テストをしているところですが、
>ぶった切ってしまうところが気にはなります。

良く考えてみましたが、Excel 2003 以降ですと、次回起動するときに、エラー表示が現れると思います。プロセスから切断するのは、特にExcelはうまくありませんね。

>0時2分の起動は、どこに矛盾があるのでしょうか?
>>開いて仕事をしたら、終了するようにすればよいと思うのです。
>すみません。わかりません。

こういう部分は、言葉で説明したら、どうどう巡りになるだけです。ひとつの「仕事=マクロ」は、二重になるのはロジックとしてヘンだというだけです。そういう部分で、あまり、突っ込まないでください。ただ、少なくとも、自動起動だったら、Excelというアプリケーションに仕事をさせるのに、自動終了まで、ひとつの流れに沿って、働かせるということです。

>Sub 強制終了()

このコードは、途中でハングしていないのですか?
>userform11.Show '←これは、二重起動していたりしたら、場合によりハングします。

Unload UserForm11 '←これは入れます。
ThisWorkbook.Close False '←は入れたほうが無難です。
Application.Quit

(自動実行では、UserForm は使わないほうが無難です。)

>三菱(アプリの製作元)もアプリ本体からの切断以外はできない(教えれない)、と一蹴されました。
アプリケーションって、物理的なスイッチ等はないのですね。もし、ソフトウェアなら、それは、どのみち可能なんです。

もちろん、もう一度、VBAマクロは精査しなければならないものがいくつかあるようですが、こちらも、具体的にどうこうとは現場で、担当でもなければ言えないわけだと思うのです。しかし、昼夜働くようなマクロは、[Windowsマクロ]にして、UWSC という、キーボードマクロのソフトウェアで行えば、Win32APIを使いこなせない場合のテクニックを補う程度のものは十分にあります。

http://www.uwsc.info/

これを、VBAのマクロから呼び出して実行させても良いです。

Win32APIも多少は備えているというのだから、これで、プログラミングの知識は必要で、こちらのソフトのコーディングは、初級のVBAよりは難しいですが、慣れている人ならすぐに出来ます。

この回答への補足

こんばんわ。
いろいろとありがとうございます。
なんだか説明不足の箇所がいくつもあり、
お手数掛けてしまってすみません。

>起動自体を、先に書いたように、オートメーション(CreateObject)にするのが、制約が少ないと思います。ただし、アドインに対しては、起動するときに、呼び出さないといけません。そうしないと、アドインを含まずに起動してしまいます。
そうなんです。
初めは、VBSでEXCELを起動させようと組んだのですが、アドインが機能せず、呼び出し方法も、呼び出すものも(EXEファイルの実行だけでは機能しなくて)わからなかったので、スタートアップにしてしまったのです。

>良く考えてみましたが、Excel 2003 以降ですと、次回起動するときに、エラー表示が現れると思います。
EXCELは、
Application.Quit
で落としています。
三菱の通信アプリをプロセスから落としています。
こいつが落ちないと、Excelが正常に落ちません。
通常の再起動にすると、excelが残ってそこで入力を求められます。
強制再起動にしてあるので、
なにがなんでも再起動はしてくれるはずです。
が確かに、正常に終了しないと、「ドキュメントの回復」が出てきてしまいます。
三菱さえ落ちてくれてたらうまく流れそうなのですが。。。

>ただ、少なくとも、自動起動だったら、Excelというアプリケーションに仕事をさせるのに、自動終了まで、ひとつの流れに沿って、働かせるということです。
Excelの起動から終了まではExcelでやっています。
OSの再起動にWSHを使っています。
ん?そういうことでなくて、ですか?

>このコードは、途中でハングしていないのですか?
なんとか動いてはいますが。。。
おかしいトコロありますか?

>>userform11.Show '←これは、二重起動していたりしたら、場合によりハングします。
二重起動?Excelの二重起動ですか?
二重起動禁止まで手が回らず、禁止の処理はしていません。
客先には、このPC自体このソフト専用のものにしてくれ、
で了承ずみ。
また、常時画面最大化で、24時間を監視するものなので、
基本条件として、ソフトの切断は行わない、閉じないを前提にしています。
本当は、しなきゃならないのですが、以上のことでよしにしてしまっています。
>(自動実行では、UserForm は使わないほうが無難です。)
なにかあるんですか?
Msgboxで、応答を求めない形(ボタンを押さない)
二秒後に閉じる等の方法がわからなかったので、
Userformにしたのですが。。。

>Unload UserForm11 '←これは入れます。
Userform11自体にUnloadmeをいれてあるのですが、ちがいがありますか?

>ThisWorkbook.Close False '←は入れたほうが無難です。
はい。入れておきます。


実は、明日このプログラムを客先に導入なんです。
いまから手直しできる範囲で直して、
「止まらないもの」にします(できんのか?)。


UWSCは、初耳ですが今回はちょっと時間が・・・
けど、すぐ勉強に取り掛かってものにしたいです。
教えてくれてありがとうございます。

最後にひとつだけ確認を。
Workbook Open時のタイマー予約、
0時10分の再タイマー予約とあって、
0時2分の再起動を設定していない場合、
(つまり私の質問の最初に書いたコード郡)
たとえば、朝10時にソフトを起動(Workbook Open)させたとしたら、
翌日のタイマー予約終了時(SetTimerを踏んだ後)には、
実行命令は二回分になっているのでしょうか?

つまり命令自体は実行予約をした回数(Settimerをした回数)してしまうものなんですか?
なんだか、説明がわかりにくくてすみません。
そこだけわかれば、前回の失敗原因がなんとなく予想がつくのですが。

お願いします。

補足日時:2009/12/13 22:18
    • good
    • 0

こんにちは。



ご質問の詳細が良く分かりませんが、

>このままだと、0時2分に再起動がかかり、ブックを開きなおします。

問題は、この部分ではないでしょうか?その回答者側では、その仕組みが分かりません。オートメーション(CreateObject)で立ち上げているのでしょうか?この部分をAT コマンドか、タスクで行っているとは思うのですが、先に立ち上げていたExcelのオブジェクトを取得(GetObject)して、すでに実行しているか判定を求めてから、SetTimer を起動するようにすればよいのではありませんか?フラグ(flg)は、いずれにしても、Public で出しておかないといけないでしょうね。

しかし、00:00:30 に実行されているとしても、
Application.OnTime TimeValue("00:00:30"), "強制終了"

それに、
「ExcelVBAにてアプリをタスクマネージャーから強制終了させたいのですが」
この質問は解決はしていないのですか?

それに、
>とある組み込みアドイン(.exe)が働いて
おそらく、外部OLEなどからデータを取得するものでしょうけれども、まったく切れないはずはないと思います。
アドインを切る(.Installed = False)か、他から入るデータを切る(Interrupt)か、どちらかにすればよいと思います。

それから、0時2分に起動しているのでは、その設定自体に矛盾があるのではないではありませんか?
開いて仕事をしたら、終了するようにすればよいと思うのです。ただ、全体的に、開いてから、OnTime は、ひとつかふたつぐらいだけにして、後は、すべてひとつのマクロで進めても良いような気がします。

この回答への補足

コメントありがとうございます。

ちょっとあせって質問したもので、説明不足ですみません。

流れとして、
0時2分にタスクスケジュール(vbスクリプト)で再起動がかかります。
スタートアップにexcelの指定ファイルを組み込んであり、
起動とともに立ち上がる。
Thisworkbookモジュールの
workbook openイベントにより
Settimer発動

タイマーにより一連の作業をする
ここで二度目のSettimer発動?
んで、翌日の0時0分30秒(0時0分の記録をとる為)に
強制終了マクロによりexcelとアドインによるデータ収集を終了。

また0時2分に再起動。

こんな感じです。
このままですと、やはり二回タイマーがかかり二回実行しますよね?

他の質問にも目を通していただきありがとうございます。
「ExcelVBAにてアプリをタスクマネージャーから強制終了させたいのですが」
これは、なんとかコード化でき、テストをしているところですが、
ぶった切ってしまうところが気にはなります。

組み込みアドインですが、
そのアプリケーションを止めずに、excel終了してしまうと、
次回二重起動の恐れが強くありまして。。。
三菱(アプリの製作元)もアプリ本体からの切断以外はできない(教えれない)、と一蹴されました。

0時2分の起動は、どこに矛盾があるのでしょうか?
>開いて仕事をしたら、終了するようにすればよいと思うのです。
すみません。わかりません。

起動時のマクロ連発はおいおいを考えると、負担になりそうで、
不安が残っている箇所ではあります。
workbookopenで
画面最大化、シート保護、特定のシートを表示、と
Settimerを仕込んであります。

OnTimeはひとつかふたつの方が処理速度は目に見えてかわりますかね?

たとえば、
起動時Settimerで
”フォルダ作成”と”プリント”を予約し、
”プリント”コードのケツに
Ontimer”DB保存”とか。。。


と、考えているうちに、重大なことに気付きました。
今回、再起動をするように仕様変更をしており
この”Settimer”はそれ以前の、24時間つけっぱなしVer時からのもので、
落とさない、消さない状態を前提にしたものです。
理想として、一度立ち上げたらダウンするまでWorkbook Openのお世話には
ならない、、、だから自己起動タイマーを組み込んだのでした。
一日一回終了、再起動する今Ver.なら、
Workbook open時にSet Timerすればよいのでは。。。

あってますかね?
なんだか、納期に追われよくわからなくなってしまいました。
一人で踊ってしまったみたいですみません。

けど、なんだか不安なんですよね。
落ちなかったら、再起動かからなかったら。。。
眠れません。
OnTimerを見直します。

補足日時:2009/12/12 23:43
    • good
    • 0
この回答へのお礼

気に掛けていただいたので、強制終了も載せさせてください。

Sub 強制終了()

On Error Resume Next

Dim wbook As Workbook

Workbooks("予冷庫 温湿度管理表.xlsm").Activate

Shell ("taskkill /F /IM MXShEngn.exe")

userform11.Show

Application.Wait Time:=Now + TimeValue("00:00:02")


Application.DisplayAlerts = False
Workbooks("予冷庫 温湿度管理表.xlsm").Save

Application.Wait Time:=Now + TimeValue("00:00:02")

Application.DisplayAlerts = False
Application.Quit

End Sub

これで、なんとか落ちてはいるのですが。
最後に、Workbook.Closeはいらないんですかね?
わかりません。

スレちがいですみません。
あっ、むこうの質問は、終了にしときます。
ありがとうございました。

人生初のプログラムで、質問、教えてばかりですみません。

あやまってばかりですみません。

お礼日時:2009/12/13 00:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A