職場ネットワークで、エクセルのファイルの共有を
しています。
誤ったファイル名を指定した場合は、次のVBAで
メッセージを出せますが、他の人が同一ファイルを
既に開いていることを、VBAでどのように検出
すればよいのでしょうか。(当方VBA素人です)
On Error Resume Next
Workbooks.Open Filename:=PathName & "\" &
FileName
If Err.Number <> 0 Then
x = MsgBox("ファイルが見つかりません",
vbOKOnly)
End If
No.4ベストアンサー
- 回答日時:
こんにちは。
>(文中の16は意味が分からなかったので記入しませんでした)
Msgbox "ファイルが存在しません",16
16の意味は、赤いバッテンの「vbCritical」のことです。
>存在しないファイルが生成されてしまい、Workbooks.Open FNameで、そのファイルを開いています。
よく分かっていませんが、Excelのブックのオブジェクトが生成されている、ということでしょうけれども、Close したはずでも、サーバーという環境では、一過性で生成されたオブジェクトが、プロシージャ実行中では残っている可能性がありますね。
以下でダメなら、「編集可能状態のチェック」は一旦終えて、再び別のプロシージャで「ブックを開ける」ようにしたほうが良いかもしれません。タイムラグはしょうがないと思います。
Sub KUTest3()
Dim Fno As Integer
Dim BookName As String
Dim Fname As String
'パスは、必ず「\」最後につけてください。
Const myPath As String = "ドライブ\\パス\"
BookName = "ブック名"
Fname = myPath & BookName
If Dir(Fname) = "" Then
MsgBox "ファイルが存在しません", vbCritical
End If
Fno = FreeFile
On Error GoTo ErrHandler
Open Fname For Binary Lock Read Write As #Fno
Close #Fno
Workbooks.Open Fname
Exit Sub
ErrHandler:
If Err.Number <> 0 Then
MsgBox "現在、そのブックは編集可能ではありません。", vbCriticalEnd
If
End Sub
ありがとうございました。
OSが表示する「読み取り専用」は抑止できませんでしたが、Wendy02さんのアドバイスにより、
デバックモードでVB命令の意味を確認しながら、より完成度の高いエクセルマクロを完成させることができました。
No.3
- 回答日時:
すみませんが、もう一度試していただけませんか?
単に、バイナリ・オープンでロックして書き込めるかどうかをチェックするだけですが。
Sub KUTest2()
Dim Fno As Integer
Const FName As String = "ドライブ\ファイル名"
If Dir(FName) ="" Then
Msgbox "ファイルが存在しません",16
End if
Fno = FreeFile
On Error Resume Next
Open FName For Binary Lock Write As #Fno
Close #Fno
If Err.Number = 0 Then
Workbooks.Open FName
Else
MsgBox "現在、そのブックは編集可能ではありません。", 16
Exit Sub
End If
End Sub
ありがとうございます。
素人なりにやってみました。
(文中の16は意味が分からなかったので
記入しませんでした)
その結果、ファイルの有無、競合は
感知出来ていますが、難点があります。
Open FName For Binary Lock Write As #Fno
で、存在しないファイルが生成されてしまい、
Workbooks.Open FNameで、そのファイルを
開いています。
だから、「ファイルを生成しない」ことが、
要求されます。
No.2
- 回答日時:
こんにちは。
他のユーザーが既に開いている場合、そのファイルは「読み取り専用」になります。
ですから、とりあえずいったんそのファイルを開き、
「読み取り専用」であれば既に開かれていると判断すればいいのではないでしょうか。
-------------------------------------------
Workbooks.Open FileName:=PathName & "\" & FileName
If ActiveWorkbook.ReadOnly Then
ActiveWorkbook.Close
MsgBox "他のユーザーが使用中です!"
End If
--------------------------------------------
ありがとうございます。
競合の判断には使用できますね。
しかし、「読み取り専用」の表示が
先に出てしまうし、この表示を阻止できないので
蛇足的なメッセージ表示になってしまいますね。
しようがないのかな?
ファイル更新しないように、
念押しのメッセージということで、
諦めようかなと思っています。
No.1
- 回答日時:
テストしたわけではないので、自信が持てませんが、こんなようになるかな?(たぶん)
Sub KUTest()
Dim Rtn As Long
Const FName As String = "サーバー\TEST.xls"
Rtn = GetAttr(FName) And vbReadOnly
If Rtn > 0 Then
MsgBox "現在、他の人がデータにアクセスしています。", vbInformation
Exit Sub
Else
Workbooks.Open FName
End If
End Sub
それから、
>誤ったファイル名を指定した場合は、次のVBAでメッセージを出せますが、
こちらは、私だったらこうかな?
Const PathName = "aa"
Const Filename = "bb"
If Dir(PathName & "\" & Filename) = "" Then
MsgBox "ファイルが見つかりません"
Exit Sub
End If
Workbooks.Open Filename:=PathName & "\" & Filename
それから、別に、Const で定数にする必要はないですからね。単に、書く行を減らすためだけだったからです。
ありがとうございました。
プログラムの記述方法が適正でないかも
しれませんが
デバックモードで実行してみるとRtnに
ファイルが存在すると"0"、
ファイルが存在しないと""
の値が帰ってくるようです。
従って、競合の判断には使用できない
みたいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/06 17:46
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) VBAでの共有パスにつきまして 1 2023/03/04 17:24
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/08/09 10:33
- Visual Basic(VBA) 【VBA】写真の縦横比を変えずに貼り付ける 5 2023/06/13 11:42
- Excel(エクセル) エクセルでcsvファイルを開いてVBAを使いたい 7 2022/04/28 11:12
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
《エクセルVBA》「他の人が該当ファイルを使用中の場合」の処理
Excel(エクセル)
-
【Excel VBA】ネットワーク上の共有フォルダにあるExcelを開く
Excel(エクセル)
-
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
-
4
EXCEL VBAで全選択範囲の解除
Excel(エクセル)
-
5
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
6
Excelファイルのマクロによる排他制御
Excel(エクセル)
-
7
ブックの共有の際に、同じセルAへの複数人による、データ入力を防ぐには
Excel(エクセル)
-
8
【VBA】ワークブックを開く時にエラーが出る場合と出ない場合の違いは?
Excel(エクセル)
-
9
特定のPCだけ動作しないVBAマクロがあります。その理由は?
Visual Basic(VBA)
-
10
Application.ScreenUpdating = Falseが効きません
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
exeファイルをデータ転送サービ...
-
CSSを1ページに1枚作るのって変...
-
#include <Windows.h>というヘ...
-
Word VBA MSGBOX 内で降順表示
-
パイソンでpy ファイルと p...
-
C# OpenFileDialog
-
ファイル構造が破損しているフ...
-
Access のファイルの「安全でな...
-
外部ファイルの数値を合計計算...
-
binファイルを解凍したいの...
-
Latexで図番号だけを「図1.1」...
-
ファイルは何で構成されている...
-
C#でファイルに書き込める行数...
-
Windows10のScilabのV6.1.1に関...
-
ビットマップの扱い方
-
warファイルをEclipseでプロジ...
-
コマンドプロンプトで作成日時...
-
iniファイル
-
exeファイルの中身を見る方法は...
-
ドラッグしたファイルのパスを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
アクセス 壊れた? 「ファイ...
-
#include <Windows.h>というヘ...
-
Latexで図番号だけを「図1.1」...
-
binファイルを解凍したいの...
-
.NETアプリを作ったときの .man...
-
ファイル構造が破損しているフ...
-
2つのファイルのバイナリをコン...
-
CSSを1ページに1枚作るのって変...
-
Word VBA MSGBOX 内で降順表示
-
公文書のxmlファイルの開き方が...
-
jarファイル
-
バッチ処理で追記コピーしたい
-
自分で作成した重要ファイルを...
-
ファイルは何で構成されている...
-
exeファイルをデータ転送サービ...
-
リンクの張り付けかたを教えて...
-
exeファイルの中身を見る方法は...
-
参照するファイルをワイルドカ...
-
CRCが一致する確率
-
C言語---ファイルに出力したデ...
おすすめ情報