素人がExcelVBAによる「一人働き方改革」に挑むブログスマートフォン用の表示で見る素人がExcelVBAによる「一人働き方改革」に挑むブログExcelVBAネタです。VBA自作メソッドVBAの「コンストラクタに引数を渡せない」問題VBAでクラスモジュールを使い始めたときに必ずぶち当たるのが、なんでコンストラクタに引数が渡せねえんだよ!この金髪豚野郎!!!!!!!!!問題だろう。(個人の感想です)これは本当に不便な話で、「VBAのイマイチなところ大特集」でもやったら、かなり上位に来る項目だと思う。あるやり方は、別途initメソッドを持たせておいて、Newしたら必ずセットでinitメソッドも実行する、というもの。これは自分でもよくやる。initメソッド未実行ならば、一切メソッドの実行もプロパティの参照もさせないようにしておくことで、まあそこそこの信頼性は確保できる。akashi-keirin.hatenablog.comこんな感じ。このときはinitメソッド実行済みチェックが不完全ですなあ。自分と同じクラスの新規オブジェクトを返すメソッドを作ってコレクションにスマートに代入するみたいに、すげえやり方で実装していたりする。私はなにぶんにも素人なので、もっとアホみたいな対応策を考えてみた。インスタンス作成用FunctionCreateObject関数みたいな感じのFunctionを作って、Newさせずにインスタンスを得る、という方向で考えた。標準モジュールの宣言セクションまずは、準備として標準モジュールの宣言セクションに次のコードを書く。Boolean列挙体とPublic変数の宣言をしているだけ。クラスモジュールクラスモジュールを挿入し、オブジェクト名を「SampleRacer」とした。"SampleRacerクラスを直接Newすることはできません。"createSampleRacerObjectメソッドを使用してインスタンス化してください。"initメソッドを複数回実行することはできません。Subサンプルだから凝らなくてもいいのに、ムダにタテ長になってしまった。いつものことながら申しわけない。Thenという条件式を書いている。isInstantiatedという変数については後述するが、普通にNewでインスタンス化しようとすると、ここでエラーを吐いて弾き返す、という仕組みにした。FalseでisInitializedをFalseに戻す。Function作った意味がなくなるので、要注意。Subが実質的なコンストラクタ。isInitializedフラグを用いることで複数回実行されることを防ぐ。標準モジュールんで、コチラがインスタンス生成用のFunction。Functionシンプルなコードなので説明するまでもないけれど、一応。TrueでisInstantiatedをTrueにしておく。することで、次に(2)でNewしたときにClass_Initializedで弾き返されることを防ぐ。graduatedTermで引数を渡して初期化。smplRacerでインスタンスを呼び出し元に返す。次のコードでSampleRacerクラスを使ってみる。SampleRacerのところで、エラーになる。実行時は(*)をコメントアウトします。35)でcreateSampleRacerObjectに引数を3つ渡してインスタンス化。(2)のsr1.showMyselfでshowMyselfメソッドを実行。72sr1.showMyselfでは、setRacerメソッドでパラメータを書き換えた後、showMyselfメソッドを実行。52sr1.showMyselfも(2)と同じ。したとおりの結果となった。おわりに今にして思えば、別にNewを禁止することはなかったな。引数が必要なければ普通にNew、引数が必要だったらFunction経由、という風に使い分けたらいいだけだし。すれば、グローバル変数isInstantiatedも必要なくなるなあ。インターフェイスを使うやり方も含め、もうちょっと研究してみる余地はありそう。ご心配をおかけしました。»プロフィールid:akashi_keirinExcelVBAネタです。SyntaxHighlighter.all();注目記事はてなブログをはじめよう!akashi_keirinさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。