ドキュメントプロパティ(BuiltinDocumentProperties,CustomDocumentProperties)
ブックのドキュメントプロパティには、組み込みドキュメントプロパティとユーザー設定のドキュメントプロパティがあります。
VBAで扱うときは、それぞれ以下のコレクション・オブジェクトを使います、
BuiltinDocumentProperties ,
CustomDocumentProperties
これらは、DocumentPropertyオブジェクトのコレクションになります。
目次
組み込みドキュメントプロパティ(BuiltinDocumentProperties)
ブック保存時に次のメッセージがでる場合があります。
デスクトップ等で右クリック→新規作成→Microsoft 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)の組み込みドキュメントプロパティを出力しています。
値 | 定数 | 内容 |
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のタスクが残ってしまうので、使う場合は注意してください。
組み込みドキュメントプロパティの値を変更する
ブック内に個人情報が残っていると、ちょっと不安ですよね。
そこで、
組み込みドキュメントプロパティ内の公開したくない情報を消去するマクロ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を付けて、同一フォルダに保存しています。
単純に文字列型のプロパティのみ消去する場合
これはブランクにできないので、最低でも半角スペースを入れる等の値の設定が必要です。
インデックス | プロパティ名 | 和名 |
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
これで一覧が出力できます。
ユーザー設定のドキュメントプロパティを追加する
名前 | 必須/オプション | 説明 | ||||||||||||||||||
Name | 必須 | プロパティの名前を指定します。 | ||||||||||||||||||
LinkToContent | 必須 | プロパティをセルの内容にリンクする場合にTrueを指定します。 Trueを指定した場合は、引数LinkSourceを必ず指定します。 Falseを指定した場合は、引数Valueを必ず指定します。 |
||||||||||||||||||
Type | オプション | プロパティのデータ型を指定します。 使用できる定数は、MsoDocProperties列挙です。
|
||||||||||||||||||
Value | オプション | プロパティがコンテナードキュメントの内容にリンクしていない場合の値を指定します。 値は引数Typeで指定したデータの種類に応じて変換されます。 データ型によって変換できない場合は、エラーになります。 LinkToContentがTrueの場合、この引数は無視され、リンクしたプロパティの値がコンテナーアプリケーションによって更新されるまで、新しいドキュメントプロパティには既定値が設定されます。 |
||||||||||||||||||
LinkSource | オプション | LinkToContentがFalseの場合、この引数は無視されます。 セルの値をリンクする場合は、セルに名前の定義をしておき、定義した名前を文字列で指定します。 |
以下は、保存時に保存日時を履歴として、
ユーザー設定のドキュメントプロパティに追加するマクロVBAです。
ブックのWorkbook_BeforeSaveイベントで起動させています。
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を使っても可能です。
多数のファイルを管理する場合の一手段としては検討する価値はあるのではないでしょうか。
実現したい機能を良く考えて、ドキュメントプロパティを使うことを検討してみても良いと思います。
同じテーマ「マクロVBA技術解説」の記事
オブジェクト式について
オブジェクトの探索方法(オートシェイプのTextを探して)
条件付きコンパイル(32ビット64ビットの互換性)
ドキュメントプロパティ(BuiltinDocumentProperties,CustomDocumentProperties)
VBAでファイルを既定のアプリで開く方法
Excelアドインの作成と登録について
VBAでのタイマー処理(SetTimer,OnTime)
マクロでShift_JIS文字コードか判定する
Byte配列と文字コード関数について
Applicationを省略できるApplicationのメソッド・プロパティ一覧
PowerQueryの強力な機能をVBAから利用する方法
新着記事NEW ・・・新着記事一覧を見る
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.繰り返し処理(For Next)|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.変数宣言のDimとデータ型|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.ブック・シートの選択(Select,Activate)|VBA入門
- ホーム
- マクロVBA応用編
- マクロVBA技術解説
- ドキュメントプロパティ(BuiltinDocumentProperties,CustomDocumentProperties)
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。