Kの備忘録(仮)

Python、VBA、Excelを中心に記事を投稿

Excel VBAのクラスを学ぶ前の準備 - モジュールとプロパティ -

はじめに

少し前に、「VBAにおけるPropertyプロシージャとは何か」という記事を書きました。(現在受講中VBAの講座内容です)

lbibouroku.hatenablog.com

今回は、その続きで、モジュール、プロパティについて調べていきます。

◆目次◆

モジュール

モジュールの種類

  • 標準モジュール
  • オブジェクトモジュール
    • シートモジュール
    • ブックモジュール
    • フォームモジュール
    • クラスモジュール

大きく分けると、「標準モジュール」か、「オブジェクトモジュール」か、ということになります。

標準モジュール

標準モジュールで記述したパブリックメンバーはすべてグローバルのメンバーです。 ※グローバルなメンバー→全体的なメンバー、つまりどのオブジェクトの処理も可能

モジュールを分けてコードを管理する大きなメリットは以下2点です。

  • 可動性が上がる(コードの管理がしやすい)
  • 誤記防止の効果が高い

オブジェクトモジュール

オブジェクトモジュールで記述したパブリックメンバーはオブジェクトに属します。
※ほかのオブジェクトの操作もできるけど、「コードの管理」という観点から外れるので、すべきではないです。

プロパティ

オブジェクトにプロパティを追加する方法

  • モジュールレベル変数
  • Property Let/Setプロシージャ
  • Property Getプロシージャ

セッターとゲッター

  • セッター(setter)= 値をsetする(Property Let/Setプロシージャを使う)
  • ゲッター(getter)= getした値を返す(Property Getプロシージャを使う)

セッター

オブジェクトモジュールに書いたプライベート変数をパブリックプロパティで値を設定すると、ほかのモジュールでもその値が使えます。

例として、好きなもの(Favorite)を設定するプロパティを作成し、セッターの役割を与えます。

[Sheet1]
' プライベート変数:favorite_
Private favorite_ As String

' パブリックプロパティ:Favorite
Public Property Let Favorite(ByVal newFavorite As String)
    favorite_ = newFavorite
End Property

[Module1]
Sub setter_test()
    Sheet1.Favorite = "Coffee"
End Sub

セッターの使いどころは以下のとおりです。

  • モジュールの設定に制限をかけたい
  • 設定時に何らかの処理をしたい

なお、[Module1]のコードに

Debug.Print Sheet1.Favorite

を追加すると、エラーが出ます。

[Module1]
Sub setter_test()
    Sheet1.Favorite = "Coffee"
    Debug.Print Sheet1.Favorite
End Sub

実行結果

f:id:lbibouroku:20210826222348p:plain

理由は、Property Getプロシージャを使って値を返していない(戻り値がない)からです。(Debug.Printは、getした値(戻り値)を出力する)

ゲッター

オブジェクトモジュールに書いたプライベート変数をパブリックプロパティで値を取得すると、ほかのモジュールにその値が返せます。

例として、好きなもの(Favorite)の値に「Coffee」を含む文字列が設定されていたら、コーヒーの種類を返すプロパティ(CoffeeKinds)を作成し、ゲッターの役割を与えます。

今回は、好きなもの(Favorite)の値に「AmericanCoffee」を設定します。

[Sheet1]
' プライベート変数:favorite_
Private favorite_ As String

' パブリックプロパティ:Favorite
Public Property Let Favorite(ByVal newFavorite As String)
    favorite_ = newFavorite
End Property

' パブリックプロパティ:CoffeeKinds
Public Property Get CoffeeKinds() As String
    If Right(favorite_, 6) = "Coffee" Then
        CoffeeKinds = Left(favorite_, Len(favorite_) - 6)
    End If
End Property

[Module1]
Sub getter_test()
    Sheet1.Favorite = "AmericanCoffee"
    Debug.Print Sheet1.CoffeeKinds '出力結果:American
End Sub

ゲッターの使いどころは以下のとおりです。

  • 取得時に何らかの処理をしたい
  • 読み取り専用プロパティを作りたい

注意点

同名のProperty Let/SetプロシージャとProperty Getプロシージャがある場合は、読み書き可能なプロパティとして処理します。

さいごに

これらの内容をふまえたうえで、次回の講座ではクラスを勉強します。