ユーザー設定のドキュメントプロパティを気軽に使う
ユーザー設定のドキュメントプロパティを操作するFunction
このときに、処理用パラメータの保存場所としてユーザー設定のドキュメントプロパティを使ったが、もっと気軽に使えるようにFunction化しておいた。
追加用Function
リスト1 標準モジュール
Public Function addDocumentProperty(ByVal propName As String, _ ByVal propType As MsoDocProperties, _ ByVal defaultValue As Variant) _ As Boolean '……(1)' On Error GoTo errorHandler '……(2)' ThisWorkbook.CustomDocumentProperties.Add Name:=propName, _ LinkToContent:=False, _ Type:=propType, _ Value:=defaultValue '……(3)' addDocumentProperty = True: Exit Function '……(4)' errorHandler: '……(5)' setDocumentProperty = False End Function
(1)の
Public Function addDocumentProperty(ByVal propName As String, _ ByVal propType As MsoDocProperties, _ ByVal defaultValue As Variant) _ As Boolean
は、引数と返り値の設定。
第1引数はプロパティ名。
第2引数はプロパティの型。MsoDocProperties型を指定しているので、インテリセンスが効く。
ちなみに、MsoDocProperties列挙体のメンバは
- msoPropertyTypeBoolean
- msoPropertyTypeDate
- msoPropertyTypeFloat
- msoPropertyTypeNumber
- msoPropertyTypeString
となっている。まあ、どれがどの型なのかはだいたい名前で見当がつくな。Numberだけはよく分からんけど。
第3引数は初期設定のプロパティ値。色んな型が指定できそうなのでVariantにした。
で、別にSubでも良いと思ったんだが、うまく設定できずにエラーが出るようなこともあると思ったので、Functionにして、うまく行ったらTrue、失敗したらFalseを返すようにした。
したがって、(2)の
On Error GoTo errorHandler
でエラー時にはキャッチするようにした。
(3)の
ThisWorkbook.CustomDocumentProperties.Add Name:=propName, _ LinkToContent:=False, _ Type:=propType, _ Value:=defaultValue
が処理の本体。たったこんだけ。
CustomDocumentPropertiesコレクションのAddメソッドを実行しているだけ。
(4)の
addDocumentProperty = True: Exit Function
までたどり着いたということは、エラーが出ずに無事addメソッドが実行されたということなので、Trueを返して抜ける。
どこかでエラーが発生していたら、(5)の
errorHandler: setDocumentProperty = False
に飛ばされるので、Falseを返して抜ける。
削除用
リスト2 標準モジュール
Public Function deleteDocumentProperty(ByVal propName As String) As Boolean On Error GoTo errorHandler ThisWorkbook.CustomDocumentProperties.Item(propName).Delete '……(6)' deleteDocumentProperty = True: Exit Function errorHandler: deleteDocumentProperty = False End Function
エラー対応についてはリスト1と全く同じなので省略。
(6)の
ThisWorkbook.CustomDocumentProperties.Item(propName).Delete
で、CustomDocumentPropertiesコレクションのDeleteメソッドを実行してユーザー設定のドキュメントプロパティを削除しているだけ。
使ってみた
次のコードで上記2つのFunctionを使ってみた。
リスト3 標準モジュール
Public Sub setPropertiesTest() Call addDocumentProperty(propName:="hoge", _ propType:=msoPropertyTypeString, _ defaultValue:="foo") MsgBox ThisWorkbook.CustomDocumentProperties.Item("hoge").Value Call deleteDocumentProperty("hoge") End Sub
「hoge」という名前のString型のドキュメントプロパティを設定し、初期値を「foo」にする。
その後、プロパティ「hoge」の値をメッセージボックスで表示し、「hoge」そのものを抹殺する、というマクロ。
「ファイル」タブ、「情報」の右の方、
ココをクリックして、
ココをクリックして、
ココをクリックすると、
ココにたどり着く。
まだユーザー設定のドキュメントプロパティが設定されていないことが分かる。
リスト3の実行をココで中断して、もう一度見てみると、
ほれ、「hoge」が追加されておる。値も「foo」。意図した通り。
したがって、当然、メッセージボックスには、
「foo」が表示される。
んで、この後「hoge」は抹殺されるので、実行終了後もう一度見に行くと、
キッチリ抹殺されている。
おわりに
これで気軽に使えるようになった。
使う機会はそんなにないだろうけど。