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
で表示するための見やすい文字列を組み立てています。
まとめ
旧共有ブックの編集者リストを取得する手順は、以下の通りです。
- **
.MultiUserEditing
**プロパティで、ブックが旧共有モードかを確認する。 - 共有モードであれば、**
.UserStatus
**プロパティでユーザー情報が格納された配列を取得する。 - 取得した配列をループ処理して、必要な情報(ユーザー名など)を取り出す。
繰り返しになりますが、この方法は旧形式の「共有ブック」専用の機能です。最新の「共同編集」とは異なる点を理解した上で、ご活用ください。