以前、エクセルでデータ集計してシールを印刷するVBAのコードを書きました。
その時、値渡しをするファンクションプロシージャが膨大で管理が大変でした。
まあ、標準モジュールのメインプロシージャに混在して、記述していたのです。
このため、使いたいファンクションを探し出すのに、手間取ったりもしました。
特に、異なる標準モジュールから、このファンクションを呼出していたりした。
長いコードに目を通しながら探しまくったりと、今思えば、ずい分と非効率ね。
次第に、コード記述が整理されていないからだと悟りまして、対策の検討です。
手っ取り早いのは、ファンクションプロシージャだけの標準モジュールを作る。
そこに、バランバラに散っていたプロシージャをまとめたりもした記憶がある。
本当は、モジュールの名称を”Function”とか変更しても良かっのかもしれない。
その方が挿入モジュールの意図が分かりやすいのですが、そのままにしました。
そうやって、コードを書き散らしたと思い返したりしていますが、気が付いた。
今さらですが、クラスモジュールでファンクションを管理するのはどうだろう。
クラスと言う英単語は、”(共通の性質を有する)部類、種類”の意味があります。
その点では、同じ特性のプロシージャをまとめて管理するには向いていそうだ。
メインのコードでは、沢山のブックを開きながらシール印刷用のデータを作成。
問題は、ブックファイルのパスが複数あったので、値渡しが必要になりました。
サンプルを見ても分かりますが、使い回しになるからメインコードには不要だ。
<例:パス付きブックを値渡しするファンクションプロシ―ジャ>
Function ClassSample() As String
Dim Str As String
Str = ""
Str = Str & ThisWorkbook.Path
Str = Str & "\"
Str = Str & "Book1.xlsx"
Str = Str & ""
ClassSample = Str
End Function
<例:標準モジュールでクラスモジュール利用の立ち上げ・使い方>
Option Explicit
Dim Class1 As New Class1
Private Sub test()
Workbook.Open Class1.ClassSample
End Sub
それで、クラスモジュールは、標準モジュールの階層下にあるサブセットです。
標準モジュールでは、サブセットを使うよと宣言しないと呼び出せない仕組み。
それが、”Dim Class1 As New Class1”のように呼び出し先を定義づけておく。
モジュールの先頭で宣言すると、各プロシジャには敢えて定義づけは不要です。
それから、”Class1.ClassSample”とクラスモジュール名+プロシージャで実行。
つまり、”Class1”というクラスモジュール番地にあるプロシージャを指定だな。
実際にコードを書くと、”Class1.”までタイプすると配下の内容が一覧されます。
目的のプロシージャを簡単に選択できるので、選びやすくなって便利で効率的。
というわけで、ごちゃごちゃした標準モジュールを整理するには好都合だろう。
ネットでクラスモジュールを検索すると、使い方の説明が沢山見つかりますが、手っ取り早く理解してもらうためには、メインのコードは標準モジュールに書き、値渡しのファンクションプロシージャ等はクラスモジュールに記述して、呼び出して使うと言うのが、一番適切と思うのでした。
0 件のコメント:
コメントを投稿