VBA で Outlookからメールを送信する定型文を作成

###いきさつ
Outlookで定型的なメールを送る際、いちいちアドレスを宛先に入れることが面倒だったので、自動化したいと思ったため

#VBAの基礎知識
* 基本構文  
例：
ブック”study.xlsmのワークシート”Sheet1”のセルA1を選択する
   
```
Workbooks("study.xlsm").Worksheets("Sheet1”).Range("A1").Select
``` 
　　

* メソッドの書き方例  
例： セルA1を選択する
   
```
Range("A1").Select
```
　


  
* プロパティの設定  
例：セルA1の値を設定する  

```
Range("A1").value
```


※　プロパティ
Excelではセルの内容や背景色、フォントサイズなど色々。



* マクロ名の宣言  

```
Sub ｛マクロ名｝()  
｛マクロの処理｝  
End Sub  
```


* 変数の宣言  

```
 Dim 変数名 [As データ型] 
```


※　データ型

| データ型 | 名称 | 格納できる値 |
|:-----------|------------|:------------|
| String     | 文字列       | 最大約20億文字まで |
| Integer    | 整数型     | -32,768～32,767の整数       |
| Long       | 長整数型    | -2,147,483,648～2,147,483,647の整数  |
| Date       | 日付型          | 西暦100 年1月1日～西暦9999年12月31日までの日付と時刻         |
|  Object      | オブジェクト型      | オブジェクト       |
|  Variant   | バリアント型     | ★すべてのデータ     |


★とても便利な バリアント型
すべてのデータを格納できるので、とりあえず型は覚えなくても書ける。
型を省略して書くと、バリアント型となる。




 * 変数への代入

```
変数名 = データ
```

ただし、オブジェクト型の変数に代入するときは**Set**を使う

```
Set 変数名 = データ
```




#本題
**ExcelのボタンでOutlookのメール作成を自動化するVBA**

```makemail

Sub MakeMail()
    ' Outlookのメールを作成する
    Dim ol As Object
    
    ' 起動しているOutlookを取得する
    Set ol = GetObject(, "Outlook.Application")
    If ol Is Nothing Then Exit Sub ' Outlookが起動していない場合、終了する
    
   
    ' メールを作成する
    With ol.CreateItem(0)
        .To = Worksheets("基本設定").Range("C4").Value         ' 宛先
        .CC = Worksheets("基本設定").Range("C5").Value         ' CC
        .BCC = Worksheets("基本設定").Range("C6").Value        ' BCC
        .Subject = Worksheets("基本設定").Range("C7").Value    ' 件名
        .Display                        ' 表示
        
        Dim tuki
        tuki = Month(Date) & "月"
        
        
                
       .Body = Worksheets(tuki).Range("G2").Value & Worksheets("基本設定").Range("C8").Value    '本文

    End With
    
    Set ol = Nothing
End Sub
```

以上のようなものを作りました。
参考サイトはこちら　[意外となんとかなる日記](http://suechan.hateblo.jp/entry/2016/01/11/204451)
変数名をどうにかしたかったけれど、とりあえずこれで。  
※　"基本設定"シートに以下の画像のようなデータがあるとする。
![Excel.PNG](https://qiita-image-store.s3.amazonaws.com/0/185546/73cb6096-18a8-e269-dd58-5dccc9f59726.png)



#ソースコードの説明
* GetObject([pathname] [,class])  
オブジェクトを参照するメソッド。Outlookを参照を取得するときには引数classに"Outlook.Application"、Excelの参照を取得するときには"Excel.Application"と指定する。　　
**参照終了後はオブジェクト型変数にNothingを代入して、解放する**ようにすること。　　
　　

* Application.CreateItem(Item Type)  
既定の Outlook アイテムのみを作成するメソッド。作成することができるアイテムは以下の通りらしい。

|アイテム|定数|
|---|:---:|
|メール|0|
|予定表|1|
|連絡先|2|
|仕事|3|
|履歴|4|
|メモ|5|
|投稿|6|
|配布リスト|7|
参考サイトhttp://d.hatena.ne.jp/ken3memo/20090425/1240642355


※定数とは
この引数（数値）を与えたら、こういう動作をさせると決められているもの。  

* Date  
現在の日付を取得する関数。  

```
Year(Date) '今年の年を取得
Month(Date) '今の月を取得
```

今回は下記画像のように月ごとのワークシートごとを作っていたので、今月のワークシートを対象にするために、変数tukiにデータを格納しました。
![Excel2.PNG](https://qiita-image-store.s3.amazonaws.com/0/185546/e2d284a7-0a46-1417-fde9-4bc15b4452b9.png)



* With  
Withを使うことで、コードをすっきり書くことができる。例えば、あるセルのデータを、同じワークシート上にあるセルに代入するとき、何度もワークシート名を書くのは面倒（下記コードで言うと、ActiveSheetと何度も書かなければならない）。

```
Sub　支払期日設定（）
    ActiveSheet.Range("A1").value=ActiveSheet.Range("A2").value　+ 14
End Sub
```

そこでWithを使うと、ワークシート名を省略することができる。  

```
Sub　支払期日設定（）
    With ActiveSheet
            .Range("A1").value ＝.Range("A2").value　+ 14
    End With
End Sub
```