あえて組み込みオブジェクトを低機能化させる
あえて組み込みオブジェクトを低機能化させる
組み込みオブジェクトは優秀である。
プロが作ったものなのだから、当り前である。
しかし、素人にとっては「優秀すぎて良さがわからない」こともしばしば。
そこで、初心者のうちは、
あえて低機能化させたクラス/メソッドを作る
ことをオススメする。
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
オブジェクトを極めたときなのだと思う。
おわりに
……というわけで、がんばりましょう。
最初は借り物のコードでいいんです。でも、ときどき見返して理解するようにしようぜ!