あえて組み込みオブジェクトを低機能化させる

あえて組み込みオブジェクトを低機能化させる

f:id:akashi_keirin:20190813075140j:plain

組み込みオブジェクトは優秀である。

プロが作ったものなのだから、当り前である。

しかし、素人にとっては「優秀すぎて良さがわからない」こともしばしば。

そこで、初心者のうちは、

あえて低機能化させたクラス/メソッドを作る

ことをオススメする。

FileDialogオブジェクトの場合

たとえば、Application.FileDialogオブジェクトというものがある。

ファイルやフォルダを選択するとき、「名前を付けて保存」とかするときに出てくるあのウインドウだ。

今でこそApplication.FileDialogオブジェクトの使い方もそこそこわかるので、便利だなーと思うこともできるのだが、初心者の頃はとにかく

な、何てややこしいんだ……

などと思っていたものである。

詳しいことはコチラに譲るとして、とにかくやれメソッドだ、プロパティだ、と、初心者にはわけがわからないはずである。

使いたい機能を絞り込む

そこで、たとえば、

とにかく、ファイル選択ダイアログを表示して、ユーザーにファイルを選ばせる。んで、選んだファイルのフルパスが取得できたらいい。

と、目標を絞るのである。

ユーザーが選んだファイルのフルパスを取得するメソッド

使用者(コードを書く人。つまり自分)が設定するのは、せいぜい〈デフォルトのフォルダパス〉と〈ダイアログのタイトル〉ぐらいにしておくと楽だ。あとはメソッドの中に封印してしまえば良い。

そのような考え方で書いたメソッドが次のもの。

リスト1 標準モジュール
Option Explicit

Private fsObj As New FileSystemObject

Public Function getSelectedFilePath( _
      Optional ByVal defaultFolderPath As String, _
      Optional ByVal Title As String) As String
  Const DEFAULT_TITLE As String = "ファイルを選べやぼけーーー"
  '第1引数省略または存在しないフォルダパスなら既定のフォルダにする'
  If defaultFolderPath = "" Or _
     Not fsObj.FolderExists(defaultFolderPath) Then
    defaultFolderPath = ThisWorkbook.Path & "\"     '"
  Else
    If Right(defaultFolderPath, 1) <> "\" Then _
      defaultFolderPath = defaultFolderPath & "\"
  End If
  '第2引数省略なら既定の値に'
  '(引数リストに書くと長くなるのでプロシージャ内に記述)'
  If Title = "" Then Title = DEFAULT_TITLE
  
  Dim ret As String
  ret = ""
  Dim fileDialog_ As FileDialog
  Set fileDialog_ = Application.FileDialog( _
                                 msoFileDialogFilePicker)
  Dim hasSelected As Boolean
  hasSelected = False
  With fileDialog_
    .Title = Title
    .InitialFileName = defaultFolderPath
    .AllowMultiSelect = False
    hasSelected = .Show
    If hasSelected Then ret = .SelectedItems(1)
  End With
  getSelectedFilePath = ret
End Function

引数が省略されたときにとりあえずマクロを書いたブックのあるフォルダを指定するとか、複数ファイルの選択を不許可にするとか、ユーザーが何も選ばなかったときの対応とか、そういううっとうしい設定はメソッド内に吸収してしまっている。

したがって、このgetSelectedFilePathメソッドの使用者(つまり自分)は、そういうことを何にも考えずに、ただデフォルトのフォルダパスとダイアログのタイトルだけ渡してやれば(何ならそれすら渡さなくても)、ユーザーが選んだファイルのフルパスを取得することができるのだ。

その後どうするか

上で紹介したgetSelectedFilePathメソッドの場合、本来非常に多くの機能を備えているApplication.FileDialogオブジェクトをメソッドの中に封印し、そのうちのごく一部の機能だけを使用者(つまり自分)に公開するというやり方をとった。

こうすることで、単に〈ユーザーにファイルを選ばせ、そのファイルのフルパスを取得したい〉というだけなら、もはやApplication.FileDialogの使い方など一切意識する必要がなくなる。

しかし、少し考えたらわかるように、これは単なる〈逃げ〉に過ぎない。

では、どうするか。

ときどき見直す

これである。

実にあほらしいことのように見えるかも知れないが、これが大切である。

今回の場合なら、getSelectedFilePathメソッドのコードを読み返して処理を追いかけてみるのである。

かならずどこかで、

おおお! FileDialogオブジェクトとはそういうものだったのか!

となるときが来る。必ず来る。絶対に来る。

そうなると強い。

今度は、さらに痒いところに手が届くようにアレンジしたくなる。

これを繰り返すうちに、「あれ? Application.FolderDialogオブジェクトを直接使った方が早くね?」というときが来る。これは、まだ私は経験していないので断言しにくいが、きっと来る。

そのときが、Application.FolderDialogオブジェクトを極めたときなのだと思う。

おわりに

……というわけで、がんばりましょう。

最初は借り物のコードでいいんです。でも、ときどき見返して理解するようにしようぜ!