« 東京メトロと都営地下鉄の接客 | メイン | キーワードの違い »

2007-09-17

コメント

2,8

2007年の記事にコメントを書くのはどうかとおもったのですが、どうしても質問がしたくて書き込みました。VBA初心者の2.8です。

>Shell.Applicationでzipを作る処理は非同期
僕はoutlookのVBAでzip圧縮を作成していますが、Shell.Applicationで作る場合に同期処理をいれるのは不可能なのでしょうか?

>CopyHereメソッドのあとで500msのウェイトを入れてるのも、なんだかなぁ。

僕はoutlookで添付ファイルを送信時にZIP圧縮するマクロを作成しました。
ためしにsleep 0 でためしましたが、ファイルが見つからないとエラーがおきました。それでも、送信ボタンを押しているためoutlookで作成したメールは送信されていました。3つの添付をつけたのですが、さいしょのファイルだけは圧縮されませんでした。

sleepは5000(5秒)が一番いいのでしょうか?

佐伯浩介

Shell.Applicationでzipファイルを扱うときのCopyHereメソッドは非同期処理なので、圧縮が終わったことを呼び出し側で知る手段がありません(CopyHereメソッド自体は、圧縮処理を始めただけで戻ってきてしまいます)。でも、実際の処理、特にバッチ処理では、zip作成が終了していることを前提にして次の処理に移る必要があるので、圧縮処理が終わったことを担保するための対策が必要です。
David Aikenさんのblogに書かれているPowerShellのスクリプトでは、「500ms待機する。」という方法を使っていて、これは結局、「500msも待機すれば、圧縮は終わってるでしょ。」ということなんですよね。あのスクリプトは、Windows Vistaのサイドバーガジェットを圧縮するというのが発端になっていて、サイドバーガジェットはファイルサイズがあまり大きくないので、500msなんでしょう。もっと大きいファイルを扱うのであれば、待機時間を延ばしておかないと、処理途中で次のコマンドに進んでしまうはずです。
私の記事の中からリンクしてある吉岡さんは、同期化できないCopyHereの欠点を補うために、CopyHereメソッドを実行したあと、zipの中のファイル数を数え、ファイル数が所定に達するまで待機するという方式のスクリプトを公開されています。この方式なら、zipファイルが作成されていることをきちんと確認してから次に進むことができます。使うのなら、こっちの方式がおすすめですね。
吉岡さんはたくさんのスクリプトを公開されていて、どのスクリプトがそうだとすぐにお教えすることができないのですが、上のリンクからたどれますので、探してみてください。

この記事へのコメントは終了しました。

最近のツイート

ブログではないWebページ

  • 佐伯浩介のページ