VBA技術解説
ドキュメントプロパティ(BuiltinDocumentProperties,CustomDocumentProperties)

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
公開日:2019-01-19 最終更新日:2021-02-05

ドキュメントプロパティ(BuiltinDocumentProperties,CustomDocumentProperties)

ブックのドキュメントプロパティには、組み込みドキュメントプロパティとユーザー設定のドキュメントプロパティがあります。
VBAで扱うときは、それぞれ以下のコレクション・オブジェクトを使います、
BuiltinDocumentProperties ,
CustomDocumentProperties
これらは、DocumentPropertyオブジェクトのコレクションになります。


目次

組み込みドキュメントプロパティ(BuiltinDocumentProperties)

ファイルの右クリックから「プロパティ」の「詳細」タブで見られる内容になります。

マクロ VBA DocumentProperties

このプロパティの値をVBAで取得・設定します。

これに関連して、
ブック保存時に次のメッセージがでる場合があります。

マクロ VBA DocumentProperties

このメッセージが出るのは、
デスクトップ等で右クリック→新規作成→Microsoft Excel ワークシート
このような操作で作成したブックの場合に出ます。
ファイル→オブション→セキュリティー センター→セキュリティー センター の設定→プライバシー オプション

マクロ VBA DocumentProperties

この中の、ドキュメント固有の設定のところにチェックが付いている場合にメッセージが出ます。
チェックを外せばメッセージは出なくなります。

Excelを起動して新規ブックを作成したときは、このメッセージは出ません。
ドキュメント固有の設定が最初からチェックされずに作成されます。
この手順で新規作成している人のほうが多いのではないかと思います。

組み込みドキュメントプロパティを一覧出力

BuiltinDocumentPropertiesコレクションから、
DocumentPropertyオブジェクトを取得し、
オブジエクトのプロパティから名称や値を取得するマクロVBAです。

Sub getBuiltinDocumentProperties()
  Dim ws As Worksheet
  Dim dps As DocumentProperties
  Dim dp As DocumentProperty
  Dim i As Long
  'アクティブシートに出力
  Set ws = ThisWorkbook.ActiveSheet
  'Valueが定義エラーの場合の対応
  On Error Resume Next
  With ws
    .Cells.Clear
    .Range("A1") = "インデックス"
    .Range("B1") = "プロパティ名"
    .Range("C1") = "型"
    .Range("D1") = "値"
    i = 1
    Set dps = ActiveWorkbook.BuiltinDocumentProperties
    For Each dp In dps
      .Cells(i + 1, 1) = i
      .Cells(i + 1, 2).Value = dp.Name
      .Cells(i + 1, 3).Value = dp.Type
      .Cells(i + 1, 4).Value = dp.Value
      i = i + 1
    Next
  End With
End Sub

マクロの書かれているブック(ThisWorkbook)のアクティブシートに、
アクティブブック(ActiveWorkbook)の組み込みドキュメントプロパティを出力しています。

ThisWorkbookのActiveSheetの全体をClearしているので、使うときは注意してください。

Typeプロパティについて
msoDocProperties列挙になります。

定数 内容
1 msoPropertyTypeNumber 整数型 (Integer) の値
2 msoPropertyTypeBoolean ブール型 (Boolean) の値
3 msoPropertyTypeDate 日付型 (Date) の値
4 msoPropertyTypeString 文字列型 (String) の値
5 msoPropertyTypeFloat 浮動小数点型 (Floating point) の値

他のファイルのプロパティを取得する方法
以下の方法で、他のファイルのプロパティを取得することができます。

Sub getBuiltinDocumentProperties2()
  Dim obj As Object
  Dim i As Integer
  'ファイルのフルパスを指定します。
  Set obj = GetObject(フルパス)
  Cells.Clear
  Range("A1") = "インデックス"
  Range("B1") = "値"
  On Error Resume Next
  For i = 1 To 34
    Cells(i + 1, 1) = i
    Cells(i + 1, 2) = obj.BuiltinDocumentProperties.Item(i)
    If Err Then
      Cells(i, 2) = "取得できない"
      Err.Clear
    End If
  Next
  obj.Close
  Set obj = Nothing
End Sub

エクセルVBAなので、同じエクセルなら普通に開けば良いので、ワード等の別のファイルを想定しています。
ただし上記でスップ実行した場合、PowerPointのタスクが残ってしまうので、使う場合は注意してください。

GetObject関数
・GetObject関数の構文 ・GetObjectの解説 ・GetObject関数の使用例 ・GetObject関数とCreateObject関数の使い分け ・CreateObject関数

組み込みドキュメントプロパティの値を変更する

Excelブックを幅広く配布する場合、
ブック内に個人情報が残っていると、ちょっと不安ですよね。
そこで、
組み込みドキュメントプロパティ内の公開したくない情報を消去するマクロVBAです。

Sub modBuiltinDocumentProperties()
  Dim wb As Workbook
  Dim sFile As String
  Dim sFullPath As String
  Dim sUser

  '現在のブックと同一フォルダに「_copy」
  sFile = Replace(ThisWorkbook.Name, ".xlsm", "_copy.xlsm")
  sFullPath = ThisWorkbook.Path & "\" & sFile
  If Dir(sFullPath) <> "" Then
    If MsgBox("ファイルが存在します。" & vbLf & vbLf & _
      sFullPath & vbLf & vbLf & _
      "上書きしてもよろしいですか。", _
      vbYesNo, "確認") = vbNo Then
      Exit Sub
    End If
  End If

  Application.ScreenUpdating = False
  ThisWorkbook.SaveCopyAs sFullPath

  Set wb = Workbooks.Open(sFullPath)
  'UserNameは後で元に戻すため保存
  sUser = Application.UserName
  'ブランクは設定できないので何らかの文字を入れる
  Application.UserName = "エクセルの神髄"

  With wb
    With .BuiltinDocumentProperties
      '必要に応じて、プロパティに値を設定
      .Item("Title").Value = ""
      .Item("Subject").Value = ""
      .Item("Category").Value = ""
      .Item("Comments").Value = ""
      .Item("Author").Value = ""
      .Item("Company").Value = ""
      .Item("Manager").Value = ""
    End With
    .Save
    .Close
  End With

  'UserNameを元に戻す
  Application.UserName = sUser

  Application.ScreenUpdating = True
  MsgBox "個人情報を変更したファイルを作成しました。" & vbLf & vbLf & _
      sFullPath
End Sub

ThisWorkbookの最後に_copyを付けて、同一フォルダに保存しています。
単純に文字列型のプロパティのみ消去する場合

Application.UserName
保存時に、Application.UserNameが前回保存者に設定されます。
これはブランクにできないので、最低でも半角スペースを入れる等の値の設定が必要です。

この設定は、「オプション」の「ユーザー名」になります。

マクロ VBA DocumentProperties

プロパティ一覧
インデックス プロパティ名 和名
1 Title タイトル
2 Subject 件名
3 Author 著者
4 Keywords キーワード
5 Comments コメント
6 Template テンプレート
7 Last author 最後の作者
8 Revision number 改訂番号
9 Application name アプリケーション名
10 Last print date 最終印刷日
11 Creation date 作成日
12 Last save time 最終保存時間
13 Total editing time 合計編集時間
14 Number of pages ページ数
15 Number of words 言葉の数
16 Number of characters 文字数
17 Security セキュリティ
18 Category カテゴリー
19 Format フォーマット
20 Manager 部長
21 Company 会社
22 Number of bytes バイト数
23 Number of lines 行数
24 Number of paragraphs 段落数
25 Number of slides スライド数
26 Number of notes ノート数
27 Number of hidden Slides 隠しスライドの数
28 Number of multimedia clips マルチメディアクリップの数
29 Hyperlink base ハイパーリンクの基点
30 Number of characters (with spaces) 文字数(スペースを含む)
31 Content type コンテンツタイプ
32 Content status コンテンツステータス
33 Language 言語
34 Document version 文書バージョン

設定しても無視されるプロパティ
以下のプロパティは、設定しても無視または別途値が設定されてしまいます。
Last author
Application name
Last save time
Security
Number of bytes
Content type

組み込みドキュメントプロパティを消去する

Sub delBuiltinDocumentProperties()
  Dim wb As Workbook
  Dim dp As DocumentProperty
  Dim sUser As String
  
  Set wb = ActiveWorkbook

  '現在のUserNameを保存してから変更
  sUser = Application.UserName
  'ブランクは設定できないので何らかの文字を入れる
  Application.UserName = "エクセルの神髄"
  
  '文字列型のドキュメントプロパティのみ消去
  For Each dp In wb.BuiltinDocumentProperties
    If dp.Type = msoPropertyTypeString Then
      dp.Value = ""
    End If
  Next
  
  wb.Save

  'UserNameを元に戻しておく
  Application.UserName = sUser
End Sub

文字列型のドキュメントプロパティのみ消去して上書き保存しています。

ユーザー設定のドキュメントプロパティ(CustomDocumentProperties)

このプロパティを見るには、
「ファイル」タブ→情報→プロパティ→詳細プロパティ→「ユーザー設定」タブ

実務において、どのような用途があるのか、、、
実際には私は使ったことはありませんね。
組み込みを紹介したので、ユーザー設定も紹介しておこうという趣旨です。

この機能を使うとしたら、
ファイルを開かずに、このプロパティを取得してファイルを管理するような場合でしょうか。
膨大なファイル数を管理する場合に、その概要だけを取得したいような場合になると思います。
ただしそれには、Microsoftが作成し無償で公開しているDsofile.dllをインストールする必要があります。
これについて知りたい場合は、「Dsofile.dll」で検索してください。

ユーザー設定のドキュメントプロパティを一覧出力

先に紹介した、
「組み込みドキュメントプロパティを一覧出力 」getBuiltinDocumentProperties
このVBA内の、
BuiltinDocumentProperties
↓に変更
CustomDocumentProperties
これで一覧が出力できます。

ユーザー設定のドキュメントプロパティを追加する

CustomDocumentProperties のAddメソッドを使います。

式.Add(Name,LinkToContent,Type,Value,LinkSource)

名前 必須/オプション 説明
Name 必須 プロパティの名前を指定します。
LinkToContent 必須 プロパティをセルの内容にリンクする場合にTrueを指定します。
Trueを指定した場合は、引数LinkSourceを必ず指定します。
Falseを指定した場合は、引数Valueを必ず指定します。
Type オプション プロパティのデータ型を指定します。
使用できる定数は、MsoDocProperties列挙です。
定数 内容
1 msoPropertyTypeNumber 整数型 (Integer) の値
2 msoPropertyTypeBoolean ブール型 (Boolean) の値
3 msoPropertyTypeDate 日付型 (Date) の値
4 msoPropertyTypeString 文字列型 (String) の値
5 msoPropertyTypeFloat 浮動小数点型 (Floating point) の値
Value オプション プロパティがコンテナードキュメントの内容にリンクしていない場合の値を指定します。
値は引数Typeで指定したデータの種類に応じて変換されます。
データ型によって変換できない場合は、エラーになります。
LinkToContentがTrueの場合、この引数は無視され、リンクしたプロパティの値がコンテナーアプリケーションによって更新されるまで、新しいドキュメントプロパティには既定値が設定されます。
LinkSource オプション LinkToContentがFalseの場合、この引数は無視されます。
セルの値をリンクする場合は、セルに名前の定義をしておき、定義した名前を文字列で指定します。

以下は、保存時に保存日時を履歴として、
ユーザー設定のドキュメントプロパティに追加するマクロVBAです。
ブックのWorkbook_BeforeSaveイベントで起動させています。

ThisWorkbookに
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  Call setCustomDocumentProperties("保存履歴", Now())
End Sub

標準モジュールに
Sub setCustomDocumentProperties(ByVal strProperty As String, _
                ByVal strValue As String)
  Dim dps As DocumentProperties
  Dim dp As DocumentProperty
  Dim maxNo As Integer
  Dim sTemp As String
  Set dps = ThisWorkbook.CustomDocumentProperties
  maxNo = 0
  '指定名称で始まるプロパティの最大番号取得
  For Each dp In dps
    sTemp = dp.Name
    If sTemp Like strProperty & "*" Then
      sTemp = Replace(sTemp, strProperty, "")
      If IsNumeric(sTemp) Then
        If CInt(sTemp) > maxNo Then
          maxNo = CInt(sTemp)
        End If
      End If
    End If
  Next
  'インクリメント
  maxNo = maxNo + 1
  strProperty = strProperty & Format(maxNo, "000")
  'CustomDocumentPropertiesにAdd
  dps.Add strProperty, False, msoPropertyTypeDate, strValue
End Sub

上記マクロVBAでは際限なく増えてしまいますので、頻繁に保存する場合は何らかの工夫が必要になります。
あくまで参考としてのマクロVBAなので、実務で使う場合はそれなりの仕組みを作る必要があります。

ユーザー設定のドキュメントプロパティを削除する

ここではサンプルとして、上に掲載した、
保存日時を履歴として追加したプロパティを削除するマクロVBAになります。

Sub delCustomDocumentProperties(ByVal strProperty As String)
  Dim dps As DocumentProperties
  Dim dp As DocumentProperty
  Set dps = ThisWorkbook.CustomDocumentProperties
  For Each dp In dps
    If dp.Name Like strProperty & "*" Then
      dp.Delete
    End If
  Next
End Sub

使い方
Sub sample()
  Call delCustomDocumentProperties("保存履歴")
End Sub

ドキュメントプロパティの最後に

ドキュメントプロパティについて一通り記載しましたが、
記事を書いてみて改めてドキュメントプロパティを活用するのは結構面倒かなという感じもしました。

ファイルを開くのなら、シートのセルに記載したほうが良いですし、
ファイルを開かずに情報を得るのは、ExecuteExcel4Macroを使っても可能です。
ExecuteExcel4Macroについて(Excel4.0マクロ)
・ ・ ・ExecuteExcel4Macroの使用例 ・ExecuteExcel4Macroの最後に
ブックを開かずにセル値を取得(ExecuteExcel4Macro,Excel.Application)
・ExecuteExcel4Macroで1個のセル値を取得 ・Excel.Applicationで1個のセル値を取得 ・ExecuteExcel4Macroで100個のセル値を取得 ・Excel.Applicationで100個のセル値を取得 ・Excel.Applicationで100個のセル値を取得2 ・ブックを開かずにセル値を取得
Excelファイルを開かずにシート名を取得
Excelファイルを開くときは、ファイルサイズに比して、とても遅い場合があります、ファイルを開かずに、Excelの情報を取得したいという要望は少なからずあるようです、そこで、処理の基本となるシート名を取得する方法になります。もちろん、開かないと言っても、厳密には必ず開いているわけですが、Excelのブックとして開か…
Excelファイルを開かずにシート名をチェック
多くのExcelファイルから、特定のシート名のデータを取得する場合、当該シートが存在していないブックがあるならば、ブックを開く前にシートの存在をチェックしたくなります。このような、ファイルを開かずにExcelの情報を取得したいという要望は多くあります。
とはいえ、
多数のファイルを管理する場合の一手段としては検討する価値はあるのではないでしょうか。
実現したい機能を良く考えて、ドキュメントプロパティを使うことを検討してみても良いと思います。



同じテーマ「マクロVBA技術解説」の記事

オブジェクト式について
オブジェクトの探索方法(オートシェイプのTextを探して)
条件付きコンパイル(32ビット64ビットの互換性)
ドキュメントプロパティ(BuiltinDocumentProperties,CustomDocumentProperties)
VBAでファイルを既定のアプリで開く方法
Excelアドインの作成と登録について
VBAでのタイマー処理(SetTimer,OnTime)
マクロでShift_JIS文字コードか判定する
Byte配列と文字コード関数について
Applicationを省略できるApplicationのメソッド・プロパティ一覧
PowerQueryの強力な機能をVBAから利用する方法


新着記事NEW ・・・新着記事一覧を見る

VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)
VBAでクリップボードへ文字列を送信・取得する3つの方法|VBA技術解説(2023-12-07)
難しい数式とは何か?|エクセル雑感(2023-12-07)
スピらない スピル数式 スピらせる|エクセル雑感(2023-12-06)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.並べ替え(Sort)|VBA入門
8.条件分岐(IF)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ