ユーザー設定のドキュメントプロパティを気軽に使う

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

akashi-keirin.hatenablog.com

このときに、処理用パラメータの保存場所としてユーザー設定のドキュメントプロパティを使ったが、もっと気軽に使えるように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」そのものを抹殺する、というマクロ。

「ファイル」タブ、「情報」の右の方、

f:id:akashi_keirin:20180306215425j:plain

ココをクリックして、

f:id:akashi_keirin:20180306215438j:plain

ココをクリックして、

f:id:akashi_keirin:20180306215446j:plain

ココをクリックすると、

f:id:akashi_keirin:20180306215456j:plain

ココにたどり着く。

まだユーザー設定のドキュメントプロパティが設定されていないことが分かる。

f:id:akashi_keirin:20180306215507j:plain

リスト3の実行をココで中断して、もう一度見てみると、

f:id:akashi_keirin:20180306215516j:plain

ほれ、「hoge」が追加されておる。値も「foo」。意図した通り。

したがって、当然、メッセージボックスには、

f:id:akashi_keirin:20180306215525j:plain

「foo」が表示される。

んで、この後「hoge」は抹殺されるので、実行終了後もう一度見に行くと、

f:id:akashi_keirin:20180306215533j:plain

キッチリ抹殺されている。

おわりに

これで気軽に使えるようになった。

使う機会はそんなにないだろうけど。

@akashi_keirin on Twitter