【Excel VBA】旧共有ブックを編集中のユーザー一覧を取得する方法

Excelの古いバージョンの「共有ブック」機能を使っている際に、「今、自分以外に誰がこのファイルを開いているんだろう?」と確認したくなることがあります。VBAを使えば、現在その共有ブックを編集しているユーザーの名前とログイン時刻の一覧を取得することが可能です。

この記事では、ブックの.UserStatusプロパティを利用して、旧共有ブックの編集者リストを取得する方法を解説します。


目次

【重要】「旧共有ブック」と「共同編集」の違い

はじめに、非常に重要な注意点です。この記事で解説する方法は、校閲タブにある**「共有ブック(レガシ)」**という古い機能に対してのみ有効です。

Microsoft 365で標準となった、OneDriveやSharePoint上で行うリアルタイムの「共同編集」では、このVBAコードは機能しません。 「共同編集」中のユーザー一覧をVBAで取得する簡単な方法は、現在のところ提供されていません。


完成したVBAコード

以下が、アクティブなブックが旧共有ブックであるかを確認し、編集中の全ユーザー情報を表示するVBAコードです。

Sub ShowSharedBookUsers()

    ' 変数を宣言します
    Dim targetBook As Workbook
    Dim userInfoArray As Variant
    Dim userListMessage As String
    Dim i As Long

    ' 現在アクティブなブックを操作対象とする
    Set targetBook = ActiveWorkbook

    ' --- 1. ブックが旧共有モードかどうかを判定 ---
    If targetBook.MultiUserEditing = True Then
        
        ' --- 2. 編集中のユーザー情報を配列として取得 ---
        userInfoArray = targetBook.UserStatus
        
        ' --- 3. 配列をループして、表示用のメッセージを作成 ---
        ' UBound(userInfoArray, 1) でユーザー数を取得
        If UBound(userInfoArray, 1) = 1 Then
            userListMessage = "現在このブックを編集しているのは、あなただけです。"
        Else
            userListMessage = "このブックを編集しているユーザー:" & vbCrLf & "---------------------------------"
            For i = 1 To UBound(userInfoArray, 1)
                ' (i, 1)にユーザー名、(i, 2)にログイン時刻が格納されている
                userListMessage = userListMessage & vbCrLf & _
                                  "ユーザー名: " & userInfoArray(i, 1) & vbCrLf & _
                                  "ログイン時刻: " & userInfoArray(i, 2) & vbCrLf & _
                                  "---------------------------------"
            Next i
        End If
        
        MsgBox userListMessage, vbInformation, "編集中のユーザー"
        
    Else
        MsgBox "このブックは「共有ブック」として開かれていません。", vbInformation
    End If

End Sub

コードのポイント解説

① 共有ブックかどうかの判定 (.MultiUserEditing)

If targetBook.MultiUserEditing = True Then

まず、Workbookオブジェクトの.MultiUserEditingプロパティを調べます。このプロパティは、ブックが旧共有モードで開かれている場合にTrueを、そうでない場合はFalseを返します。このIf文で、対象のブックがそもそも共有されているかを判定しています。

② ユーザー情報の取得 (.UserStatus)

userInfoArray = targetBook.UserStatus

ブックが共有モードであった場合、.UserStatusプロパティで編集者の一覧を取得できます。このプロパティは、ユーザー情報を格納した2次元配列を返します。配列は以下のような構造になっています。

  • userInfoArray(ユーザー番号, 1): ユーザー名(文字列)
  • userInfoArray(ユーザー番号, 2): ユーザーがブックを開いた日時(日付/時刻)
  • userInfoArray(ユーザー番号, 3): ユーザーのアクセスモード(数値)

③ 配列をループして情報を整形

For i = 1 To UBound(userInfoArray, 1)
    userListMessage = userListMessage & vbCrLf & _
                      "ユーザー名: " & userInfoArray(i, 1) & vbCrLf & _
                      "ログイン時刻: " & userInfoArray(i, 2)
Next i

取得した2次元配列をForループで処理します。UBound(userInfoArray, 1)で配列の行数、つまり合計ユーザー数を取得し、1からその数までループを回します。ループの中で、各ユーザーの名前とログイン時刻を取り出し、MsgBoxで表示するための見やすい文字列を組み立てています。


まとめ

旧共有ブックの編集者リストを取得する手順は、以下の通りです。

  1. **.MultiUserEditing**プロパティで、ブックが旧共有モードかを確認する。
  2. 共有モードであれば、**.UserStatus**プロパティでユーザー情報が格納された配列を取得する。
  3. 取得した配列をループ処理して、必要な情報(ユーザー名など)を取り出す。

繰り返しになりますが、この方法は旧形式の「共有ブック」専用の機能です。最新の「共同編集」とは異なる点を理解した上で、ご活用ください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次