アプリ版:「スタンプのみでお礼する」機能のリリースについて

前回質問の続きです。
https://oshiete.goo.ne.jp/qa/9407682.html
下記Propertyプロシージャにおける、プロシージャ名、内部変数、引数の関係について説明頂きました。
Private p_Name As String
Private p_Age As Long

'Property Let ステートメント
Public Property Let Name(str As String)
p_Name = str
End Property

説明自体は分かりましたが、これ、そのまま引数付メソッドとして使えませんか?
プロパティ名はあくまで名前だけで、実際の処理内容は中身の p_Name = strなのだから、中身を変えれば何でも出来るのではないか?それってメソッドと同じでしょ?

例1
Public Property Let Name(str As String)
p_Name=str
msgbox p_Name
End Property

例2
Public Sub Name(str As String)
p_Name = str
End Sub

Property Let Name(str As String)
Sub Name(str As String)
両者の違いは何でしょうか?

A 回答 (2件)

そのオブジェクトを使う側の記述方法が変わります。



プロパティ   a.Name = str または str = a.Name
プロシージャ  a.Name str1,str2,…
ファンクション str = a.Name(str1,str2,…)


プロパティ
・そのオブジェクトの属性(外からみれば見た目は内部変数)への代入や読み出しです。

プロシージャ(Sub)
・引数(str1,str2…)を一つではなく、無し、或いは二つ以上持つことができる。

ファンクション(Function)
・プロシージャに加え、何らかの処理結果を取得する。



イメージとしてプロパティは、オブジェクトの動作モードの設定
  例:Application.ScreenUpdating = False

プロシージャ、ファンクションは引数を与えて、それを元になにか動作(処理)をさせるという感じですか。
  例:MsgBox "こんにちは", vbInformation
    rc = MsgBox("処理を行いますか?", vbYesNo)


ある意味、引数一つのプロシージャと、プロパティへの値の代入は、外からみれば機能的な見た目は似ていますね。
    • good
    • 0
この回答へのお礼

ありがとうございます。
こうして使うものだと理解しておきます。

お礼日時:2016/09/16 04:18

Classオブジェクトについては、


メソッドが、Sub プロシージャ/Function プロシージャで
プロパティが、Property
と考えると分かりやすいです。

そして、Propertyプロシージャは、戻り値を取得せずに実行だけするということができません。Sub は、戻り値を返さないメソッドで、Functionは、戻り値を返すメソッドです。

プロパティが性質はを表し、メソッドが動的な働きを見せるわけです。

そもそも、今回のスタイルのクラスのコードというのは、カプセル化(隠蔽化)のためのコードですから、ややこしい、しかし、その意味が今ひとつはっきりしてこないというご指摘は正しいと思います。VBAでは、簡易に用いることがあるので、この手の方法を実際には使うことは少ないと思うからです。実際、たかが、Excel VBAでも、本格的にClassをオブジェクト化してしまうと、ちょっとした修正さえ手の施しようがありません。

>Property Let Name(str As String)
>Sub Name(str As String)
>両者の違いは何でしょうか?

クラス・オブジェクトとしては、プロパティとメソッドということになりますね。

ただし、VBAでは、このようなコードに出会うことは、滅多にありません。また、以下のように、Public ステートメントをつけることも少ないです。元のコードに合わせてアレンジしてみました。
Excel VBAでの、Class は、ほとんどイベントの設定に使うものだからです。

'//
Class1
'----------------------
Private p_Name As String
Private p_Age As Long

'Property Let ステートメント
Public Property Let Name(myp_Name As String)
p_Name = myp_Name
End Property

Public Property Get Name() As String
  'プロパティ
  Name = p_Name
End Property

Public Sub NameChecker()
 '半角の名前は不可とする メソッド
 If LenB(StrConv(p_Name, vbFromUnicode)) = Len(p_Name) Then
  Name = "err"
 End If
End Sub

'-------------
'標準モジュール

Dim myClass As New Class1
Sub TestNameCheck()
With myClass
  .Name = "WindFaller" ' "棚からぼたもち" '' 全角でないと通らない
  .NameChecker .Name
  Call TestOutcheck
End With
End Sub

Sub TestOutcheck()
MsgBox myClass.Name
End Sub

'画像は、プロパティとメソッドの違い
「エクセルVBA Property Let」の回答画像2
    • good
    • 0
この回答へのお礼

ありがとうございます。
Letはこうして使うものだと理解しておくことにします。

お礼日時:2016/09/16 04:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!