Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Microsoft 365)
シートからの質問をユーザーフォームに切り替える方法について
投稿日時: 23/04/27 16:54:18
投稿者: takatada72

お世話になります。
コードの理解が乏しくご確認をお願いしたいと思います。
下記のようにChatGPTに質問をして返信するものをネットで見つけて
コードをコピーしました。
 
こちらの内容をUserForm1から、質問と返信を記載できるようにしたいと
考えているのですが、下記のコードのどこを変えればよいのかが分かりません。
ご指導頂けないでしょうか
質問するTextBox1の設置箇所はわかりましたが、返信のためのTextBox2をどの
ようにコードへ反映するのかがわかりません。
 
お忙しいとは思いますが宜しくお願い致します。
 
 
フォーム名:UserForm1
質問を書き込むテキストボックス:TextBox1 
ChatGPTからの回答はこちらにしたい:TextBox2
 
●チャットGPTメモ
  Dim APIKey As String
    Dim strTextToPredict As String
    Dim strRequestBody, apiUrl, intCount As String
    Dim strResponse As String
    Dim strModel As String
    Dim temp As Variant
    Dim temp2, objhttp As Variant
    Dim i As Integer
    Dim intMaxTokens As Integer
  
    'APIキーを入力します。
    APIKey = "個人用APIキー"
     
    'ChatGPTのAPIから出力される最大文字数を指定します。
    intMaxTokens = 1000
     
    'ChatGPT APIのモデルを指定します。
    strModel = "text-davinci-003"
  
    'ChatGPTへの質問内容を取得します。
    strTextToPredict = TextBox1
  
    'リクエスト先のURLを設定します。
    apiUrl = "https://api.openai.com/v1/completions"
     
    'XMLHTTPオブジェクトをセットします。
    Set objhttp = CreateObject("MSXML2.XMLHTTP")
     
    With objhttp
 
        'リクエストのヘッダーを設定します。
        .Open "POST", apiUrl, False
        .setRequestHeader "Content-Type", "application/json"
        .setRequestHeader "Authorization", "Bearer " & APIKey
      
        ' リクエスト文を作成します。
        strRequestBody = "{""model"":""" & strModel & """, ""prompt"":""" & strTextToPredict & """, ""max_tokens"":" & intMaxTokens & ", ""temperature"":0.5, ""top_p"":1}"
         
        'リクエストを送信します。
        .send strRequestBody
         
        'APIからのレスポンスが返るまで待ちます。
        Do While .readyState <> 4
            DoEvents
        Loop
 
        'レスポンス情報をデバッグします。不要であれば削除してください。
        'Debug.Print .responseText
      
        'レスポンスのテキスト情報をExcel出力用変数に代入します。
        strResponse = .responseText
     
    End With
    クリア
    Range("B3:B100").Clear
     
    'Json形式のデータの内回答テキストがある位置から分割します。
    temp = Split(strResponse, "\n\n")
     
    '配列数を取得します。
    intCount = UBound(temp)
 
    '配列分処理を繰り返します。
    For i = 1 To intCount
         
        If i = intCount Then
            '最後の回答をセルに出力します。
            temp2 = Split(temp(i), """,""")
            Cells(i + 2, 2) = Replace(Replace(temp2(0), "\n", Chr(10)), "\", "")
        Else
            '最後の回答以外をセルに出力します。
            Cells(i + 2, 2) = Replace(Replace(temp(i), "\n", Chr(10)), "\", "")
        End If
         
    Next i
    Dim 最終行, AA As Integer
    最終行 = Cells(Rows.Count, 2).End(xlUp).Row
    For AA = 2 To 最終行
    Cells(AA, 2).Interior.Color = RGB(226, 239, 218)
    Next AA
    Range("B:B").WrapText = True
    MsgBox "回答が終わりました。"
   
If Range("D2") = "True" Then
     最終行 = Cells(Rows.Count, 2).End(xlUp).Row
For i = 3 To 最終行
 Application.Speech.Speak Cells(i, 2), True
 Next i
  
 End If
 

回答
投稿日時: 23/04/27 17:26:49
投稿者: WinArrow

引用:

返信のためのTextBox2をどの
ようにコードへ反映するのかがわかりません。

 
単純にいえば
Cells(i + 2, 2)
をTextBox2に変えるだけですが。
TextBox2は1つでよいのでしょうか?

回答
投稿日時: 23/04/27 19:49:32
投稿者: simple

# 今どきの質問ですね。
 
既に回答があったとおりですが、TextBox2に書き込むなら、
下記のような感じじゃないですか?

    Dim myText As String
    
    '配列分処理を繰り返します。
    For i = 1 To intCount
        If i = intCount Then
            '最後の回答をセルに出力します。
            temp2 = Split(temp(i), """,""")
            myText = myText & Replace(Replace(temp2(0), "\n", Chr(10)), "\", "")
        Else
            '最後の回答以外をセルに出力します。
            myText = myText & Replace(Replace(temp(i), "\n", Chr(10)), "\", "") & vbLf
        End If
    Next i
    TextBox2 = myText
# この質問自体をChatGPTに質問したら回答がもらえたのでは?
ちなみに、元のコードの変数宣言のしかたが甘いです。
すべての変数に型をつけないと。
Dim strRequestBody, apiUrl, intCount As String
intCount As Stringがおかしいし、
strRequestBody, apiUrlには、それぞれに As Stringとしないといけないでしょう。
(すべてを見た訳じゃないです。)

投稿日時: 23/04/28 08:41:27
投稿者: takatada72

WinArrowさん simpleさん 早速のご回答をありがとうございました。
 
WinArrowさんの回答ですが、下記になります。
TextBox1は、質問用で
TextBox2は、GPTからの回答を表示させるテキストボックスで考えております。
各ボックスは、1つづつになります。回答あってますか?
 
simpleさんの質問のGPTに質問すればとありましたが、私の質問の最初にも書かせて
頂いたようにVBAが乏しいため、どのように質問してよいのかがわかりませんでした。
ただ、単に、エラーが出たことに対して、質問して行ったのですが、長くなりすぎて、
収集がつかなかったのです。すみません。
 
 
本日に、確認をとらせて頂きたいと思っております。
 
引き続き宜しくお願い致します。

投稿日時: 23/04/28 09:30:46
投稿者: takatada72

WinArrowさん
報告になります。
 
Cells(i + 2, 2)をTextBox2に変更しただけで、TextBox2に表示されるようになりました。
あとは、TextBox2の表示方法だけになりました。
 
simpleさん
報告になります。
Dim 変数名 AS の後のデータ型については正しく行う予定です。
 
下記の部分をsimpleさんが教えて頂いたように変更をしました。
実行してみると、TextBox2には、一行表示になりました。ただ、
テキストに貼り付けると、ちゃんと、一覧表示になっていました。
TextBox2の表示も一覧にできるのでしょうか?
 

 
  '配列分処理を繰り返します。
    For i = 1 To intCount
         
        If i = intCount Then
            '最後の回答をセルに出力します。
            temp2 = Split(temp(i), """,""")
            Cells(i + 2, 2) = Replace(Replace(temp2(0), "\n", Chr(10)), "\", "")
        Else
            '最後の回答以外をセルに出力します。
            Cells(i + 2, 2) = Replace(Replace(temp(i), "\n", Chr(10)), "\", "")
        End If
         
    Next i

        ↓↓↓↓↓↓↓
  Dim myText As String
   '配列分処理を繰り返します。
    For i = 1 To intCount
        If i = intCount Then
            '最後の回答をセルに出力します。
            temp2 = Split(temp(i), """,""")
            myText = myText & Replace(Replace(temp2(0), "\n", Chr(10)), "\", "")
        Else
            '最後の回答以外をセルに出力します。
            myText = myText & Replace(Replace(temp(i), "\n", Chr(10)), "\", "") & vbLf
        End If
    Next i
    TextBox2 = myText

 
どのようにすれば、 TextBox2にも一覧で表示できるようになりますでしょうか
引き続き、ご指導頂けると幸いです。
 
GPTへの質問は、下記の内容になります。
「日本のアニメの中で中国の人たちが好きになってくれたアニメを一覧で教えて」
※回答の中に、各アニメの最後に音符のようなマークが出ていました。あれは、何でしょうか
改行を意味するものでしょうか
 
お忙しいとは思いますが宜しくお願い致します。

投稿日時: 23/04/28 09:46:25
投稿者: takatada72

お疲れさまです。
下記の一文を加えることで、一覧表示になりました。
ありがとうございました。 無事に解決しました。
  TextBox2.MultiLine = True