視覚障害者きうっちの自立への道

視覚障害者きうっち(S52年生)が気の向くままに日々の生活をツラツラとつづるブログ

VBA。クラス(のオブジェクト).構造体.変数の階層構造を作成する方法

2020-10-10 18:00:34 | VBA
 ここ半年ほどで、わたしがEXCELのマクロを作成する際、かなり多用しているのが、記事のタイトルにもしている手法。
ただこの方法、どういうわけかネット上ではほとんど紹介されていないような感じなので(その必要がない、ということなのか?)、自身の知識をアウトプットする意味合いも込めて
↓にその方法を記しておきます。


■前提として
 既に試したことがある人は分かるかと思いますが、VBAの構造体、Typeステートメントは
クラスモジュールの中では宣言することができません。ただし、標準モジュールで宣言した構造体を
クラスモジュールの中で、ローカルレベルの変数や、クラスのプロパティとして利用することはできます。
今回の主題になっている、クラス.構造体.変数の階層構造は、これを利用して作成することになります。


1.標準モジュールを挿入し、その宣言セクションへ、以下のような構造体を記述

Public Type JobOffer
JobNumber As String
Title As String
Occupation As String
Salary As Long
Term As Long
WorkContents As String
End Type


2.クラスモジュールを挿入し、以下のようなコードを記述

Private JO_ As JobOffer

Public Property Get JO() As JobOffer
JO = JO_
End Property

Public Sub SetJobOfferInfo()

With JO_
.JobNumber = "TS002235"
.Occupation = "一般事務"
.Salary = 1500
.Term = 12
.WorkContents = "パソコンを使ったお仕事。EXCELでの業務が中心"
End With

End Sub

3.標準モジュール等、本命の処理を記述したいモジュールへ以下のようなコードを記述し、クラス.構造体.変数の階層構造を利用する。

Sub test()

Dim TS As Class1
Set TS = New Class1
TS.SetJobOfferInfo

MsgBox TS.JO.JobNumber

End Sub


■解説
まず、挿入した標準モジュールの宣言セクションへ構造体を宣言します。
ここで、構造体を宣言する際、どのモジュールからでも呼び出せるように【Public】で宣言するようにすることを忘れずに。(Publicを省略しても可)


次にクラスモジュールを挿入し、2のようなコードを記述していきます。ここでポイントになるのは以下3点。あ、ついでに言うと、クラス名はもちろん変更しても良いのでそのつもりで。

・クラスのプロパティとして、1で宣言した構造体を変数にする際は【Private】で宣言する。Publicではコンパイルエラーになってしまう。
・Property Getプロシージャを用い、呼び出し元プロシージャから【クラス.構造体】の形で呼び出せるようにする。
・クラスのプロパティとして宣言している、構造体の変数は、他モジュールから構造体の各変数へ値を代入することができないため、
 構造体の各変数へ代入するため、クラスのメソッドを用意する。(SetJobOfferInfoプロシージャがこれに該当)


最後に、本命の処理を記述したいプロシージャの中で、該当クラスをインスタンス化。(これも、クラスをインスタンス化するために割り当てたオブジェクト変数を、グローバルレベル、もしくはモジュールレベルで宣言すればその限りではない)
その後、クラスのプロパティとして宣言した構造体の各変数へ値を代入するメソッドを実行すれば、
以降は【クラス.構造体.変数】の形で格納している値や文字列を呼び出すことができるようになります。

とまぁ、実際のやり方としてはこんな感じ。正直、この階層構造を利用するための前準備は少々面倒なのですが、
一度【仕組み】を作ってしまえば、マクロを作成する段階もそうだし、作った後、そのマクロを保守・メンテナンスする際も
記述されているコードがだいぶ見やすくなっているはずなので、その後の作業としては随分楽になると思います。
個人的には、VBAで開発をしている方であれば、ぜひ一度お試しあれ、ということで(^^)。

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする