【詳細解説】Outlookの一斉送信をChatGPTでVBA化!コードを読んでVBAを理解しよう!

ChatGPT

ChatGPTでコード作成はできたけど、機能追加がうまくいかない。
コピペで動くVBAコードを見つけ動くけど、使い勝手が悪い。

昔からあるVBAが使いにくいのに、直し方が分からない。

最近ではVBAの知識がなくても、VBAを作成することができるようになってきました。VBAのコピペサイトやChatGPTなど、VBA作成の手助けをしてくれるものはたくさんあるので、時短の為にも積極的に活用してほしいと思っています。

ただこういったVBAの詳細が分からず、使いにくいのに無理やり使ってるということはありませんでしょうか。

こんにちは! 効率化大全管理人の犬井ワンです。

この記事では、Outlookの一斉送信のコードの詳細解説をしていきます。以前ChatGPTで作成したコードを参考に、一行ずつコードの意味を解説していきます。

コードを一行ずつ読み解くことは、VBAを学ぶ上で最も効果的な方法です。

是非、この記事を参考にしてみてください!

①元のコード

元となるコードは、以前ChatGPTを使って作成したものとなります。ChatGPTを使った作成方法や、最低限の使用方法については、以下ページで解説をしています。

【元コード】

Sub SendEmail()
    Dim olApp As Outlook.Application
    Dim olMail As Outlook.MailItem
    Dim ws As Worksheet
    Dim lRow As Long
    Dim strto As String, strcc As String, strbcc As String
    Dim strsub As String, strbody As String

    'Outlookのアプリケーションを起動
    Set olApp = New Outlook.Application

    'メール送信リストが記載されたシートを設定
    Set ws = ThisWorkbook.Sheets("Sheet1")

    '最終行を取得
    lRow = ws.Cells(Rows.Count, 1).End(xlDown).Row

    '1行ずつデータを取得し、メールを送信
    For i = 2 To lRow
        '宛先
        strto = ws.Cells(i, 1).Value
        'CC
        strcc = ws.Cells(i, 2).Value
        '件名
        strsub = ws.Cells(i, 3).Value
        '本文
        strbody = ws.Cells(i, 4).Value

        'メールを作成
        Set olMail = olApp.CreateItem(olMailItem)

        '送信先、CC、件名、本文を設定
        With olMail
            .To = strto
            .CC = strcc
            .Subject = strsub
            .Body = strbody
            .Display 'メールを表示
            '.Send '自動で送信する場合はコメントアウトを外す
        End With

        'オブジェクトを解放
        Set olMail = Nothing
    Next i

    'Outlookのアプリケーションを終了
    olApp.Quit

    'オブジェクトを解放
    Set olApp = Nothing

End Sub

ネットで公開されているコードや、ChatGPTで作成したコードについては、基本的に「’」で始まるコメントが付けられています。

この部分は、プログラム自体には関係のない文字列で、主に動作を解説するときに使われています。ですのでまず、コメントの日本語を上から順番に読んでみてください。

②詳細解説

【②-1】:sub ○○() ~ End sub

【対象箇所】
Sub SendEmail()

………

End Sub
【意味】

「SendEmail」という名前のVBAプログラムを、ここから書き始める。
「SendEmail」という名前のVBAプログラムは、ここまでで終わる。

【解説】

Sub ○○()で、○○というVBAのプログラムを、ここから書き始めるという意味になります。要するにVBAを書き始めるときに絶対に書かないといけない呪文のようなものです。

カッコは、引数というものを入れる部分ですが、初めのうちは無視でいいです。

また、○○の部分がVBAの名前になっています。自分の好きな名前に変更することができます。ちなみに日本語でも大体動作しますが、あまりよくないらしいです。

そして、プログラムの最後は「End Sub」を書きます。

Sub ○○()で初めて、VBAを書いて最後にEnd Subを書いて終わる。

これがVBAの基本ルールとなります。

【②-2】:変数の宣言

【対象箇所】
Dim olApp As Outlook.Application
Dim olMail As Outlook.MailItem
Dim ws As Worksheet
Dim lRow As Long
Dim strto As String, strcc As String, strbcc As String
Dim strsub As String, strbody As String
【意味】

「olApp」は「Outlookのアプリケーション」が入る変数
「olMail」は「Outlookのメールアイテム」が入る変数
「ws」は「エクセルのシート」が入る変数
「IRow」は「数字」が入る変数
「strto」は「文字」が入る変数
(「strcc」「strbcc」「strsub」「strbody」も「文字」が入る変数)

【解説】

プログラムには、変数というものがあります。変数とはデータが入る箱のようなもので、自分で好きな名前を付けることができます。

ただ、その箱には何が入るかを、プログラムに教える必要があります。例えば文字が入るのか、数字が入るのか、アプリが入るのかなど、こちらから指示しないといけません。この何が入るか教えてあげる作業を、変数の宣言と言います。

VBAでは、変数の宣言は「Dim 〇〇 as △△」と書きます。これによって「○○は、△△が入る変数である。」という意味になります。

今回は、このVBAの最初の6行ですべての変数を宣言しています。変数の宣言は、変数を使う前のどこで行っても問題ありませんが、わかりやすさのため、大概は「Sub ○○()」のすぐ下で行います。

【②-3】:変数定義

(1)outlookアプリの変数定義

【対象箇所】
'Outlookのアプリケーションを起動
Set olApp = New Outlook.Application
【意味】

「olApp」という変数に、起動されたOutlookアプリを入れる

【解説】

まずプログラムでは、イコール(=)の左のモノを右に入れるという形で書いていきます。なのでこのコードも、左にある「New Outlook.Application」を、右にある「olApp」に入れるという意味になります。

そして、「olApp」に入れる、「New Outlook.Application」ですが、「Outlookのアプリケーションを作る」という意味になります。

そして「Set」は変数に入れるものが、プログラム(オブジェクト型)の場合に使います。数字や文字なら不要ですが、今回のようなOutlookのアプリや、エクセルのシートなどは必要です。

ここに関してはアプリケーションによって書き方は変わりますので、そこまで必死に理解する必要はありません。「Set ○○ =アプリ起動」で、○○にアプリが入るという、ざっくりしたイメージだけ持っておいてもらえればOKです。

(2)シート名の変数定義

【対象箇所】
'メール送信リストが記載されたシートを設定
Set ws = ThisWorkbook.Sheets("Sheet1")
【意味】

「ws」という変数に、「Sheet1」という名前のシートを入れる

【解説】

ThisWorkbook.Sheets(“Sheet1”)」で、「このエクセルブックの、”Sheet1″というシート」という意味です。

VBAで場所を指定するときは、広いところから狭くしていきます。「どこのブックの、どのシートの、どのセル」という順番で指定する為、このような書き方となります。

次に「ThisWorkbook」で書かれている「このエクセルブック」とは、マクロを実行しているエクセルブックです。

また、Sheets(“○○”)で、「名前が○○というシート」という意味になる為、対象となるシートを○○に入れます。

最後に、シートはエクセルのプログラムなので、オブジェクト型となります。その為、格納するために「Set」を始めに付けます。

(3)最終行

【対象箇所】

'最終行を取得
lRow = ws.Cells(Rows.Count, 1).End(xlDown).Row
【意味】

「IRow」という変数に、wsというシートの一番下の行数を数字で入れる。

【解説】

ws.Cells(Rows.Count, 1).End(xlDown).Row」という部分は、「wsというシートの一番下の行数」という意味です。詳しく見ていきます。

まずプログラムにおける「.」は、「の」です。例えば「『ws』.『Cells(1,1)』」であれば、「『ws』の『Cells(1,1)』」という意味になります。ですので、「.」で区切って意味を読み解いていきます。

「ws.Cells(Rows.Count, 1)」は、先ほど定義した「ws」というシートの、選択した縦の横から1番目のセルを表しています。「Cells(〇,△)」は、「上から〇番目の左から△番目のセル」という意味で、「Rows.Count」は選択されている場所が上から何番目かを表します。

次に「○○.End(xlDown)」で、「○○の場所から一番下」という意味です。この一番下というのは、文字がある一番下の場所という意味で、「Ctrl+↓」と同じ動作となります。

最後に「○○.Row」で、上から数えた時の数字を表します。エクセルの左に書いてある数字になります。

以上をまとめると、「『ws』の『選択した縦の行から1番目のセル』から『一番下』の位置の『行番号』」という意味になります。

【②-4】for next

(1)for next

【対象箇所】
    For i = 2 To lRow

   …………

    Next i
【意味】

2~IRow番目まで1を一つずつ増やして繰り返す。

【解説】

For 〇 = 数字① To 数字②」で〇という変数数字①から1ずつ足された数字を数字②になるまで順番にに入れていく、という意味になります。

今回は「2 To IRow」なので、iが2の状態でNext iまでの動作を行います。そしてNext i まで行くとi に1足されて、3の状態でまたNext i で動作を行います。これを、IRowで設定された数字まで繰り返す事になります。

今回のVBAは、2行目に書かれた宛先・件名・本文などのメールを作成し、次に3行目に書かれた内容のメールを作り、4行目・5行目と一つずつ下のモノを順番に作っていきます。その行を2~IRowという形で変化させていくために使うのが、このFor~Nextになります。

(2)宛先ほかの代入とオブジェクトの作成

【対象箇所】
 '宛先
  strto = ws.Cells(i, 1).Value
  'CC
  strcc = ws.Cells(i, 2).Value
  '件名
  strsub = ws.Cells(i, 3).Value
  '本文
  strbody = ws.Cells(i, 4).Value

  'メールを作成
  Set olMail = olApp.CreateItem(olMailItem)
【意味】

「strto」に、上から i 番目で横から1番目の文字を入れる
「strcc」に、上から i 番目で横から2番目の文字を入れる
「strsub」に、上から i 番目で横から3番目の文字を入れる
「strbody」に、上から i 番目で横から4番目の文字を入れる
「olMail」という変数に、olAppで作られたメールを入れる

【解説】

For~Nextでiの値を2~IRowに変化させていく中で、2行目の動作、3行目の動作を具体的に表している部分になります。

この後紹介しますが、「strto」などの変数に具体的なメール情報を入れて、それを使ってメールを作成していきます。

(3)with~End With

【対象箇所】
'送信先、CC、件名、本文を設定
With olMail
    .To = strto
    .CC = strcc
    .Subject = strsub
    .Body = strbody
    .Display 'メールを表示
    '.Send '自動で送信する場合はコメントアウトを外す
End With
【意味】

End Withまでの間、「olMail」に対する処理を行う。
「olMail」の「.CC」に「strcc」に入っている物を設定する
「olMail」の「.Subject」に「strsub」に入っている物を設定する
「olMail」の「.Body」に「strbody」に入っている物を設定する
「olMail」に「.Display」という要素を設定する

【解説】

With」は、コードを短くきれいにするために使う構文です。

「With ○○」という形で○○のところに変数を書けば、そのあとドット(.)でつないでいくことで、○○に対する処理という意味になります。

綺麗に使う為の構文なので、使わなくても書くことはできます。今回の場合、Withを使わず書くとこのような形になります。

'送信先、CC、件名、本文を設定
olMail.To = strto
olMail.CC = strcc
olMail.Subject = strsub
olMail.Body = strbody
olMail.Display 'メールを表示
'olMail.Send '自動で送信する場合はコメントアウトを外す

With構文は、自分で書くとき絶対使わないといけないものではありません。とりあえずは、意味が分かる程度になっていればOKです。

(4)オブジェクトの開放

【対象箇所】
'オブジェクトを解放
Set olMail = Nothing
【意味】

メールアイテムが入っていた「olMail」を、初期化する。

【解説】

オブジェクトの解放については、こんなのが必要だと、とりあえず覚えておいてもらえればいいと思います。何かを作りたいときのサンプルコードで、○○=nothingが入っていれば、自分がコードを書くときも最後につけておこうと思うレベルで構いません。

ちなみにこのコードは、olMailという変数に格納されているオブジェクトを解放し、何も参照しない状態にしています。使い終わったオブジェクトはきちんと解放しておくことで、メモリの効率的な利用とスムーズなプログラムの実行が実行でき、エラーが減るといわれています。

【②-5】:アプリケーションの終了とオブジェクトの開放

【対象箇所】

'Outlookのアプリケーションを終了
olApp.Quit

'オブジェクトを解放
Set olApp = Nothing
【意味】

「olApp」に入っているメールアプリを終了する。
メールアプリが入っている「olApp」を初期化する。

【解説】

olAppにアプリ自体が格納されているので、立ち上がったアプリを終了させています。そして先ほど同様、オブジェクトの解放を行っています。

このアプリの終了についても、アプリによってコードや動作が異なるため、こんなものだと知っておくレベルで構いまいません。

③さいごに

今回は、Outlookの一斉送信VBAのコードの解説を行いました。

VBAの学習方法として、ある程度完成されたコードを手直しして解読するという方法が効果的です。

皆さんもぜひこの記事を参考にして、自分で使うコードを読み解きながらVBAの学習を深めてみてください。

基礎力がついてきたら、さらに本や映像学習などを取り入れて効果的に学習を進めることで、より高度で使い勝手のいいVBAを早く作成することができるようになります。

自分でコードを解読することで、VBAの理解が深まりますので、ぜひ積極的に取り組んでみてください!

コメント

タイトルとURLをコピーしました