【VBA】メール送信時のCc欄編集の効率化

## 特定グループへのメール送信時のマクロシートの作成
メール送信時に特定のグループのメンバーのアドレスを、Cc欄に一括で追加するためのマクロシートの作成を行いました。本記事では、マクロシートの作成手順とその使い方について説明します。

## 作成しようと思ったきっかけ
約１か月周期で、メンバーが加わったり、メンバーが外れるグループに属していました。そのたびに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列までの各列に対して処理を繰り返す
            
## マクロ実行
- 「アカウント」シートに「アカウント名」と「アドレス」を入力
![アカウントシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803710/7f7e37e2-4c64-5e10-7619-a1f0acee6337.png)

- ホームシートの「更新」ボタンをクリックすればマクロが実行され、10行目に入力されたアカウント以外のアドレスが出力される
![ホームシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803710/64572509-099c-c4cf-b6bd-949b5b69308d.png)