[[20220126185111]] 『Workbook.Openして一定時間で開かれなかったらOpe』(傘) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『Workbook.Openして一定時間で開かれなかったらOpenをキャンセルしたい』(傘)

現在会社で他部署からの作業依頼を集約するファイルを作成しています。

 ブックA:マクロファイル・依頼用シートのあるファイル
 ブックB:通常ファイル・Aで作成した依頼票の内容をまとめるファイル

この2つのブックを社内サーバーに置いて、他部署の人にはブックAから依頼票を作成してもらう形にする予定です。

ただ、たまに社内サーバーの回線が非常に重いことがありAのマクロでブックBに書き込むためにファイルを開こうとしたときに
ファイルが開かれるのが遅すぎてブックBを指定した操作がエラーになる、
もしくは単純に開く・保存する操作に時間がかかりすぎてその間に想定されてない操作をされる、ということを防ぎたいので
Workbooks(B).Openした後に3秒程度ごとにブックが開かれているか確認して
10回ほど確認してもまだ開かれていないようであれば「回線が重いので今は操作できません」のような表示を出してマクロを終了したいと考えています。

 Workbooks(B).Open
 Do
     For Each wb In Workbooks
         If wb.Name = "B" Then Exit Do
     Next wb
     i = i + 1
     Application.Wait (Now + TimeValue("0:00:3"))
 Loop Until i = 10
 If i = 10 Then
     Msgbox "今は無理です"
     Exit Sub
 End If

こんなイメージです。
ただ、これだとBを開いた操作自体はキャンセルされませんよね?(想像ですが)
まだ開ききっていないファイルの開く操作を取り消すにはどういう記述をしたらいいでしょうか?
というか、そもそもそういうことってできますか?

< 使用 Excel:Office365、使用 OS:Windows10 >


 VBAでは希望ズバリなメソッドは存在いないかと。
 MSのサイトを見ましたが、CancelやTimeoutといったものは探せませんでした。

 また、Workbooks.Openで時間が掛かっているとして、
 コード上、そこで止まっているので、「何秒経過したら」
 なんて判定は出来ないですね。

 質問者さんと同じ環境ではないので、参考程度ですが、
 私なら、Bブックをcsvファイルにし、簡易データベースとして、
 観閲は別途マクロブックを作ります。

(tkit) 2022/01/27(木) 09:52


tkitさん
ないですか、そうですか…

>コード上、そこで止まっているので
上の例ではOpenでどれだけ時間がかかっても、ファイルが完全に開かれてからDo以降の処理が始まるということでしょうか?
そうであれば完全に挙動を勘違いしていました。

>観閲は別途マクロブックを作ります
今回の話には関係ないので書きませんでしたが、自部署でブックBを閲覧・操作するためのブックCも作る予定ではいます。
ただ、なぜブックBをcsvファイルにするのか教えていただけませんか?
xlsxファイルにするより読み込みが早いとかでしょうか?
(傘) 2022/01/27(木) 11:38


 >ファイルが完全に開かれてからDo以降の処理が始まるということでしょうか?

 Workbooks.Openメソッドの処理が終わるまで、次の処理に行きませんので、
 そういう事だと思います。

 >なぜブックBをcsvファイルにするのか教えていただけませんか?

 csvもただのテキストファイルですので、操作自体が軽いこと、
 VBAからopenステートメントでアクセスする場合、追記する記述が容易であり、
 同マクロブックから追記するのであれば、競合も防げるからです。
 ただし、回線云々は、重かろうと軽かろうと、切れてしまえばアクセス出来ないので、
 何とも言えません。

(tkit) 2022/01/27(木) 12:05


 こんばんは、駄目元ですが… 1案です。						

 >Workbook.Openして一定時間で開かれなかったらOpenをキャンセルしたい						

 上記処理ができるかどうかは、わかりませんが…						
 下記のような処理を自動で組んだらどうなのかな?と思いました。						

 ブックA:マクロファイルから						

 1. ブックB:呼び出し処理						

 ・ボタンから呼び出し処理は、1回だけ						

 2. ブックB:開かれているか確認処理は自動でさせる						

 ・1回目 : 10秒後						
 ・2回目 : 20秒後						
 ・3回目 : 30秒後						

 3. 転記処理						

 ・ サーバー回線が良く、1回目で開いていれば即転記する						
 ・ サーバー回線が悪く、1回目で開いていなければ
    2〜3回目まで確認して…ダメなら "今は無理です"					

 ※ ブックBが開いた時だけ、MsgBox でお知らせ → vbYesNo選択 → Yes 書き込み処理						
 ※ 2〜3回目の確認処理が自動なので走るが、即転記処理ができるかは…ちょっとマクロ作成後に確認						

(あみな) 2022/01/27(木) 17:57


tkitさん、あみなさん

Openしたあとに取り消すのは無理そうだということなので
ひとまず今回は重いときは使うなという注意換気をするか、
開き終わるまでにかかった時間を測って、それが一定時間を超えていたら
何もせずにファイルを閉じてそれ以降の操作を中止する、といったあたりで
対処しようと思います。
お二人とも回答ありがとうございました。
(傘) 2022/01/28(金) 13:12


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.