• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:EXCEL VBAについて(再質問))

EXCEL VBAで他の人が開いているブックを知る方法

このQ&Aのポイント
  • EXCEL VBAで指定したフォルダのEXCELブックが1つでもオープンされているかどうか知りたいのですが、可能でしょうか。
  • 他の人がオープンしているかどうか知ることは可能でしょうか?
  • [ツール]-[参照設定]でMicrosoft Scripting Runtimeにチェック入れて、EXCEL VBAを使用して指定したフォルダ内のブックが他の人によって開かれているかどうかを確認することができます。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

ごめんなさい。実はその方法ですと、自分が開いていてもチェックできないんですよね。 という訳で考え直しました。 Dim Fso As New FileSystemObject Dim Fl As File Dim objFolder As Folder '調べるフォルダ Dim bOpenedBook As Boolean '調べるフォルダを「C:\tmp」とする。 Set objFolder = Fso.GetFolder("C:\tmp") bOpenedBook = False 'フォルダ内の全ファイルでループ For Each Fl In objFolder.Files '拡張子が「xls」のものだけ調べる If StrComp(Fso.GetExtensionName(Fl.Path), "xls", vbTextCompare) = 0 Then '同じ名前でファイル名を変更しようとしてみる On Error Resume Next Name Fl.Path As Fl.Path If Err.Number <> 0 Then On Error Goto 0 'エラーが発生すれば排他制御が掛かっている(=開かれている?) bOpenedBook = True Exit For End If On Error Goto 0 End If Next Set Fl = Nothing Set objFolder = Nothing Set Fso = Nothing '結果をメッセージボックスで表示 If bOpenedBook Then MsgBox "開かれています。" Else MsgBox "一つも開かれていません。" End If

momo7243
質問者

お礼

回答ありがとうございます。 やってみますね。

momo7243
質問者

補足

ありがとうございました。できました。連絡遅くなってしまい申し訳ありませんでした。

その他の回答 (2)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

こんにちは。KenKen_SP です。 こんな感じで、排他モードでファイルを開らくとき、ファイルが使用中であれ ばエラーとなるのを利用します。ただし、この方法単独では、自分で開いてい るのか、別の人が開いているのかは区別されません。 これを区別するなら、ご質問分にあるコードなどを使って、2段チェックする 必要があります。 Sub Sample()   Dim strDirectory As String   Dim strXLSpath  As String        ' チェックするフォルダパス   strDirectory = "C:\tmp"      strXLSpath = Dir(strDirectory & "\*.xls", vbNormal)      While strXLSpath <> vbNullString     strXLSpath = strDirectory & "\" & strXLSpath     ' このマクロが書かれたブック= Thisworkbook は除外する     If StrComp(strXLSpath, ThisWorkbook.FullName, vbTextCompare) <> 0 Then       ' 既に開かれているかチェック       If OpenedFile(strXLSpath) Then         blnFlag = True         Exit For       End If     End If     ' 次のファイルを検索     strXLSpath = Dir()   Wend      ' 結果出力   If blnFlag Then     MsgBox "既に開かれたブックがあります"   Else     MsgBox "一つも開かれておりません."   End If    End Sub ' フルパスで渡したファイルが開かれていれば True を返す Private Function OpenedFile(ByRef strFilepath As String) As Long   Dim n As Integer       n = FreeFile()   On Error Resume Next   Open strFilepath For Binary Access Read Lock Read As #n   Close #n   Select Case Err.Number     Case 52:  Err.Raise 1000, , "パスが不正です."     Case 70:  OpenedFile = True  ' ファイルは使用中     Case 0:  OpenedFile = Flase ' ファイルは使われていない     Case Else: Err.Raise Err.Number, , Err.Description   End Select   On Error GoTo 0 End Function

noname#230891
noname#230891
回答No.1

他で開かれているかどうかは、そのブックを一旦開いてみて 読み取り専用になったかどうかで判断するしかないと思います。 DisplayAlertsプロパティあたりを制御して「無理矢理」開いて、 開いたブックのReadOnlyプロパティを調べてみてはいかがでしょう。