特定グループへのメール送信時のマクロシートの作成
メール送信時に特定のグループのメンバーのアドレスを、Cc欄に一括で追加するためのマクロシートの作成を行いました。本記事では、マクロシートの作成手順とその使い方について説明します。
作成しようと思ったきっかけ
約1か月周期で、メンバーが加わったり、メンバーが外れるグループに属していました。そのたびにCc欄の編集を手打ちで行っており、「ボタンを押せば一括で編集ができないかな~」と考えたことがきっかけです。
前提
- Cc欄に自分のアドレスは含まない
- アドレスの区切りは「,」とする
- 「ホーム」シートに30人分のアドレスが入るようにする
- 使いやすさ重視(誰でも使えるようにする)
使用ツール
- Microsoft Excel
- VBA (Visual Basic for Applications)
使用したコード
Sub FilterEmailAddresses()
Dim wsA As Worksheet
Dim wsB As Worksheet
Dim lastRowA As Long
Dim i As Long
Dim col As Long
Dim emailList As String
Dim excludeName As String
Set wsA = ThisWorkbook.Sheets("アカウント")
Set wsB = ThisWorkbook.Sheets("ホーム")
lastRowA = wsA.Cells(wsA.Rows.Count, "A").End(xlUp).Row
For col = 2 To 31
excludeName = wsB.Cells(10, col).Value
If excludeName <> "" Then
wsB.Cells(11, col).ClearContents
emailList = ""
For i = 2 To lastRowA
If wsA.Cells(i, 1).Value <> excludeName Then
If emailList <> "" Then
emailList = emailList & ", "
End If
emailList = emailList & wsA.Cells(i, 2).Value
End If
Next i
wsB.Cells(11, col).Value = emailList
With wsB.Cells(10, col).Borders
.LineStyle = xlContinuous
End With
With wsB.Cells(11, col).Borders
.LineStyle = xlContinuous
End With
End If
Next col
End Sub
シートと変数の設定
-
Sub FilterEmailAddresses()
はFilterEmailAddresses
というサブルーチンの開始点 -
End Sub
はFilterEmailAddresses
というサブルーチンの終了点 -
FilterEmailAddresses
と名前があることで、サブルーチンの実行(ボタンをクリックすれば実行)をすることが可能になる
Dim wsA As Worksheet
Dim wsB As Worksheet
Dim lastRowA As Long
Dim i As Long
Dim col As Long
Dim emailList As String
Dim excludeName As String
-
Dim
はVBAで変数を宣言するためのキーワード -
Dim wsA As Worksheet
「アカウント」シートを指す変数 -
Dim wsB As Worksheet
「ホーム」シートを指す変数 -
Dim lastRowA As Long
「アカウント」シートの最終行を識別する変数 -
Dim i As Long
ループのカウンタ変数i
を長整数型として宣言するためのもの -
Dim col As Long
列番号を格納するための変数col
を宣言するためのもの -
Dim emailList As String
メールアドレスのリストを格納するための変数emaillist
を宣言するためのもの -
Dim excludeName As String
除外する名前を格納するための変数excludeName
を宣言するためのもの
シートの指定
-
Set wsA = ThisWorkbook.Sheets("アカウント")
wsAがアカウントシートを指す -
Set wsB = ThisWorkbook.Sheets("ホーム")
wsBがホームシートを指す -
lastRowA = wsA.Cells(wsA.Rows.Count, "A").End(xlUp).Row
「アカウント」シートの最新の最終行を取得することができる
「ホーム」シートの特定の列の各セルに処理を行う
-
For col = 2 To 31
B列からAE列までの処理を行うため(つまり30人までアカウントが登録できる) -
excludeName = wsB.Cells(10, col).Value
10行目のセルからフィルタリングに使う名前(excludeName)を取得する -
If excludeName <> "" Then
10行目のセルに名前が設定されている場合のみ、フィルタリング処理を続行する -
wsB.Cells(11, col).ClearContents
フィルタリング結果を表示するための11行目のセルを初期化して、前回の結果が残らないようにする
メールアドレスのフィルタリング
-
emailList = ""
フィルタリング結果を連結するための文字列を空に初期化する -
For i = 2 To lastRowA
「アカウント」シートの2行目から最終行までをループする -
If wsA.Cells(i, 1).Value <> excludeName Then
「アカウント」シートのA列の値がexcludeName
と異なる場合に処理を行う -
If emailList <> "" Then
emaillist
に1つ以上のアドレスが追加されている場合、「,」を追加してアドレスを区切る -
emailList = emailList & ", "
「アカウント」シートのB列の値をemaillist
に追加する -
End If
If wsA.Cells(i, 1).Value <> excludeName Then
の条件文の終了を示す -
Next i
For i = 2 To lastRowA
のループの次の繰り返しへ進む指示 -
wsB.Cells(11, col).Value = emailList
フィルタリング結果を「ホーム」シートの11行目のB列からAE列に出力する
枠線の設定
With wsB.Cells(10, col).Borders
.LineStyle = xlContinuous
End With
With wsB.Cells(11, col).Borders
.LineStyle = xlContinuous
End With
「ホーム」シートの10行目と11行目のセルに対して枠線の設定をする
xlContinuous
というラインスタイルの枠線を追加している
終了点
-
End If
If excludeName <> "" Then
の終了点で、除外する名前(excludeName)が空でない場合に行うフィルタリングと表示の処理がここで終了する -
Next col
For col = 2 To 31
の次の列に進む指示を示し、「ホーム」シートのB列からAE列までの各列に対して処理を繰り返す