12

これまでのところ、クラスモジュールでLetプロパティを使用することについての私の理解は、次のようにクラスモジュールで設定することです。

Dim pName as String
Public Property Let Name(Value As String)
    pName = Value
End Property

そして、このクラスのオブジェクトを作成した後、次のようにこのプロパティを設定できます。

MyObject.Name = "Larry"



質問:クラスプロパティに複数の引数を入力することは可能ですか?例えば:

Dim pFirstName as String, pLastName as String
Public Property Let Name(FirstName As String, LastName As String)
    pFirstName = FirstName
    pLastName = LastName
End Property

次に、このプロパティをクラスの外に設定するにはどうすればよいですか?

MyObject.Name = ??

それとも、これは単純に不可能ですか?

4

3 に答える 3

19

すでに 2 つの回避策があることは承知していますが、この質問が多くのビューを受け取っていることから、元の質問に回答することは試してみる価値があると思いました。

への答え

VBAのLetプロパティで複数の引数を持つことは可能ですか?

はい!それが可能だ。

まず、GET プロパティについて説明します。これがClass1

Private firstName as String
Private lastName as String

Public Property Get Name() As String
    Name = firstName & " " & lastName
End Property

プロパティは完全な名前Nameを返しますが、それは素晴らしいことですが、プロパティを使用して一度に割り当てる方法は?LetfirstNamelastName

補足: 特殊文字で区切られた単一の文字列を渡し、それを の本体内で分割してとの名前Letを割り当てることができますfirstlast が、それを忘れて、適切に処理しましょう...

OK、VBA ではLet、現在のセットアップの既定のプロパティは 1 つのパラメーターを取り、それを姓または名のいずれかに割り当てます...

何かのようなもの:

Public Property Let Name(value As String)
    firstName = value
End Property

ルール: はGetパラメーターをとらず、 はパラメーターLetを 1 つ受け取ります。Getは基になる値を返しますが、それが表すデータに割り当てるためにどこかLetから値を取得する必要があるため、これは非常に論理的です。この時点で、プロパティが記号 ieを介して割り当てられることを覚えておく価値があります。Let=myObject.Name = "IdOnKnuu"

上記のルールに一貫性を保つ場合、理論的にはに 1 つのパラメータを追加し、 にもう 1 つ追加GetできるはずLetです。

Let忘れて-今はコメントアウトしてGet-プロパティにパラメータを追加しましょう。

Private firstName As String
Private lastName As String

Public Property Get Name(first As String) As String
    Name = firstName & " " & lastName
End Property

'Public Property Let Name(value As String)
'    firstName = value
'End Property

Module1インスタンスの作成Class1とタイプに戻りますc.Name(

ここに画像の説明を入力

ああ、インテリセンスは何かを期待していますか? 素晴らしい!

この時点で、私たちのGetプロパティfirst + last は両方とも現時点で空であるということを理解する価値があります。そのため、何を渡そうとしているかに関係なくc.Name()、空の文字列が返されます。

Letでは、プロパティのコメントを外して微調整しましょう...

サイド ノード: に戻ってModule1入力し、Intelli-Sense が得られない場合は、何かが壊れc.ていることを意味します... 私たちはすでに知っています - それはそれを引き起こしているプロパティですClass1Let

プロパティにパラメーターを追加しました。Getプロパティで同じことをしましょうLet...

Public Property Let Name(first As String, value As String)
    firstName = value
End Property

に戻って、プロパティModule1を使用してみましょう。Let

Let以前にプロパティをどのように使用したか覚えていますか? 値を割り当てる必要がありました

c.Name = "John"

しかし今、あなたのLetプロパティは追加のパラメータを期待していますfirst as String

これを試してみませんか:

c.Name("John") = "Smith"

おい!コンパイルして実行します(簡単F5

よし、結果をチェックしよう!

Debug.print c.Name("John")

うーん...それSmithはイミディエイト ウィンドウ ( Ctrl+ G) にのみ表示されます... まさに私たちが探していたものではありません....

プロパティに戻ると、Let引数を介して 2 つの値を取得していることに気付きましたが、そのうちの 1 つしか使用していません。関数には 2 つの異なる値が入っていますね。firstName最初のものを として扱い、 2番目のものをとして扱いましょうlastName

Public Property Let Name(first As String, last As String)
    firstName = first
    lastName = last
End Property

に戻るModule1

Sub Main()

    Dim c As New Class1
    
    c.Name("John") = "Smith"

    Debug.Print c.Name("John")
    
End Sub

現在のコードを再実行すると、必要なものが得られます... John Smithが出力されますが、待ってください!!! フルネームを取得するためにファーストネームを渡す必要があるのはなぜですか?

ハ!これの秘訣は、両方のプロパティの最初のパラメーターを作成することですOptional

要約すると、コード:

Class1.cls

Private firstName As String
Private lastName As String

Public Property Get Name(Optional first As String) As String
    Name = firstName & " " & lastName
End Property

Public Property Let Name(Optional first As String, last As String)
    firstName = first
    lastName = last
End Property

Module1.bas

Sub Main()

    Dim c As New Class1
    
    c.Name("John") = "Smith"

    Debug.Print c.Name ' prints John Smith
    
End Sub

したがって、基本的に、VBA ではプロパティを介して 2 つ (またはそれ以上) の値を割り当てることができます。Let少し頭を悩ませるかもしれないのはその構文ですが、この回答での私の説明が、物事がどこから来て、その理由を理解するのに役立つことを願っています.

Getプロパティはオプションのパラメータを取ります- これは実際には単なるダミー パラメータです ... プロパティ内のどこにも使用されていませんGetが、目的のLet署名を取得し、それに 2 つのパラメータを渡すことができます。また、覚えやすいc.Name構文を付与します。

呼び出し

Debug.Print c.Name("first")

ただし、"first"パラメーターはダミーのように機能するだけで、実際の基になるデータには影響しません。これはダミーであり、実際のデータには影響しません。ダンプして使用します。

Debug.print c.Name

間違いなくより便利です:)

于 2014-10-21T13:40:51.073 に答える
9

コメントによると、このロジックをカプセル化したい場合は、以下のようなものを使用できます。

以下に、サブと関数が含まれます。この関数は Person オブジェクトを返します。

Public Sub testing()

    Dim t As Person

    Set t = PersonData("John", "Smith")

End Sub


Public Function PersonData(firstName As String, lastName As String) As Person

    Dim p As New Person

    p.firstName = firstName
    p.lastName = lastName

    Set PersonData = p

End Function

人物クラス:

Dim pFirstName As String, pLastName As String

Public Property Let FirstName(FirstName As String)
    pFirstName = FirstName
End Property

Public Property Get FirstName() As String
    FirstName = pFirstName
End Property

Public Property Let LastName(LastName As String)
    pLastName = LastName
End Property

Public Property Get LastName() As String
    LastName = pLastName
End Property
于 2012-12-11T16:07:29.953 に答える