VBAマクロ 入門勉強メモ

###広告
インディーズチームで**Azrael**という音ゲーを出しています。現在はiOSバージョンのみです。
Androidはできる次第リンク先を入れます。

有料ですが、音ゲーにご興味のある方是非遊んでみてください！。

**Twitter[Azrael公式](https://twitter.com/azrael_gamster)**

[**iOS：**](https://apps.apple.com/us/app/azrael/id1126256128)

https://apps.apple.com/us/app/azrael/id1126256128

**前言**
この内容は、個人がよく使うものを勉強で[マクロVBA応用編](https://excel-ubara.com/excelvba1/)を参考に、簡単に整理したものに過ぎませんので、もっと、知りたい方はリンクからご覧になってください。

開発環境設定
---
**ファイル**->**オプション**から**Excelオプション**を開き、**リボンのユーザー設定**中の**開発**をチェックに入れます。
![222.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159490/6f7715af-1224-3d7c-b28c-7cf75d61de31.png)

すると、**開発**一覧が追加されます。
![888.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159490/1324fda5-9569-477b-7e2b-6c6644f4754e.png)

**開発**->**Visual Basic**で**VBE**を開きます。
中から**挿入**->**標準モジュール**でモジュール作成し、VBAを書くことができます。
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159490/ac942217-4c86-dc2b-4036-df4c86076b41.png)

VBAを始まる前に重要なオプションがあります。
**ツール**->**オプション**をクリック
![555.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159490/1756114d-f7b6-bafc-353d-c4b0df66e6ed.png)

**自動構文チェック**を外し、**変数の宣言を強制する**にチェックをいれます。
![666.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159490/ab0300a8-23c8-acf7-8af2-42ea3e297e98.png)

すると、モジュールに**Option Explicit**が追加されます。
![777.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159490/1ad1d748-4281-f098-ec00-55ec15ae669a.png)
>
**この設定は**
マクロを書き始める前に、出来れば設定しておいた方が良いオプションがあります。
いえ、絶対に設定しておかなければならないVBEのオプション設定です、
必ず、最初に設定しておいてください。
**と書かれてありますので、従って間違いないでしょう！。**

モジュールの名前変更は**表示**->**プロパティウィンドウ**を開き変更できます。
![444.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159490/c0d22a62-94b4-b062-e870-d44c1abefe90.png)

**モジュールの解放**
![333.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159490/4c424d4a-a590-cf3a-cea8-02e1f83b9212.png)

練習Sub, End Sub
---
     Sub 練習()
          '範囲"列行:列行"
          Range("A1:C2") = "こんにちは！"
     End Sub
**実行**
方法1
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159490/ff96d046-eaa5-5d75-d748-7f1931c07e0c.png)
方法2
開発->マクロ->実行
![222.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159490/f43bacbb-8a2a-5738-c137-8917464d75eb.png)

**結果**

|   | A | B | C |
|:-:|:-:|:-:|:-:|
| 1 | こんにちは！ | こんにちは！ | こんにちは！ |
| 2 | こんにちは！ | こんにちは！ | こんにちは！ |

セルの指定方法
---
行：縦方向の行位置、1行目は1、3行目は3
列：横方向の列位置、A列は1、C列は3

     '例：Cells(行, 列) = 値
     Sub 練習()
          Cells(1, 1) = 100
          Cells(2, "C") = 200
     End Sub

**結果**

|   | A | B | C |
|:-:|:-:|:-:|:-:|
| 1 | 100 | こんにちは！ | こんにちは！ |
| 2 | こんにちは！ | こんにちは！ | 200  |

     '例：Rows(行) = 値
     Sub 練習()
          Rows(1) = 100
          Rows("2:3") = 200
     End Sub

**結果**

|   | A | B | C | 最後の列 |
|:-:|:-:|:-:|:-:|:-:|
| 1 | 100 | 100 | 100 | 100 |
| 2 | 200 | 200 | 200 | 200 |
| 3 | 200 | 200 | 200 | 200 |
| 4 |||||

     '例：Columns(列) = 値
     Sub 練習()
          Columns(1) = 100
          Columns("B:C") = 200
     End Sub

**結果**

|   | A | B | C | D |
|:-:|:-:|:-:|:-:|:-:|
| 1 | 100 | 200 | 200 |  |
| 2 | 100 | 200 | 200 |  |
| 3 | 100 | 200 | 200 |  |
| 最後の行 | 100 | 200 | 200 |  |

変数宣言とデータ型
---
###Dim 変数宣言
####データ型
| データ型 | 名称 | 格納できる範囲 |
|:-:|:-:|:-:|
| Integer | 整数型 | -32,768 ～ 32,767|
| Long | 長整数型 | -2,147,483,648 ～ 2,147,483,647 |
| Single | 単精度浮動小数点数型 | -3.402823E38 ～ -1.401298E-45(負の値)1.401298E-45 ～ 3.402823E38(正の値) |
| Double | 倍精度浮動小数点数型 | -1.79769313486232E308 ～ -4.94065645841247E-324(負の値) 4.94065645841247E-324 ～ 1.79769313486232E308(正の値) |
| String | 文字列型 | 最大約20億文字まで |
| Date | 日付型 | 西暦100 年1月1日～西暦9999年12月31日までの日付と時刻 |
| Byte | バイト型 | 0～255の範囲の単精度の正の数値。8 ビット(1 バイト) |
| Boolean | ブール型 | 真 (True) または偽 (False) |
| Object | オブジェクト型 | オブジェクト |
| Variant | バリアント型 | すべてのデータ |

####型宣言文字
| 型宣言文字 | 変数の型 |
|:-:|:-:|
| % | Integer(整数型) |
| & | Long(長整数型) |
| ! | Single(単精度浮動小数点型) |
| # | Double(倍精度浮動小数点型) |
| @ | Currency(通貨型) |
| ^ | Longlong(64ビット符号付き数値)※64ビットExcelのみ有効 |
| $ | String(文字列型) |

####変数宣言
     '例1：Dim 変数名 As データ型 As データ型 は 省略可能
     'ここでは i j k 変数を宣言しますが、iとjはVariant型で、kはLong型という意味になります。
     Dim i, j, k As Long

     '例2；Dim 変数名と型宣言文字
     '型宣言文字を変数名の後ろに付け、型を指定
     Dim i%

コメント、マルチステートメント、文字の結合、継続行、四則演算
---
###マルチステートメント
ステートメントを、**:（コロン）**でつなげることで1行にまとめることができます。

     Sub 練習()
          'Dim i, j
          'i = 1
          'j = 2 を一行にまとめます
          Dim i, j: i = 1: j = 2
     End Sub

###コメント
**'(シングルクォーテーション)**もしくは**Rem**の後ろは、コメント（**注釈**）となります。

     Sub 練習()
          'シングルクォーテーション使う例
          Cells(1, 1) = 0 'シングルクォーテーション使う例

          Rem を使う例
          Cells(1, 1) = 0: Rem をコードの後ろに使うときは : (コロン ステートメント)が必要になります。
     End Sub

###文字の結合と継続行
**& (アンパサンド)**で値と値をつなげます。

     Sub 練習()
          Cells(1, 1).Value = "A00"
          Cells(1, 2).Value = 100
          Cells(1, 3).Value = 100
          Cells(1, 4).Value = Cells(1, 1).Value & Cells(1, 2).Value & Cells(1, 3).Value
     End Sub 

**_ (アンダーバー)**で、次の行に続けて書く事が出来ます。

     Sub 練習()
          Cells(1, 1).Value = "A00"
          Cells(1, 2).Value = 100
          Cells(1, 3).Value = 100
          Cells(1, 4).Value = Cells(1, 1).Value & _
               Cells(1, 2).Value & _
               Cells(1, 3).Value
     End Sub

**結果**

|   | A | B | C | D |
|:-:|:-:|:-:|:-:|:-:|
| 1 | A00 | 100 | 100 | A00100100 |

###四則演算
| 演算子 | 説明 |
|:-:|:-:|
| + | 足し算 |
| - | 引き算（符号反転） |
| * | 掛け算 |
| / | 割り算 |
| \ | 割り算の商 |
| Mod | 割り算の余り|
| ^ | 指数（べき乗） |

条件分岐
---
###比較演算
| 比較演算子 | 意味 |
|:-:|:-:|
| = | 等しい |
| <> | 等しくない |
| > | より大きい |
| >= | 以上 |
| < | より小さい |
| <= | 以下 |

###論理演算子
| 論理演算子 | 意味 | 条件例 | 結果 |
|:-:|:-:|:-:|:--:|
| And | 論理積 | True And True | TRUE |
| -| - | True And False | FALSE|
| - | - | False And True | FALSE|
| - | - | False And False | FALSE|
| Or | 論理和 | True Or True | TRUE |
| - | - | True Or False | TRUE |
| - | - | False Or True | TRUE |
| - | - | False And False | FALSE |
| Xor | 排他論理和 | True Xor True | FALSE |
| - | - | True Xor False | TRUE |
| - | - | False Xor True | TRUE |
| - | - | False Xor False | FALSE |
| Not | 論理否定 | Not True | FALSE |
| - | - | Not False | TRUE |

###IfステートメントのElseIfの構文
     If 条件式1 Then
     　　条件式1が真の処理
     ElseIf 条件式2 Then
     　　条件式2が真の処理
     ElseIf 条件式3 Then
     　　条件式3が真の処理
     Else
     　　全ての条件式が偽の処理
     End If

###Select Caseステートメントの構文
**基本形**

     Select Case 変数
     　　Case 条件式1
          　'条件式1が真の処理
     　　Case 条件式2
     　　　　'条件式2が真の処理
     　　Case Else
     　　　　'全ての条件式が偽の処理
     End Select

**Or条件**

     Select Case 変数
     　　Case 1, 2
     　　　　'変数=1 Or 変数=2の処理
     　　Case 3, 4, 5
     　　　　'変数=3 Or 変数=4 Or 変数=5の処理
     　　Case Else
     　　　　'変数が上記以外の処理
     End Select 

**範囲指定**

     Select Case 変数
     　　Case 1 To 2
     　　　　'変数=1 ～ 2の処理
     　　Case 3 To 5
     　　　　'変数=3 ～ 5の処理
     　　Case Else
     　　　　'変数が上記以外の処理
     End Select

**不等号の使い方**

     Select Case 変数
     　　Case Is <= 2 'Is は書かなければ自動挿入されます。
     　　　　'変数<=2の処理
     　　Case Is <= 5
     　　　　'変数<= 5の処理
     　　Case Else
     　　　　'変数が上記以外の処理
     End Select

繰り返し処理
---
###For Next構文

     Sub 練習()
          '例1
          Dim i
          For i = 1 To 3
               Cells(i, i) = 1
          Next i

          '例2 Step 正負数値
          For i = 2 To 1 Step -2
               Cells(i, i) = 2
          Next i

          '例3 Exit Forを使って、ループを抜ける
          For i = 1 To 10 Step 3
               If i > 3 Then
                    Exit For
               End If
               Cells(i, i) = 3
          Next i

     End Sub

**結果**

|   | A | B | C |
|:-:|:-:|:-:|:-:|
| 1 | 3 |   |   |
| 2 |   | 2 |   |
| 3 |   |   | 1 |

###Do Loop構文
**Do [While 条件式]
　　・・・処理・・・
Loop**

または、

**Do [Until 条件式]
　　・・・処理・・・
Loop**

**While**は、条件を満たす間、・・・処理・・・を実行します。
**Until**は、条件を満たす迄、・・・処理・・・を実行します。


MsgBox関数
---
###MsgBox関数構文
MsgBox(prompt[, buttons] [, title] [, helpfile, context])

| パラメータ | 説明 |
|:-:|:-:|
| prompt | **必ず指定します。**ダイアログ ボックス内にメッセージとして表示する文字列を示す文字列式を指定します。名前付き引数 prompt に指定できる最大文字数は、1 バイト文字で約 1,024 文字です。ただし、使う文字の文字幅に依存します。名前付き引数 prompt に複数行を指定する場合は、キャリッジ リターン (Chr(13))、ライン フィード (Chr(10))、またはキャリッジ リターンとライン フィードの組み合わせ (Chr(13) & Chr(10)) を改行する位置に挿入し、行を区切ってください。 |
| buttons | 省略可能です。表示されるボタンの種類と個数、使用するアイコンのスタイル、標準ボタン、メッセージ ボックスがモーダルかどうかなどを表す値の合計値を示す数式を指定します。省略すると、名前付き引数 buttons の既定値 0 になります。 |
| title | 省略可能です。ダイアログ ボックスのタイトル バーに表示する文字列を示す文字列式を指定します。名前付き引数 title を省略すると、タイトル バーにはアプリケーション名が表示されます。 |
| helpfile | 省略可能です。ダイアログ ボックスに状況依存のヘルプを設定するために、使用するヘルプ ファイルの名前を示す文字列式を指定します。この引数は、表示するダイアログ ボックスの説明をヘルプを使って表示するときに指定します。名前付き引数 helpfile を指定した場合は、引数 context も指定する必要があります。 |
| context | 省略可能です。ヘルプ トピックに指定したコンテキスト番号を表す数式を指定します。名前付き引数 context を指定した場合は、引数 helpfile も指定する必要があります。 |

###MsgBox関数のbuttonsの定数(一部のみ)
| グループ | 定数 | 値 | 内容 |
|:-:|:-:|:-:|:-:|
| ボタンの種類 | vbOKOnly | 0 | [OK] ボタンのみを表示します。 |
| - | vbOKCancel | 1 | [OK] ボタンと [キャンセル] ボタンを表示します。 |
| - | vbAbortRetryIgnore | 2 | [中止]、[再試行]、および [無視] の 3 つのボタンを表示します。 |
| - | vbYesNoCancel | 3 | [はい]、[いいえ]、および [キャンセル] の 3 つのボタンを表示します。 |
| - | vbYesNo | 4 | [はい] ボタンと [いいえ] ボタンを表示します。 |
| - | vbRetryCancel | 5 | [再試行] ボタンと [キャンセル] ボタンを表示します。|
| アイコンの種類 | vbCritical | 16 | 警告メッセージ アイコンを表示します。Windowsのシステムエラーの音が鳴ります。 |
| - | vbQuestion | 32 | 問い合わせメッセージ アイコンを表示します。 |
| - | vbExclamation | 48 | 注意メッセージ アイコンを表示します。Windowsのメッセージ（警告）の音が鳴ります。 |
| - | vbInformation | 64 | 情報メッセージ アイコンを表示します。Windowsのメッセージ（情報）の音が鳴ります。 |
| 標準ボタン | vbDefaultButton1 | 0 | 第 1 ボタンを標準ボタンにします。 |
| - | vbDefaultButton2 | 256 | 第 2 ボタンを標準ボタンにします。 |
| - | vbDefaultButton3 | 512 | 第 3 ボタンを標準ボタンにします。 |
| - | vbDefaultButton4 | 768 | 第 4 ボタンを標準ボタンにします。 |

###MsgBox関数の戻り値定数
| 定数 | 値 | 説明 |
|:-:|:-:|:-:|
| vbOK | 1 | [OK] |
| vbCancel | 2 | [キャンセル] |
| vbAbort | 3 | [中止] |
| vbRetry | 4 | [再試行] |
| vbIgnore | 5 | [無視] |
| vbYes | 6 | [はい] |
| vbNo | 7 | [いいえ] |

###練習

     Sub 練習()
          Dim rtn '戻り値記録用変数用意
          'ループを使ってMsgBox関数を呼び出す処理を作る
          Do
               '開始ボックスで戻り値取得、そのため、()が 
               rtn = MsgBox ("内容", vbAbortRetryIgnore + vbDefaultButton2, "タイトル")
               Select Case rtn
                    Case vbAbort '中止ボタンが押された時
                         MsgBox "中止されました！", vbCritical
                    Case vbRetry '再試行ボタン押された時
                         MsgBox "再試行されました！" & vbLf & "vbLfでラインフィードできます", vbOKCancel + vbQuestion, "再試行"
                    Case vbIgnore '無視ボタンが押された時
                         MsgBox "無視されました", Title:="名前付き引数指定" '名前付き引数:=値
               End Select
          Loop While rtn = vbRetry '再試行ボタンが押されるとループが回ります。
     End Sub

InputBox関数
---
**構文**
InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context])

| パラメータ | 説明 | 
|:-:|:-:|
| prompt | ** 必ず指定します。**ダイアログ ボックス内にメッセージとして表示する文字列を示す文字列式を指定します。名前付き引数 prompt に指定できる最大文字数は、1 バイト文字で約 1,024 文字です。ただし、使う文字の文字幅に依存します。名前付き引数 prompt に複数行を指定する場合は、キャリッジ リターン (Chr(13))、ライン フィード (Chr(10))、またはキャリッジ リターンとライン フィードの組み合わせ (Chr(13) & Chr(10)) を改行する位置に挿入し、行を区切ってください。 |
| title | 省略可能です。ダイアログ ボックスのタイトル バーに表示する文字列式を指定します。名前付き引数 title を省略すると、タイトル バーにはアプリケーション名が表示されます。 |
| default | 省略可能です。ユーザーが何も入力しない場合に、テキスト ボックスに既定値として表示する文字列式を指定します。名前付き引数 default を省略すると、テキスト ボックスには何も表示されません。 |

###練習
     Sub 練習()
          Dim strIn '戻り値記録用変数用意
          'ループを使ってInputBox関数を呼び出す処理を作る
          Do
               '開始ボックスで戻り値取得、そのため、()が 
               strIn = InputBox("okと入力してください！", "タイトル", "ここに入力")
               MsgBox strIn & "と" & vbLf & "入力しました！"
          Loop While UCase(strIn) <> UCase("ok") 'UCaseを使い全部大文字に変換して比較する
     End Sub

オブジェクト
---
###Workbookオブジェクト
####Workbook指定
**Workbooks("ブック名")**ブック名で指定されるブックです。
**ThisWorkbook**動作しているマクロが書いてあるブックです。

####Workbookプロパティとメソッド
|   | 定義 | 説明 |
|:-:|:-:|:-:|
| プロパティ | Name | 名前 |
| - | Names | 名前定義 |
| - | Path | 保存パス |
| - | FullName | 保存パス＋名前 |
| - | Saved | 最後の保存から変更されたかを取得・設定 |
| - | ReadOnly | 読み取り専用かを取得・設定 |
| - | Sheets | 全てのシート |
| - | Worksheets | 全てのワークシート |
| メソッド | ActiVate | アクティブにします |
| - | Close | 閉じる |
| - | Save | 上書き保存 |
| - | SaveAs | 名前を付けて保存 |
| - | SaveCopyAs | コピーを保存 |
| - | PrintOut | 印刷 |
| - | PrintPreview | 印刷プレビュー |
| - | Protect | 保護 |
| - | Unprotect | 保護を解除 |

####使用例

     Sub 練習()
          Dim wb As Workbook
          Set wb = Workbooks("Book1.xlsx")
          MsgBox wb.Name
     End Sub

###WorkSheetsオブジェクト
**Worksheets(インデックス)**インデックスで指定されるワークシート
**Worksheets("シート名")**シート名で指定されるワークシート

####Worksheetのプロパティとメソッド
|   | 定義 | 説明 |
|:-:|:-:|:-:|
| プロパティ | Name | 名前 |
| - | Names | 名前定義 |
| - | Cells | Rangeオブジェクト |
| - | Range | Rangeオブジェクト |
| - | Columns | Rangeオブジェクト |
| - | Rows | Rangeオブジェクト |
| - | FilterMode | フィルタ モード |
| - | Hyperlinks | ハイパーリンク |
| - | PageSetup | ページ設定 |
| - | ScrollArea | スクロールが可能な領域 |
| - | Shapes | すべての図形 |
| - | Visible | 表示するかどうか |
| メソッド | Activate | アクティブ |
| - | Select | 選択 |
| - | Copy | コピー |
| - | Move | 移動 |
| - | Paste | 貼り付け |
| - | PasteSpecial | 形式を選択して貼り付け |
| - | AutoFilter | フィルター |
| - | PivotTables | ピボットテーブル |
| - | PrintOut | 印刷 |
| - | PrintPreview | 印刷プレビュー |
| - | Protect | 保護 |
| - | Unprotect | 保護解除 |

####使用例

     Sub 練習()
          Dim ws As Worksheet
          Set ws = Worksheets("Sheet1")
          MsgBox ws.Name
     End Sub

###With、Set練習
     Sub 練習()
          Dim ws As Worksheet
          'Setを使って参照を変数に代入し、変数を使って参照する事が出来ます。
          Set ws = Worksheets("シートネーム")
          'With使うことで、メソッドなど呼び出す時に毎回同じ参照しないで、一回で済めるようになります。
          With ws
               .Cells(1, 1) = 1
               .Cells(2, 2) = 2
          End With
     End Sub

ファイル操作
---
###UTF-8でCSV読み書き
VBAで**UTF-8**を扱う為には、[ADODB.Stream](https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/stream-properties-methods-and-events-ado)を使う必要があります。そのため、参照設定で、**「Microsoft ActiveX Data Objects 2.8 Library」**にチェックを入れます。

     Sub Utf8csvCreate()
          Dim i, j, strList As String, csvPath As String
          '*パス指定
          'ThisWorkbook.Path & "\newFile.txt"
          '"D:\newFile.txt"
          csvPath = "D:\newFile.txt"
          Dim adoSt As Object
          Set adoSt = CreateObject(ADODB.Stream)
          With adoSt
               .Type = adTypeText '既定値。Charset で指定された文字セットのテキスト データを示します。
               .Charset = "UTF-8"
               .Open
          End With
          With ActiveSheet.UsedRange
               For i = 1 To .Rows.Count
                    strList = ""
                    For j = 1 To .Columns.Count
                         If j > 1 Then
                              strList = strList & ","
                         End If
                         strList = strList & .Cells(i, j)
                    Next
                    adoSt.WriteText strList, adWriteLine
               Next
          End With
          adoSt.SaveToFile csvPath, adSaveCreateOverWrite
          adoSt.Close
          Set adoSt = Nothing
     End Sub