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

このプロパティの値をVBAで取得・設定します。
これに関連して、
ブック保存時に次のメッセージがでる場合があります。

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

この中の、ドキュメント固有の設定のところにチェックが付いている場合にメッセージが出ます。
チェックを外せばメッセージは出なくなります。
Excelを起動して新規ブックを作成したときは、このメッセージは出ません。
ドキュメント固有の設定が最初からチェックされずに作成されます。
この手順で新規作成している人のほうが多いのではないかと思います。
組み込みドキュメントプロパティを一覧出力
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プロパティについて
値 | 定数 | 内容 |
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(ThisWorkbook.FullName) 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 End Sub |
先の「getBuiltinDocumentProperties」と値を比較しやすいように、
上記VBAコードでは、あえてThisworkBookを取得しています。
取得できていることは確認できますが、取得できない項目も結構あるようです。
特に、「Last save time」が取得でないようで、これは困ります。
この情報がないのでは、ファイル管理になりません。
そうなると、別途に、
VBA関数のFileDateTimeを使うか、
FileSystemObjectを使い、FolderオブジェクトのDateLastModifiedプロパティを取得する必要が出てきます。
ちょっと面倒な気もしますが、
ファイル数が多い時には高速で動作するので使い方によっては便利だと思います。
組み込みドキュメントプロパティの値を変更する
ブック内に個人情報が残っていると、ちょっと不安ですよね。
そこで、
組み込みドキュメントプロパティ内の公開したくない情報を消去するマクロVBAです。
Sub delBuiltinDocumentProperties() 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) 'ブランクは設定できないので何らかの文字を入れる Application.UserName = "エクセルの神髄" With wb .Activate 'UserNameは後で元に戻すため保存 sUser = Application.UserName 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
これはブランクにできないので、最低でも半角スペースを入れる等の値の設定が必要です。
インデックス | プロパティ名 | 和名 |
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
ユーザー設定のドキュメントプロパティ(CustomDocumentProperties)
「ファイル」タブ→情報→プロパティ→詳細プロパティ→「ユーザー設定」タブ
実務において、どのような用途があるのか、、、
実際には私は使ったことはありませんね。
組み込みを紹介したので、ユーザー設定も紹介しておこうという趣旨です。
この機能を使うとしたら、
ファイルを開かずに、このプロパティを取得してファイルを管理するような場合でしょうか。
膨大なファイル数を管理する場合に、その概要だけを取得したいような場合になると思います。
ただしそれには、Microsoftが作成し無償で公開しているDsofile.dllをインストールする必要があります。
これについて知りたい場合は、「Dsofile.dll」で検索してください。
ユーザー設定のドキュメントプロパティを一覧出力
「組み込みドキュメントプロパティを一覧出力 」getBuiltinDocumentProperties
このVBA内の、
BuiltinDocumentProperties
↓に変更
CustomDocumentProperties
これで一覧が出力できます。
ユーザー設定のドキュメントプロパティを追加する
式.Add(Name,LinkToContent,Type,Value,LinkSource)
名前 | 必須/オプション | 説明 | ||||||||||||||||||
Name | 必須 | プロパティの名前を指定します。 | ||||||||||||||||||
LinkToContent | 必須 | プロパティをセルの内容にリンクする場合にTrueを指定します。 Trueを指定した場合は、引数LinkSourceを必ず指定します。 Falseを指定した場合は、引数Valueを必ず指定します。 |
||||||||||||||||||
Type | オプション | プロパティのデータ型を指定します。 使用できる定数は、MsoDocProperties列挙です。
|
||||||||||||||||||
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,Excel.Application)
Excelファイルを開かずにシート名を取得
Excelファイルを開かずにシート名をチェック
とはいえ、
多数のファイルを管理する場合の一手段としては検討する価値はあるのではないでしょうか。
実現したい機能を良く考えて、ドキュメントプロパティを使うことを検討してみても良いと思います。
同じテーマ「マクロVBA技術解説」の記事
文字列としてのプロシージャー名を起動する方法(Run,OnTime)
ドキュメントの作成者を取得(GetObject,BuiltinDocumentProperties)
画像サイズ(横x縦)の取得について
文字種(ひらがな、全半角カタカナ、半角英大文字等々)の判定
オブジェクトとプロパティの真実
オブジェクト式について
オブジェクトの探索方法
条件付きコンパイル(32ビット64ビットの互換性)
ドキュメントプロパティ(BuiltinDocumentProperties,CustomDocumentProperties)
VBAでファイルを規定のアプリで開く方法
Excelアドインの作成と登録について
新着記事 ・・・新着記事一覧を見る
Excelシートの複雑な計算式を解析するVBA|VBAサンプル集(2月18日)
VBAクラスの作り方:独自Rangeっぽいものを作ってみた|VBA技術解説(2月16日)
VBAクラスの作り方:列名のプロパティを自動作成する|VBA技術解説(2月14日)
VBAクラスの作り方:列名の入力支援と列移動対応|VBA技術解説(2月11日)
クラスを使って他ブックのイベントを補足する|VBA技術解説(2月6日)
Excelアドインの作成と登録について|VBA技術解説(2月3日)
参照設定、CreateObject、オブジェクト式の一覧|VBA技術解説(1月20日)
VBAでファイルを規定のアプリで開く方法|VBA技術解説(1月20日)
ドキュメントプロパティ(BuiltinDocumentProperties,CustomDocumentProperties)|VBA技術解説(1月19日)
他ブックへのリンクエラーを探し解除|VBAサンプル集(1月15日)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.変数とデータ型(Dim)|ExcelマクロVBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.RangeとCellsの使い方|ExcelマクロVBA入門
6.マクロって何?VBAって何?|ExcelマクロVBA入門
7.繰り返し処理(For Next)|ExcelマクロVBA入門
8.とにかく書いて見よう(Sub,End Sub)|VBA入門
9.定数と型宣言文字(Const)|ExcelマクロVBA入門
10.ひらがな⇔カタカナの変換|エクセル基本操作
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
なお、掲載のVBAコードは自己責任で使ってください。万一データ破損等の損害が発生しても責任は負いません。