[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『Property Letで引数を複数にした場合の指定の仕方について』(jrw)
ググってもChatGPTでもよくわからなかったので質問させてください。
クラスのProperty Letで引数を複数にした場合の引数の渡し方についでです。
いつも引数が1つのProperty Letでは
MyClass.○○ = "A"
みたいな形で引数を渡しているのですが、複数の引数があるProperty Letにはどういった記述で渡せばよいのでしょうか?
自分でも色々試してみたのですが、上手く引数を複数渡せません。
Property Letに複数の引数を渡す時の記述方法についてどなたか解る方がいれば教えていただければ助かります。
宜しくお願い致します。
< 使用 Excel:Excel2019、使用 OS:Windows10 >
(tkit) 2023/04/07(金) 14:11:51
Private i(0 To 2) As Long Property Get testA(id As Long) As Long testA = i(id) End Property Property Let testA(id As Long, newValue As Long) i(id) = newValue End Property
Sub test() Debug.Print testA(0); testA(1); testA(2) testA(1) = 100 Debug.Print testA(0); testA(1); testA(2) End Sub
(白茶) 2023/04/07(金) 14:19:31
配列で渡すという手も・・・ CLASS1 Option Explicit Private v_ As Variant Public Property Let Add(ByVal v As Variant) v_ = v End Property Public Property Get Exec() As String Exec = Join(v_, "") End Property
標準モジュール Sub test() Dim cls As Class1 Set cls = New Class1 cls.Add = Array("A", "B", "C") MsgBox cls.Exec End Sub
どういう用途を考えているのか差し支えなければ教えてもらいたいですね。
(稲葉) 2023/04/07(金) 14:29:53
あー、そういう意味ですか。 引数ってマジでValueを複数一気に渡すつもりだったわけですね。
Private v(1 To 4, 1 To 3) As Long Property Get testB(arg1 As Long, arg2 As Long) As Long testB = v(arg1, arg2) End Property Property Let testB(arg1 As Long, arg2 As Long, newValue As Long) v(arg1, arg2) = newValue End Property Sub test2() Dim r As Long, c As Long Erase v For r = 1 To 4 For c = 1 To 3 testB(r, c) = (r - 1) * 3 + c Next Next For r = 1 To 4 Debug.Print testB(r, 1); testB(r, 2); testB(r, 3) Next End Sub
↑ていう感じに、arglistが複数の事かと思ったら...
わたしはそういう場合はメソッドで定義しますね。 例えば Topプロパティ,Leftプロパティ、Heightプロパティ、Widthプロパティをそれぞれ個々に定義した上で、 4つとも一気に設定できるMoveメソッドも定義しておく。 みたいな...
(白茶) 2023/04/07(金) 14:39:26
Private Total As Double
Property Let Add(ByVal CalcSymbol As String, ByVal Arg As Double) Select Case CalcSymbol Case "+": Total = Total + Arg Case "-": Total = Total - Arg Case "×", "*": Total = Total * Arg Case "÷", "/": If Arg <> 0 Then Total = Total / Arg End Select End Property
Property Get Answer() As Double Answer = Total End Property
標準モジュール
Sub Sample() Dim c As Class1 Set c = New Class1 With c .Add("+") = 10 .Add("-") = 3 .Add("*") = 8 .Add("÷") = 4 Debug.Print .Answer End With End Sub
実験してみました。
(火災報知器) 2023/04/07(金) 16:00:39
おお白茶さんの実験しているうちに面白そうな題材が・・・ 火災報知器さんのは明日遊びますー
白茶さんの提案的にはこんな感じです・・・かね? そのためのクラスオブジェクトだろうから、プロパティは複数を渡すよりかは 1:1なほうが使いやすい気がしました。
Option Explicit Type Rect Left As Long Top As Long Width As Long Height As Long End Type Private v As Rect Property Let Left(Left_ As Long) v.Left = Left_ End Property Property Let Top(Top_ As Long) v.Top = Top_ End Property Property Let Width(Width_ As Long) v.Width = Width_ End Property Property Let Height(Height_ As Long) v.Height = Height_ End Property Sub Move(Left_ As Long, Top_ As Long, Width_ As Long, Height_ As Long) v.Left = Left_ v.Top = Top_ v.Width = Width_ v.Height = Height_ End Sub Property Get Left() As Long Left = v.Left End Property Property Get Top() As Long Top = v.Top End Property Property Get Width() As Long Width = v.Width End Property Property Get Height() As Long Height = v.Height End Property Function GetMove() As Long() Dim x(3) As Long x(0) = v.Left x(1) = v.Top x(2) = v.Width x(3) = v.Height GetMove = x End Function Sub a() Dim w() As Long Left = 1 Top = 2 Width = 3 Height = 4 Debug.Print Left; Top; Width; Height Move 5, 6, 7, 8 w = GetMove Debug.Print w(0); w(1); w(2); w(3) End Sub (稲葉) 2023/04/07(金) 16:08:58
稲葉さん、配列のアイディアをありがとうございます。用途についてはクラス内の変数などの設定を複数個一気に変更できたらよいなぁと素人的に思った感じです。もしかすると私はクラスやPropertyLetに対する感覚が間違っているのかもしれません。
白茶さんコメントありがとうございます。わかりにくい質問ですみません。メソッドで定義する方法、参考にしてみます。
火災報知器さん、実験ありがとうございます。理解できるよう努めて参考にさせていただきたく思います。
みなさまの回答で自分が思ったことが一般的でないことがよくわりました。ありがとうございます。
みなさまが書いてくださるサンプルは自分が知らない便利なことが沢山つまっており、それを見ているだけでもとても勉強になり助かります。
追記:稲葉様、再度のコメントありがとうございます。しっかり読んで勉強させていただきます。
(jrw) 2023/04/07(金) 17:03:43
Propertyはいわゆるアクセサとしての「それらしい」使い方に特化したものですが、 本質的にはSubやFunctionと何ら変わらないと思いますので、 メソッド使った方が自然に表現できるならメソッド使えばイイと思います。
CollenctionのメンバなんてSubとFunctionだけでとっても潔しですよ。(もはや「かっこいい!」と感じる ^^;)
>クラスやPropertyLetに対する感覚が間違っているのかもしれません まぁ、こうだったら正しい みたいなのがあるのかどうか分かりませんし、 単純に「やりたい事に適ってるかどうか」での判断だと思います。
私なんかもクラス定義でしばしば「値」と「有効範囲」を管理する必要性に出くわします。 例えば .Value .Max .Min というメンバを持った何らかのクラスですね。
個々の属性はそれぞれに役割がありますから当然の様にそれぞれPropertyを定義しますけども、 互いに関連性の強い属性なので「きっと一気に設定したいシーンが出てくるな」と想像できます。
例) 1.有効範囲を設定 2.初期値を設定 ↓ 3.利用により値が変化 ↓ (場合によっては1に戻る)
だったら、1と2は[Reset]メソッド作った方が自然であろう みたいな。 かと言って、Maxだけ途中で変わる事や、有効範囲は変えずに2に戻る場合もあるから PropertyもPropertyでやはりあった方が便利。てか必要...
クラスのメンバにアクセスする手段を用途に応じて増やす。という感覚です。
(白茶) 2023/04/07(金) 18:44:49
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.