ExcelVBAを使用してChatGPT（API）で日報作成を簡単に！

# ちょっとめんどくさい業務を効率化したい

こんにちは。
金融業界でお仕事をしています、tomonaといいます。
高校野球と乃木坂46をこよなく愛する社会人です。


みなさん業務報告ってどうしていますか？
私の部署では在宅勤務の時は一日どんな業務を行ったか、
業務日報を作成しないといけないのですが、
すごく！というわけではないものの少しめんどくさい・・。
<Br>

そこで今流行りのChatGPTを使用して日報作ってもらおう！って
少し前から利用していたのですが、
毎回同じ質問するのめんどくさいな～って思っていたら！！
ExcelVBAとChatGPT-APIでとっても楽になることを発見！
<br>

さっそく作成してみたのでみなさんにも共有したいと思います。

# :robot:完成したもの

https://x.com/tomona_co/status/1733497529332023630?s=20


## :pencil2:利用した技術・素材

- Excel VBA
- [ChatGPT](https://chat.openai.com/)　



## :wrench:作り方

### ①ChatGPT-APIキーの取得

まず、OpenAIのAPIキーを取得する必要があります。
Googleで「ChatGPT API 発行」で検索すれば分かると思います。


<details>

<summary>参考資料こちら</summary>

- [【2023年最新】ChatGPTのAPIキー発行手順](https://ai-workstyle.com/gpt-apikey/)

- [OpenAIのChatGPTAPIでチャットボットを作成](https://www.a-c-japan.com/solution/chatgpt/chatgpt-api/)

</details>

:::note warn
 APIキーの取り扱いに注意！！
 ChatGPT-APIは共有は禁止されています。
 APIキーはコピー後安全な場所で保管してください。
:::



### ②ExcelVBAの設定

Excelを開いたら、「Alt+F11」を押して、挿入のタブから「標準モジュール」を選択します。その後、以下のマクロをコピーし貼り付けしてください。

<details>
<summary>マクロはこちら</summary>

```ruby
Option Explicit ' 変数宣言を厳密に行うためのオプション

' GPT-3 APIのエンドポイント
Const API_URL As String = "https://api.openai.com/v1/chat/completions"

Sub ApplyAddressCorrection()
    ' 変数宣言
    Dim apiKey As String           ' GPT-3 APIキー
    Dim temperature As Double      ' AIの応答のクリエイティブ度合いを示す数値
    Dim text As String             ' アドレスの入力テキスト
    Dim response As String         ' AIからの応答
    Dim responseArray() As String  ' 応答を改行で分割したものを格納する配列
    Dim ws As Worksheet            ' アクティブなシート
    Dim i As Long                  ' ループ用の変数
    
    ' アクティブなシートを取得
    Set ws = ActiveSheet
    
    ' 既存のデータをクリア
    ws.Range("B5").CurrentRegion.ClearContents
    
    ' APIキーを取得
    apiKey = Range("API").Value
    
    ' AIのクリエイティブ度合いを取得
    temperature = ws.Range("D3").Value
    
    ' アドレスを構築
    text = ws.Range("B2").Value & ws.Range("B3").Value
    text = "{""model"": ""gpt-3.5-turbo"", ""temperature"": " & temperature & ", ""max_tokens"": 2000" & ", ""messages"": [{""role"": ""user"", ""content"": """ & text & """}]}"
    
    ' GPT-3 APIにリクエストを送信し、応答を取得
    response = sendAPIRequest(API_URL, text, apiKey)
    
    ' 応答からアドレス部分を抽出し、B5セルに表示
    ws.Range("B5").Value = extractContent(response)
    
    ' 応答を改行で分割し、それぞれの行に表示
    response = extractContent(response)
    response = Replace(response, "\n", vbLf)
    
    ' "する" の場合は改行を追加
    If ws.Range("D5").Value = "する" Then response = Replace(response, "。", "。" & vbLf)
    
    ' 応答を行ごとに表示
    responseArray = Split(response, vbLf)
    For i = 0 To UBound(responseArray)
        ws.Range("B" & 5 + i).Value = responseArray(i)
    Next i
End Sub

Function sendAPIRequest(url As String, text As String, apiKey As String) As String
    ' GPT-3 APIにリクエストを送信する関数
    Dim request As Object
    Set request = CreateObject("MSXML2.XMLHTTP")
    
    ' HTTPリクエストの設定
    request.Open "POST", url, False
    request.setRequestHeader "Content-Type", "application/json"
    request.setRequestHeader "Authorization", "Bearer " & apiKey
    
    ' リクエスト送信
    request.send text
    
    ' レスポンスを返す
    sendAPIRequest = request.responseText
End Function

Function extractContent(response As String) As String
    ' 応答からアドレス部分を抽出する関数
    Dim startPos As Integer
    Dim endPos As Integer
    
    ' 特定の文字列をキーとしてアドレス部分を抽出
    startPos = InStr(1, response, """content"": """) + 12  ' VBAでjsonの扱いが困難のため特定の文字列をキーとしている
    endPos = InStr(startPos, response, """")
    extractContent = Mid(response, startPos, endPos - startPos)
End Function

```
</details>

![スクリーンショット 2023-12-09 223112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569361/8935cfe6-c2ca-3540-875b-06f7f142f425.png)

![スクリーンショット 2023-12-09 223233.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569361/feffd4e3-da11-8bcf-ff0b-e94017ad2576.png)


### ③Excelの設定

Sheet1に①で取得したAPIキーを貼り付けます。
![スクリーンショット 2023-12-09 223853.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569361/35deba43-2e55-187e-476a-100a1bc654bb.png)

APIキーを貼り付けしたセルに半角で「API」と名前を付けてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569361/6f07d395-ce76-5019-7957-8a1a1d2f73aa.png)

Sheet2に設定を行います。
セルB2の情報とセルB3の内容から、ChatGPTが返却してくれます。
例えば、セルB2に「日本語から英訳してください。」と記載することで、英語で日報を作成することも可能です。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569361/0faf99ef-bfa5-88c8-938f-7e20f0ef1523.png)

:::note info
Ｄ列のセルの設定は任意です。
Temperatureとは確率分布にかかわる値でここでは0.5で設定しています。
:::

最後にボタンを作成します。
Excelの開発タブから、挿入→ボタンを選択し作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569361/8cf32b01-9379-ab93-5ef8-740678ac36d3.png)


# :girl_tone1:参考資料

https://youtu.be/bTriopQ_bQA?si=KoNNgIrwyJFCnQYo

https://qiita.com/suzuki_sh/items/8e449d231bb2f09a510c

# :cloud_tornado:今回の振り返り

毎回質問作るのめんどくさいな～から、
ExcelVBAでこんなに楽に日報が作れるなんて、驚きました。
これを使うことで、5分は時間短縮できます！！
<br>

つまり・・
**5分×20日/月=100分**

これだけで月に100分の時間効率になるなんて正直恐ろしい・・。
ということはメールを自動送信するようにすれば更なる時間短縮に繋がるということ・・（すごい！！）


<br>
<br>

今回参考資料として載せている動画がとても分かりやすかったのですが、
それに加えてマクロを皆さんにも分かりやすくするためにChatGPTの力をお借りして分かりやすく編集してもらいました。
![スクリーンショット 2023-12-13 223753.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569361/64dfff79-8877-35a8-5d4f-c51d5009bd5c.png)



<br>

今回は、週末に作成して記事を書いたので職場の同僚には使ってもらっていませんが、週明けに見せて感想をもらおうと思います！！
<br>

### :woman:同僚に使ってもらってみた（12/13追記）

週明けに同僚に使ってもらいました！
おお～！！という反応を期待して、使ってもらったものの反応はいまいち・・。
<br>
この程度だったら自分で入力するし、そもそも文章書くのにそんなに負担を感じていないな～と言われてしまいました。
<br>
あまりどころか全然心に刺さらずで悲しかったです・・。
今回3人にデモンストレーションとExcelを触ってもらいましたが、ChatGPTというツールを使っている、ということに対する「おっ！」という反応はありましたが、実際に「使いたい！」や「こうやって改善すれば使えるのでは？」といった回答はもらえませんでした。
<br>

今まで改善できるような反応をもらっていただけに今回の空振りはショックが大きかったです。ターゲットを変えて、もう少しだけ他の人にも見てもらおうと思います。








<br>
<br>
<br>

皆さんの業務効率化の参考になれば嬉しいです。
ここまで読んでくださってありがとうございました！！