2023年10月16日月曜日

モジュールにも階層構造があって、下の階層を使うためには、それを特定する宣言の”Dim”が必要だと言うこと ー Class Module(VBAマクロ)

           
以前、エクセルでデータ集計してシールを印刷する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 件のコメント:

コメントを投稿