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

ExcelマクロVBAの問題点と解決策、エクセルVBAの技術的解説
最終更新日:2019-01-19

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

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



組み込みドキュメントプロパティ
ファイルの右クリックから「プロパティ」の「詳細」タブで見られる内容になります。

マクロ VBA 参考画像

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

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

マクロ VBA 参考画像

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

マクロ VBA 参考画像

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

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(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を使うか、
FileDateTime関数は、指定したファイルの作成日時または最後に修正した日時を返します、バリアント型(内部処理形式DateのVariant)の値を返します。FileDateTime関数 FileDateTime(pathname) pathname 必ず指定します。
FileSystemObjectを使い、FolderオブジェクトのDateLastModifiedプロパティを取得する必要が出てきます。
FileSystemObjectオブジェクトでは、コンピュータのファイルシステムへのアクセスが提供されています。VBAに用意されているファイル操作関連のステートメントや関数より、より強力で、より多くの機能が搭載されています。ただし、機能が大変多いため、これらを全て覚えるという事は困難です。
ちょっと面倒な気もしますが、
ファイル数が多い時には高速で動作するので使い方によっては便利だと思います。


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

Excelブックを幅広く配布する場合、
ブック内に個人情報が残っていると、ちょっと不安ですよね。
そこで、
組み込みドキュメントプロパティ内の公開したくない情報を消去するマクロ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
保存時に、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
これで一覧が出力できます。



ユーザー設定のドキュメントプロパティを追加する
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は、Excel4.0のマクロを実行します。つまり、昔のマクロを使うということです。VBAが使える前にあったものですが、最新バージョンのエクセルでも使用できます。とはいえ、積極的に使うようなものでもないですし、MSもVBAへの移行を勧めています。
ブックを開かずにセル値を取得(ExecuteExcel4Macro,Excel.Application)
「ブックを開かずにセル値を取得」に関する検索が非常に多いですおそらくExecuteExcel4Macroに関連しているとかもしくは大量のファイルがある為時間がかかってしまうと言うものでしょう。ExecuteExcel4Macroについての簡単な解説は「ExecuteExcel4Macroについて」サンプルを通して
Excelファイルを開かずにシート名を取得
Excelファイルを開くときはファイルサイズに比してとても遅い場合がありますファイルを開かずにExcelの情報を取得したいという要望は少なからずあるようですそこで処理の基本となるシート名を取得する方法になります。もちろん開かないと言っても厳密には必ず開いているわけですがExcelのブックとして開かないという事です。
Excelファイルを開かずにシート名をチェック
多くのExcelファイルから、特定のシート名のデータを取得する場合、当該シートが存在してないブックがあるならば、ブックを開く前にシートの存在をチェックしたくなります。このような、ファイルを開かずにExcelの情報を取得したいという要望は多くあります。

とはいえ、
多数のファイルを管理する場合の一手段としては検討する価値はあるのではないでしょうか。
実現したい機能を良く考えて、ドキュメントプロパティを使うことを検討してみても良いと思います。




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

オブジェクトとプロパティの真実
オブジェクト式について
オブジェクトの探索方法
条件付きコンパイル(32ビット64ビットの互換性)
ドキュメントプロパティ(BuiltinDocumentProperties,CustomDocumentProperties)
VBAでファイルを規定のアプリで開く方法
Excelアドインの作成と登録について
VBAでのタイマー処理(SetTimer,OnTime)
マクロでShift_JIS文字コードか判定する
VBA+SeleniumBasicで検索順位チェッカー(改)
Applicationを省略できるApplicationのメソッド・プロパティ一覧


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

Byte配列と文字コード関数について|VBA技術解説(8月20日)
PowerQueryの強力な機能をVBAから利用する方法|VBA技術解説(8月4日)
練習問題31(セル結合を解除して値を埋める)|VBA練習問題(7月30日)
練習問題30(マトリックス→リスト形式)|VBA練習問題(7月25日)
Applicationを省略できるApplicationのメソッド・プロパティ一覧|VBA技術解説(7月22日)
コレクション(Collection)の並べ替え(Sort)に対応するクラス|VBA技術解説(7月20日)
CSVの読み込み方法(ジャグ配列)|VBAサンプル集(7月15日)
その他のExcel機能(グループ化、重複の削除、オートフィル等)|VBA入門(7月14日)
オートフィルタ退避回復クラスを複数シート対応させるVBAクラス|VBA技術解説(7月6日)
オートフィルタを退避回復するVBAクラス|VBA技術解説(7月6日)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|ExcelマクロVBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数とデータ型(Dim)|ExcelマクロVBA入門
6.繰り返し処理(For Next)|ExcelマクロVBA入門
7.マクロって何?VBAって何?|ExcelマクロVBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.ひらがな⇔カタカナの変換|エクセル基本操作
10.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説



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

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


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




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