ExcelのVBA初心者がChatGPT先生に師事した所感

# 1. はじめに

前々から興味はあったExcelのマクロやVBA。しかし日々のあれこれに追われ、少しかじったものの本格的な勉強は先延ばしに。それがこの間までの私の現状でした。似たような境遇の方は多いのではないかと思います。

そんな折に、彗星の如く現れたChatGPT先生。
私は好機を逃すまいと、VBAコードについて教えを乞いました。

# 2. ChatGPTとは
巷で話題ChatGPTですが、念のため説明します。
__ChatGPT__ とはアメリカの人工知能（AI）研究所「OpenAI」の開発した対話型AIチャットボットであり、話しかけるような文体で質問や依頼をすると、回答を作成してくれるサービスです。入力されたデータをもとに、新しいデータを生成するAI技術 __「ジェネレーティブAI」__ の代表格といっても過言ではないでしょう。
長文の要約や理解度を問う問題の作成、小説の執筆、統計的処理など、様々な分野での活躍の可能性がある一方、フェイクニュースの流布に利用される危険性なども示唆されています。また、ホワイトカラーの仕事を奪うどころかChatGPTの真似をして人が質問に回答するサービスまで出てくるなど、よくわからない影響も社会に与えています。

と、私がつらつら書きましたが、ChatGPT自身にも答えてもらいましょう。

■私:
___「ChatGPTって、なんじゃらほい」___

---
__■ChatGPT:__
こんにちは！ChatGPTは、OpenAIによってトレーニングされた自然言語処理の人工知能アシスタントです。GPT-3.5アーキテクチャを使用しており、多岐にわたるトピックについての情報を持っています。何かお困りのことや質問があれば、いつでもお聞きください！

---

・・・「なんじゃらほい」とかいう死語（？）にも的確に対応するあたり、シンギュラリティ(技術的特異点；AIが人類の知能を超える転換点)の足音が聞こえますね（？）
メールアドレスや電話番号の登録でアカウントを作成すれば無料で利用できる点も、人気の理由でしょう。

■私:
___「弱点はある？」___

---
__■ChatGPT:__
ChatGPTは非常に高度な自然言語処理技術を使用しており、多くの場合、人間との会話で非常に正確かつ適切な回答を提供できます。しかし、以下のようないくつかの弱点があります：

コンテキストを把握するのが苦手：ChatGPTは、回答を生成する際に前の会話の文脈を考慮しますが、時には正確なコンテキストを理解することができない場合があります。

偏見を持ってしまうことがある：ChatGPTは大量のデータを使用して学習していますが、その中には偏見が含まれている可能性があります。そのため、ChatGPTが回答する情報には偏見が含まれる可能性があります。

機械的な回答になることがある：ChatGPTは、決まったルールに基づいて回答を生成するため、時には機械的な回答を提供してしまうことがあります。

以上が、ChatGPTの一般的な弱点です。しかし、OpenAIは常にシステムの改善に取り組んでおり、これらの問題に対処するために努力しています。

---

・・・といった具合に、それまでの対話の内容を流れを汲んで、「察して」くれます。但し1訊くと10とは言わないまでも3～7くらいは答えてくれるので、もし貴方が「ChatGPTは話が長いな」と感じたとしても、そこまでは察してくれなそうです。先回りして「端的に回答して」「3点ほど教えてください」などと投げかける必要があります。
![ChatGPTキャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2566746/3661e87e-a1af-a2bf-0ca5-732c3600f55f.png)


# 3. 本題：ExcelのVBAについて質問してみた。
■私:
___「A1セルに入力した値をB列の上から検索して最初にヒットした行番号を
　　A2セルに表示するExcelのVBAを作成して」___

---
__■ChatGPT:__
以下は、A1セルに入力した値をB列の上から検索して最初にヒットした行番号を
A2セルに表示するExcelのVBAコードの例です。

```
Sub SearchAndDisplay()
    ' A1セルに入力された値を取得
    Dim searchValue As String
    searchValue = Range("A1").Value
    
    ' B列を検索して最初にヒットした行番号を取得
    Dim firstMatch As Long
    firstMatch = 0
    Dim i As Long
    For i = 1 To Cells(Rows.Count, "B").End(xlUp).Row
        If Cells(i, "B").Value = searchValue Then
            firstMatch = i
            Exit For
        End If
    Next i
    
    ' 結果をA2セルに表示
    Range("A2").Value = firstMatch
End Sub
```
__■ChatGPT:__
このコードは、まずA1セルに入力された値を取得し、その後、B列を上から順に検索して、最初にA1セルの値に一致するセルを見つけたら、その行番号を変数firstMatchに格納します。そして、最後に、A2セルにfirstMatchの値を表示します。

このコードは、Subブロック内に記述されています。SubはVBAの手続きを定義するためのキーワードであり、この場合、Excelのマクロを定義しています。マクロは、Excelの機能の1つであり、一連の手順を自動化するために使用できます。このコードを使用するには、ExcelのVisual Basic Editorを開き、新しいモジュールを作成し、このコードを貼り付けて実行する必要があります。

---
■私:
___「Excelのvbaで、Dictionaryのキーを文字列の先頭一致を使用して指定する方法を教えてください。」___

---
__■ChatGPT:__
Dictionaryのキーを文字列の先頭一致で指定するには、Keysプロパティを使います。

以下のコードは、Dictionaryオブジェクトdictに対して、キーの先頭が指定した文字列strである要素の値を取得する例です。
```
Dim dict As New Dictionary
' 例として、Dictionaryにキーと値を追加します。
dict.Add "apple", "りんご"
dict.Add "banana", "バナナ"
dict.Add "cherry", "さくらんぼ"

Dim str As String
str = "b" ' 先頭一致で指定したい文字列

' 先頭が指定した文字列であるキーを取得し、該当する要素の値を取得します。
For Each key In dict.Keys
    If Left(key, Len(str)) = str Then
        MsgBox dict(key)
        Exit For
    End If
Next

```
__■ChatGPT:__
この例では、Keysプロパティを使ってDictionaryオブジェクトのキーの一覧を取得し、Left関数を使ってキーの先頭から指定した文字数分の文字列を取得しています。そして、If文を使って取得した文字列が指定した文字列と一致しているかどうかを確認し、一致している場合は該当するキーの値を取得しています。

---
・・・といった具合に、コードの生成とその解説をしてくれます！！

# 4. 所感
コードのひな型はある程度の精度で作成してくれます。実現したい処理に合わせてセルやシート名を具体的に指定すれば、即使用できるコードを作成してくれる点は、素晴らしいですね！

但し2つ目の例のように、そのままでは動作しないコードが生成されることもあるので、初心者に対する罠になりかねません。（そもそもMicrosoft scripting runtimeを参照設定するなりCreateObject関数を使用するなりしないとDictionaryが機能しない）

とは言え、そこで何が間違っているかを考えることでスキルアップにつながります。回答に含まれる知らない用語をググったり、ググって出てきた知らない機能の使用例をChatGPTに聞いたりする中で知識を深めることができます。
また、何から手を付けていいかわからない場合にはそのまま思いを吐露すれば、足がかりを提示してくれるので、上手に使えば強力なサポートとなることでしょう。

![ChatGPTキャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2566746/1a8f2af5-5cce-01d2-51c7-26468f67f680.png)

名前を間違われようが気にするそぶりも見せない。
我々人間もAIのように大らかでありたいものですね。