"エレガント"なビジネスマンへの第一歩は、メールから★

# ビジネスのやり取りはエレガントに行いたい！

こんにちは、気が付けば今年もあと3週間、ここでの投稿も3回目になっていました。
<br>
近況はというと、12月は「師走」というだけあって、社内でも「年内に終わらせよう」を合言葉に、工事や契約やらがラストスパート。
対応しなければいけない作業や、メールがひっきりなしに飛んできます。ﾋﾟｺﾝｯ♪と届いたメールの開くと…、

### 「申し訳ありません、当方にて添付データが確認できないので、再送頂けますでしょうか。」<span>
 あっ・・・( ˙-˙ )

<br>
やってしまいました、添付漏れです。今年流行ったアニメのセリフを借りるならばまさに「ノットエレガント」。<br>
メールのターンが1ターン増えることで、誰も得をしない時間が増えてしまいました。<br>
しかも、相手は全く悪くないのに、「申し訳ありません」と謝らせてしまう始末。（実際に申し訳ない、と思っているかどうかはさておき…）
<br>


# 完成したもの
<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="ja" dir="ltr">エレガントにOutlookを使うために、ノットエレガントを止めてくれるコード書いてみた<a href="https://twitter.com/hashtag/protoout?src=hash&amp;ref_src=twsrc%5Etfw">#protoout</a> <a href="https://twitter.com/hashtag/ChatGPT?src=hash&amp;ref_src=twsrc%5Etfw">#ChatGPT</a> <a href="https://t.co/iPhsQSMHl8">pic.twitter.com/iPhsQSMHl8</a></p>&mdash; obatan (@obatan_aa) <a href="https://twitter.com/obatan_aa/status/1733794626321199514?ref_src=twsrc%5Etfw">December 10, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 動作内容
・本文中に「添付」の文言があるのに、添付ファイルがない場合に警告を表示する。

# 種明かし

実はこれ、開発に10分かかっていません！(Outlookの仕様を理解するまでに1時間かかっていますが…）
OutlookのVBAコードの画面はこちら
![VBAコード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3580275/a73688b4-0b51-434a-23cb-990a1e04dd17.png)
とってもシンプルなコードですよね？

```
Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
    ' メールアイテムであることを確認
    If TypeOf Item Is Outlook.mailItem Then
        Dim mailItem As Outlook.mailItem
        Set mailItem = Item

        ' メール本文に「添付」の文言があるか確認
        If InStr(1, mailItem.Body, "添付", vbTextCompare) > 0 Then
            ' 添付ファイルがない場合は警告を表示
            If mailItem.Attachments.Count = 0 Then
                Dim response As VbMsgBoxResult
                response = MsgBox("添付ファイルがありません。送信しますか？", vbExclamation + vbYesNo, "添付ファイルの確認")

                If response = vbNo Then
                    ' キャンセルボタンが押された場合は送信をキャンセル
                    Cancel = True

                    ' メールの作成画面に戻る
                    mailItem.Display
                End If
            End If
        End If
    End If
End Sub
```

# 作成の流れ
私が今回使用したのはChatGPT。
<details>
<summary>そもそもChatGPTは何ぞや…？という方へ</summary>

> ChatGPTは、OpenAIが開発した言語モデルの一種で、GPT（Generative Pre-trained Transformer）アーキテクチャに基づいています。GPTは、大規模なデータセットを用いて事前に訓練され、その後、様々な自然言語処理のタスクに対して応用可能な汎用的な言語モデルを提供します。
> ChatGPTは、特に対話型のタスクに適したバージョンであり、自然言語での質問応答、対話、文章生成などのタスクに使用できます。以下は、ChatGPTができるいくつかのことです：
・対話： ユーザーとの自然な対話を行うことができます。質問に答えたり、意見を述べたり、情報を提供したりします。
・質問応答： ユーザーからの質問に対して、適切な回答を生成することができます。
・文章生成： 特定のトピックに関する文章を生成することができます。これは、クリエイティブな文章や技術的な文書などに使用できます。
・言語理解： 自然言語の理解に基づいて、文章や質問の文脈を考慮して適切な応答を生成できます。
ただし、ChatGPTは事前に学習されたデータに基づいているため、その知識のカットオフは2022年1月であり、それ以降の情報や出来事には対応していません。
引用元：「ChatGPTに、ChatGPTとは？何ができるの？」と入力し、出力された返答
</details>
<br>

使い方は簡単、動画では私の作りたいコードを思ったそのまま
```
VBAのコードを書いて
・メール本文に「添付」の文言があるのに、添付ファイルがない場合は、送信ボタンを押下した際に、警告を表示する
```

<details>
<summary>0.一番最初に提示されたコード</summary>

```
Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
    ' メールアイテムであることを確認
    If TypeOf Item Is Outlook.MailItem Then
        Dim mailItem As Outlook.MailItem
        Set mailItem = Item

        ' メール本文に「添付」の文言があるか確認
        If InStr(1, mailItem.Body, "添付", vbTextCompare) > 0 Then
            ' 添付ファイルがない場合は警告を表示
            If mailItem.Attachments.Count = 0 Then
                MsgBox "添付ファイルがありません。送信しますか？", vbExclamation + vbYesNo, "添付ファイルの確認"
                If vbNo = MsgBoxResult Then
                    ' キャンセルボタンが押された場合は送信をキャンセル
                    Cancel = True
                End If
            End If
        End If
    End If
End Sub
```

<<details><summary>details</summary>

</details>


ここで一点注意事項ですが、
私が実装した後、撮影用に再度入力した結果、同じ文言で聞いたにも関わらず、返ってきた答えが違います。一期一会的要素もあるので、利用する際はご注意ください。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ChatGPTが動くとこんな感じ！結構サクサク動くからストレスフリーでよいね！<a href="https://twitter.com/hashtag/protoout?src=hash&amp;ref_src=twsrc%5Etfw">#protoout</a> <a href="https://twitter.com/hashtag/ChatGPT?src=hash&amp;ref_src=twsrc%5Etfw">#ChatGPT</a> <a href="https://t.co/U3OdgwShYa">pic.twitter.com/U3OdgwShYa</a></p>&mdash; obatan (@obatan_aa) <a href="https://twitter.com/obatan_aa/status/1733802179377656243?ref_src=twsrc%5Etfw">December 10, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

実装をしましたが、いくらChatGPTとはいえ、我々が実行したいことを正確に教えてあげないと、100点満点の回答は出てきません。少しずつ修正していきましょう。
<br>

#### 修正：「いいえ」を選ぶと作成画面ごと落ちる
「送信しますか？」の画面で「いいえ」を選択すると、作成画面ごと落ちてしまい、もう一回下書きからこのメールを開き直さないといけない仕様になっています。<br>正直、これはメンドクサイ。<br>
もう一度ChatGPTさんに
```
いいえを選択した場合に、メール作成画面に戻るようにする
```
と追加で質問すると、それを反映したコードを書いてくれます。

<details>
<summary>1.修正されたコード</summary>

```
Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
    ' メールアイテムであることを確認
    If TypeOf Item Is Outlook.MailItem Then
        Dim mailItem As Outlook.MailItem
        Set mailItem = Item

        ' メール本文に「添付」の文言があるか確認
        If InStr(1, mailItem.Body, "添付", vbTextCompare) > 0 Then
            ' 添付ファイルがない場合は警告を表示
            If mailItem.Attachments.Count = 0 Then
                Dim response As VbMsgBoxResult
                response = MsgBox("添付ファイルがありません。送信しますか？", vbExclamation + vbYesNo, "添付ファイルの確認")

                If response = vbNo Then
                    ' キャンセルボタンが押された場合は送信をキャンセル
                    Cancel = True

                    ' メールの作成画面に戻る
                    mailItem.Display
                End If
            End If
        End If
    End If
End Sub
```

</details>



# 同僚からのFB
試しに1人に使ってみてもらった。<br>実は、私が入社以前に全社で使用されていたメーラーではこの機能が標準搭載されていたらしく「これだよこれ、Outlookになくて何度失敗したか…」とぼそり。<br>「使ってみていい？」とのことだったが、ちょっとした課題があり…（下のセクションに続く）


# 今後の改善事項

### セキュリティ上の不都合
実装に伴い、VBAの動作に必要な「マクロ」を全て承認する状態で動かしています。<br>しかし、推奨される動作状態ではなく、水平展開しようもんならシステム部に目を付けられ大目玉を喰らう可能性があります。ユーザー側の権限が規制されない、自由で開かれたoffice365を維持させる為に、まだオープンには出来ません。
![トラスト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3580275/5037e87f-7665-2a41-80fa-6d4083d729b0.png)



### 必要以上に表示される可能性
「動作内容」に記載の通り、「添付」の文字が文章中にある場合警告表示をするようにしました。<br>そのため、返信元の文章に「添付」の文言がある場合も、添付ファイル漏れとして検知され警告が表示されます。<br>毎度毎度表示が出るのはどうなのか…、添付漏れメールを送る"ノットエレガント"なビジネスマンよりはマシかもしれませんが、本来の意図に反しているので、"エレガント"なコードへのバージョンアップが望まれます。

## 補足：マクロ…？ VBA…？な方へ

本記事はVBAの基礎的な知識を全て省略していますので、「全く分からないけど、やってみたい！」と思って頂いた方は、下記記事をご紹介させていただきます。

https://www.teijitaisya.com/outlook-macro/