web-dev-qa-db-ja.com

VBA:オブジェクトを値で初期化しますか?

初期化できるようにしたい

CArticleには次のプロパティがあります:

_Private pNumber As String
Private pQuantity As Double
_

空の、事前定義された、または現在の値のいずれか。どうすればこれを達成できますか?私は次のことに沿って何かを考えています:

新しい空CArticle

_pNumber
pQuantity
_

新しいダミーCArticle

_pNumber
pQuantity = 99999
_

新しいinit CArticle(number, quantity)

_pNumber = number
pQuantity = quantity
_
21
user1283776

首の痛みですが、これが唯一の方法です。

ファイルCArticle

Option Explicit

Private pNumber As String
Private pQuantity As Double

Private Sub Class_Initialize()
    pNumber = vbNullString
    pQuantity = 0
End Sub

Public Sub InitializeWithValues(ByVal number As String, ByVal quantity As Double)
    pNumber = number
    pQuantity = quantity
End Sub

Public Sub InitializeDefaultValues()
    pNumber = vbNullString
    pQuantity = 99999
End Sub

そして呼び出しモジュールで

Dim art As New CArticle       ' Initialize value to empty
art.InitializeWithValues "Bowtie", 100     ' and assign values

Set art = New CArticle        ' Initialize values to empty
art.InitializeDefaultValues   ' Initialize values to default
29
ja72

誰かが検索でここに来た場合は、私もそうでした。代わりに、 StackOverFlow:VBAのコンストラクターに引数を渡す の答えを見るようにお勧めします

これは私の答えではありません、それは Bgusach からのものです。ここでは、便利な答えは単なるリンクではないので、ここに含めています。

VBAのコンストラクターに引数を渡す

ここに少しトリックがあります I'm 最近使用して良い結果をもたらします。 Bgusach は、VBAと頻繁に戦わなければならない人々と共有したいと思います。

1 .-各カスタムクラスにパブリック開始サブルーチンを実装します。私はすべてのクラスでInitiatePropertiesと呼んでいます。このメソッドは、コンストラクターに送信する引数を受け入れる必要があります。

2 .-ファクトリと呼ばれるモジュールを作成し、Wordの「作成」とクラスと同じ名前、同じ入力でパブリック関数を作成します。コンストラクタが必要とする引数。この関数は、クラスをインスタンス化し、ポイント(1)で説明した開始サブルーチンを呼び出して、受け取った引数を渡す必要があります。最後に、インスタンス化され開始されたメソッドを返しました。

例:

カスタムクラスEmployeeがあるとします。前の例のように、isは名前と年齢でインスタンス化する必要があります。

これはInitiatePropertiesメソッドです。 m_nameとm_ageは、設定するプライベートプロパティです。

Public Sub InitiateProperties(name as String, age as Integer)

    m_name = name
    m_age = age

End Sub

そして今ファクトリーモジュールで:

Public Function CreateEmployee(name as String, age as Integer) as Employee

    Dim employee_obj As Employee
    Set employee_obj = new Employee

    employee_obj.InitiateProperties name:=name, age:=age
    set CreateEmployee = employee_obj

End Function

そして最後に、従業員をインスタンス化する場合

Dim this_employee as Employee
Set this_employee = factory.CreateEmployee(name:="Johnny", age:=89)

複数のクラスがある場合に特に便利です。モジュールファクトリにそれぞれの関数を配置し、factory.CreateClassA(arguments)factoryを呼び出すだけでインスタンス化します.CreateClassB(other_arguments)など.

編集

Stenciが指摘したように、コンストラクター関数でローカル変数を作成しないようにすることで、terser構文で同じことを行うことができます。たとえば、CreateEmployee関数は次のように記述できます。

Public Function CreateEmployee(name as String, age as Integer) as Employee

    Set CreateEmployee = new Employee
    CreateEmployee.InitiateProperties name:=name, age:=age

End Function

どちらがいいですか。

0
ElderDelp