」みたいなときには、このようにSheetXオブジェクトのPropertyにしてしまう、というのは便利なテクニックだと思う。このやり方だと早晩行き詰まることになる。シートが増えるごとに、「似ているけれど少しづつ異なるコードが量産されてしまう」という問題である。量産する段階では、単純に「コピペして微修正」を繰り返すだけなので、たいした手間ではない。今回のshowBaseCellValueに機能を追加しようとしたらどういうことになるか。量産した分だけ手間がかかるのである!ふつう、こういうときは、「共通部分の括り出し」ということをする。メソッドの括り出しを試みるとりあえず、標準モジュールに次のようなコードを書いて括り出してみる。標準モジュール[SheetOperator]最近、標準モジュールに名前を付けて、メソッドの機能ごとに分ける、ということをしています。今回は、SheetXオブジェクトを操作するメソッドなので、モジュール名を「SheetOperator」にしました。命名方法については、現在試行錯誤中です。参考になるコーディング規約等ございましたら、ご教示ください。Sub引数でWorksheetオブジェクトを渡して、それぞれのshowBaseCellValueメソッドを実行する、という目論見。この計画には、実はコード入力時点で既に暗雲が立ちこめている。targetSheet.の段階で、入力候補にshowBaseCellValueが出てこないのである。その嫌な予感は、このメソッドを使ってみるとしっかり当たる。SubSheet1を引数として渡して、SheetOperatorモジュールのshowBaseCellValueメソッドを実行する。すると、あえなくコンパイル・エラー!これは、少し考えれば当たり前の話で、showBaseCellValueメソッド(BaseCellプロパティも)は、あくまでもSheet1オブジェクト、Sheet2オブジェクトのメソッド(プロパティ)なのであって、Worksheetオブジェクトのメソッド(プロパティ)ではないということなのである。単純な理屈だけれど、案外見落としやすいポイントだと思う。要するに、SheetOperatorモジュールのshowBaseCellValueメソッドにSheet1オブジェクト、Sheet2オブジェクトが渡ればいいのである。よって、リスト6を次のように修正する。SubObject型の変数に格納して渡すことで、行った先でもSheet1オブジェクト、Sheet2オブジェクトとして振る舞ってくれるはずだ。使ってみる次のコードで実験。Sub今度は、うまくいった。おわりにObject型の変数を使うことによって、コードを一箇所に集約することができた。Object型の変数(引数)を使うと、コーディング中に入力候補が表示されなくて不便だが、その場合は、コーディング時には今回の場合だったら、ひとまずSheet1で書いておいて、書き終わって実行テストが終わってから一気にtargetSheetに置換する、というやり方をすればいいと思う。»プロフィールid:akashi_keirinExcelVBAネタです。SyntaxHighlighter.all();注目記事はてなブログをはじめよう!akashi_keirinさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。