Excel VBA | クラスやモジュール間の公開/非公開

Excel VBA VBA
スポンサーリンク

「銀行口座クラス」を例に、PublicとPrivateを使い分けた設計を示します。


クラス設計の考え方

  • Private
    • 外部から直接触らせたくない内部データ(残高や暗証番号など)
    • 内部処理専用のメソッド(計算やチェック用)
  • Public
    • 外部から利用するためのインターフェース(入金、出金、残高照会など)
    • 外部に公開するプロパティ(口座番号など)

クラスモジュール例(BankAccount)

' クラスモジュール: BankAccount

' --- 内部データ(非公開) ---
Private balance As Currency
Private pinCode As String

' --- 公開プロパティ ---
Public Property Get AccountNumber() As String
    AccountNumber = "AC-" & CStr(Me.GetHashCode) ' 仮の口座番号生成
End Property

' 残高は読み取り専用で公開
Public Property Get Balance() As Currency
    Balance = balance
End Property

' --- 公開メソッド ---
Public Sub Deposit(ByVal amount As Currency)
    If amount > 0 Then
        balance = balance + amount
    Else
        Err.Raise vbObjectError + 1000, "BankAccount", "入金額が不正です"
    End If
End Sub

Public Sub Withdraw(ByVal amount As Currency, ByVal pin As String)
    If Not CheckPin(pin) Then
        Err.Raise vbObjectError + 1001, "BankAccount", "暗証番号が違います"
    End If
    
    If amount <= 0 Then
        Err.Raise vbObjectError + 1002, "BankAccount", "出金額が不正です"
    End If
    
    If amount > balance Then
        Err.Raise vbObjectError + 1003, "BankAccount", "残高不足です"
    End If
    
    balance = balance - amount
End Sub

' --- 非公開メソッド ---
Private Function CheckPin(ByVal pin As String) As Boolean
    CheckPin = (pin = pinCode)
End Function

' --- 初期化用(公開) ---
Public Sub Initialize(ByVal initialBalance As Currency, ByVal pin As String)
    balance = initialBalance
    pinCode = pin
End Sub
VB

呼び出し例(標準モジュール)

Sub TestBankAccount()
    Dim myAccount As New BankAccount
    
    ' 初期化
    myAccount.Initialize 10000, "1234"
    
    ' 入金
    myAccount.Deposit 5000
    
    ' 出金(暗証番号チェックあり)
    On Error Resume Next
    myAccount.Withdraw 3000, "9999"   ' → エラー「暗証番号が違います」
    If Err.Number <> 0 Then
        MsgBox "エラー: " & Err.Description
        Err.Clear
    End If
    
    ' 正しい暗証番号で出金
    myAccount.Withdraw 2000, "1234"
    
    ' 残高確認
    MsgBox "残高は " & myAccount.Balance & " 円です"
End Sub
VB

ポイント

  • Private balance / pinCode → 外部から直接触れないようにして安全性を確保
  • Public Deposit / Withdraw → 外部から利用できる操作を公開
  • Private CheckPin → 内部処理専用の暗証番号チェック
  • カプセル化 → 「外部に見せる部分」と「内部に隠す部分」を分けることで、安全で使いやすいクラスになる

👉 このように Publicは外部インターフェース、Privateは内部処理やデータ保持 に使い分けるのが基本です。

次のステップとして「利息計算を内部で行い、外部からは残高に反映された結果だけ見える」ような拡張をしてみると、さらに実用的な銀行口座クラスになります。

VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました