[[20230331164541]] 『ChatGPTがVBAでクラスのイニシャライズに引数は設』(jjjjjj) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ChatGPTがVBAでクラスのイニシャライズに引数は設定できるといいますが本当ですか?』(jjjjjj)

VBAでクラスのイニシャライズに引数を設定するとエラーになるので、『VBA クラス イニシャライズ 引数』で検索するとイニシャライズに引数は渡せないという結論のページばかりでてきます。
しかし、ChatGPTに『VBAではコンストラクタに引数を渡すことができない。ということで間違いないですか?』と聞くと、

VBA においては、コンストラクタという形式的な概念はありません。代わりに、クラスのイニシャライズ時に Class_Initialize イベントプロシージャを使用して、クラスの初期化処理を実行します。クラスのイニシャライズ時に引数を渡すことはできますが、明示的に宣言する必要があります。具体的には、Class_Initialize イベントプロシージャの引数として宣言することができます。以下は、引数を渡す場合の例です。

vbnet
Copy code
' MyClass クラスの定義
Private m_value As Integer

Private Sub Class_Initialize(ByVal value As Integer)

    m_value = value
End Sub

' クラスのインスタンス化と初期化
Dim myObj As New MyClass(123)
このように、Class_Initialize イベントプロシージャの引数に渡したい値を指定し、クラスのインスタンス化時に引数を渡すことができます。ただし、注意点としては、クラスのインスタンス化時に引数を渡す場合は、必ず Class_Initialize イベントプロシージャの引数として宣言する必要があります。

と、サンプル付きで返してきますが、いまいち理解できていないのかうまくいきません。
実際のところ、クラスのイニシャライズに引数は設定できるのでしょうか?

< 使用 Excel:Excel2019、使用 OS:Windows10 >


 できないです。
 コンパイルすらできないので、自分で試してください。

(稲葉) 2023/03/31(金) 17:10:10


ググったり色々試しても無理だったのにChatGPTは何回聞いても明示したらできるの一点張りだったので詳しい人が多そうなここで聞いてみたしだいです。

稲葉さんご返信ありがとうございました。

(jjjjjj) 2023/03/31(金) 17:18:51


 無理やり参照させることはできるけど・・・

 'ThisWorkBookモジュール
 Public con As String

 'Class1モジュール
 Private Sub Class_Initialize()
     MsgBox ThisWorkbook.con
 End Sub

 '標準モジュール
 Sub test()
     ThisWorkbook.con = "test"
     Dim mycls As Class1
     Set mycls = New Class1
 End Sub

 ChatGPTに限らず、自分の知識がないとAIって使いこなせないですよね。

(稲葉) 2023/03/31(金) 17:29:58


 「エクセルVBAで、あるクラスをイニシャライズするとき、引数を渡せますか?」

 と EdgeのBingで興味本位に聞いてみたら、こんなのが返ってきました。

 According to a Stack Overflow post,
 it is not possible to pass parameters to a class at initialization time in VBA. 
 However, you can use a workaround by creating a public method 
that takes arguments and then call it after creating an instance of the class. 

 Here is an example of how you can do this:

 ' Class module
 Private m_Name As String

 Public Sub Init(ByVal Name As String)
     m_Name = Name
 End Sub

 ' Standard module
 Sub Test()
     Dim obj As New MyClass
     obj.Init "John"
 End Sub

 ※Stack Overflowと言うQ&Aサイトに9年前に上がった質問と同趣旨だったので、
  そこの回答をまんま拝借してきたらしい。
 (初めはAIがコードを創作したのかと思ってビックリした。)
  (まぁ、多かれ少なかれ、やっていることはそんな類のもんなのかもです)

(半平太) 2023/03/31(金) 23:52:59


 そういえばBingもopen ai導入してましたね
 なんだかんだここの回答者がやってる事を検証吹っ飛ばしてやってるようなもんなんですかね
(稲葉) 2023/04/01(土) 06:02:52

 それにしても、ChatGPTの回答が「結論としては」お粗末すぎますよね。

 そこで、そっちにも同じ質問をしてみましたが、やはり

 「はい、Excel VBAのクラスには引数を渡すことができます。」

 と返してきました。そこで、

 「According to a Stack Overflow post、it is not possible to pass parameters to a class at
 initialization time in VBA. Do you insist the comment is incorrect ?」

 と訊いてみた。すると

 「I apologize for the confusion in my previous answer. You are correct that it is not possible to
 pass parameters to a class at initialization time in VBA.・・・」

 と謝ってきました。

 さて、彼はこの経験を学習して、今後、同種質問があった場合、正答するのかどうか?
 ChatGPT「3」なので、2021年9月以前の経験にないから、同じ誤答をするんですかね。

(半平太) 2023/04/01(土) 08:32:38


なるほど。
みなさま検証とご意見ありがとうございました。
(jjjjjj) 2023/04/04(火) 17:27:49

https://00m.in/U0HPn
(A) 2023/04/04(火) 18:36:01

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.