すでに 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
を返しますが、それは素晴らしいことですが、プロパティを使用して一度に割り当てる方法は?Let
firstName
lastName
補足: 特殊文字で区切られた単一の文字列を渡し、それを の本体内で分割してとの名前Let
を割り当てることができますfirst
last
が、それを忘れて、適切に処理しましょう...
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.
ていることを意味します... 私たちはすでに知っています - それはそれを引き起こしているプロパティですClass1
Let
プロパティにパラメーターを追加しました。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
間違いなくより便利です:)