人の作ったエクセルマクロの解析や修正ほど憂鬱なことはないとおもっている、最近からだのむくみが気になるアラフォーです。
スポンサーリンク
ふざけた依頼にはそれなりの対応で
今回、修正を依頼されたマクロは、初期処理と題して20秒間ほど、なにか一生懸命動いています。そのときに「初期処理中」と記述されたシートを表示しているのですが、急に表示されなくなったとのことです。
処理自体は正常に動いているようで、表示だけの問題のようです。処理にパワーを使い過ぎて表示がされないようです。
せめてもの救いです。今回は、楽そうです。(しっかし、作ったやつに頼めっつーの!嫌いだから話したくないって中学生か!)
初期処理にどうせ20秒もかかっているのですから、1秒くらい伸びても問題ないと思いますので、重い処理の前にマクロを停止して表示されればOKとすることにしました。
重要なポイント:
「1~2秒初期処理が伸びるけどいい?」などと、いちいち確認すると、漠然とした不安を出してグチャグチャ言ってきますので、確認はとりません。どうせ気づきもしないのに「今より遅くなるのは・・・・」なんて面倒なだけです。これが、重要なポイントです。
Application.wait メソッド
これは、実行中のマクロを指定の時刻まで停止することができるメソッドです。他にも、Declare 宣言して Sleep関数を使うこともできますが、煩わしいので個人的には極力避けるようにしています。
使い方の例は次のとおりです。
' 現在時刻から15秒後まで処理を停止する Application.wait Now + TimeValue("00:00:15")
これにて、マクロの修正は一件落着です。
[備忘録] ミリ秒(1秒以下)指定の待機処理
今回のマクロは秒単位で問題ありませんでしたが、ミリ秒単位の待機について備忘録を残しておきます。
ググるといろいろなサンプルは出てきますが、まさかのエラーで悩まされました。そのエラーがこちらです。
このダイアログが出力されるスクリプトは次のものです。
' 1550ミリ秒(1.55秒)待機 Application.Wait [Now + "00:00:01.55"]
WHY?
悩むこと30分、エラーが出なくなったスクリプトはこちらです。
' 1550ミリ秒(1.55秒)待機 Application.Wait [Now() + "00:00:01.55"]
ウォッチ式で見ても、全く違いがないようにみえましたが、Now → Now() と括弧をつけると正常にマクロは動作しました。そーゆーもんなの?
関係あるかないかは、わかりませんが動作環境は、Windows10(32ビット)+ Office Pro 2013 です。
NowとNow()の違い!
そもそもVBAにおいてカギ括弧で囲むとevaluate(文字列)という関数とほぼ同じ意味になります。
このevaluateというのは文字列をその場でインタープリターみたいに解釈実行してくれる代物なのです。
そこでNow()というのはエクセルシートの関数を実行してくれます。これはミリ秒までの結果を出してくれる代物です。一方Nowはそういった名前のオブジェクトがないためエラーになります。ちなみにエクセルシート上でも=now()は実行してくれますが、=nowだと#name?エラーとなります。
Application.Wait [Now() + “00:00:01.55”] ・・・〇
Application.Wait [Now + “00:00:01.55”] ・・・ × Nowを現在時刻を表す関数と認めないので何らかのオブジェクトとして実行しようとしますがそんな名前のオブジェクトがないためエラーになります。
<実施例>
A1セル:=now() + "00:01:01.01"
A2セル:=now()
書式をyyyy/mm/dd hh:mm:ss.000としておく
【結果】
2019/08/30 10:24:38.520
2019/08/30 10:23:37.510