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

ネットワーク上のエクセルとリンクしている時にデータ更新をvbaで、refresh Allで行う場合のエラー処理
Microsoft Excel2019を利用してます。

エクセルのwb1を個別のpcで利用して、社内ネットワーク上のwb2にリンクを張ってます。wb2は販売データが記録されていて、社内の色々な人が更新していきます。wb1はwb2の販売データを元に計算をすることを目的にしているので、wb2へのリンクを計算前に更新して使用しています。
更新は wb1上でrefresh All を利用しているのですが、エラー処理が出来ずに困っています。
wb2を誰かが開いている時に、wb1でrefresh Allをすると、wb2が読み取り専用で開いてしまいます。
onError処理で回避しようと思ったら、エラーと認識されないのか、wb2が読み取りで開いてしまいます。

wb2が誰かに使用されているときは、refresh Allをせずにエラーメッセージを出すようにするにはどうしたら良いでしょうか?
まずはwb2が利用されてるか調べるようなコードがあるのでしょうか?インターネットで調べてみても、ネットワーク上のwbに対して上手くいくコードが書けず、、困っています。どなたか教えてください。

A 回答 (2件)

こんにちは



テストできる環境にないので、以下は正確な情報ではありませんけれど・・

>エラー処理が出来ずに困っています。
>エラーと認識されないのか、wb2が読み取りで開いてしまいます。
問題の状態の時に、エラーが発生せずに処理が止まってしまうという意味でしょうか?
それとも、対象ブックをreadOnlyで開いて、続行されるという意味でしょうか?
もしも後者なら、更新後に「対象ブックが開いていたなら閉じる」という処理を追加すれば済みそうな気もしますが・・
とは言え、誰かが更新途中のデータを(=整合性がとれていない可能性がある)そのまま利用するのは、気持ち悪いですね。


>まずはwb2が利用されてるか調べるようなコードがあるのでしょうか?
以下は少々変則的ですが、ブックをシークエンシャルファイルとして追加モードで開くという方法があるようです。
「追加モード」だと「書き込み可能」でなければならないので、エラーになるという仕組みです。

 On Error Resume Next
 Open "wb2.xlsx" For Append As #1
 Close #1
 If Err.Number > 0 Then m = "開いている" Else m = "開いていない"
 On Error GoTo 0
 MsgBox m

※ 存在しないファイル(パス)を指定すると、「書き込み」なので、そのファイル名で新しく作成されてしまいますのでご注意ください。

調べてはいませんけれど、他には、FileSystemObjectなどでファイルの状態を調べることができる方法があるかも知れません。
    • good
    • 0
この回答へのお礼

ありがとうございます!
最近パソコンに触れる環境にいないので、後日試させていただきます!

お礼日時:2023/04/14 22:48

こんにちは


>wb2が利用されてるか調べるようなコードがあるのでしょうか?
Sub example()
Const nasBkPath As String = "\\・\・\wb2.xlsx"
Application.DisplayAlerts = False
Workbooks.Open Filename:=nasBkPath, Notify:=False
If ActiveWorkbook.ReadOnly Then
MsgBox "読み取り専用です"
ActiveWorkbook.Close
Else
'Refresh All ?
'Call main_procedure?
MsgBox "OKです"
End If
Application.DisplayAlerts = True
End Sub

nasBkPathはwb2のパスです
読み取り専用の場合、メッセージを出し閉じています
    • good
    • 0
この回答へのお礼

ありがとうございます!
最近パソコンに触れる環境にいないので、後日試させていただきます!

お礼日時:2023/04/14 22:49

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