Excel VBA入門 ～その3 基礎1～

VBAが嫌いな人が書いたVBA入門記事その3です。初心者の人も最低限だけ身に付けてPythonに移行しましょう。→[VBAユーザーのためのPython入門 ～xlwingsでExcelからPythonを呼び出す～](https://qiita.com/k_maki/items/9efdb70f69d6f3b00f80)

**記事一覧**

- [Excel VBA入門 ～その1 Excel VBAとは～](https://qiita.com/k_maki/items/eed5497c704c2ca91699)
- [Excel VBA入門 ～その2 最初のプログラム～](https://qiita.com/k_maki/items/47d6299ecbb293b01f5a)
- Excel VBA入門 ～その3 基礎1～
- [Excel VBA入門 ～その4 基礎2～](https://qiita.com/k_maki/items/44fe76f5890fedd753b3)
- [Excel VBA入門 ～その5 Tips～](https://qiita.com/k_maki/items/575b6c6c7ec22581061c)
- [Excel VBA入門 ～その6 アンチパターン～](https://qiita.com/k_maki/items/c40c0eab5af4984f08a2)

# プロシージャー
`Sub プロシージャー名`～`End Sub`の単位で呼び出すことができる。

```VB
Sub test()
    Dim msg As String
    msg = "hello"
    Debug.Print msg
End Sub
```

# 変数
変数は値やオブジェクト（後述）を入れておくための箱。上記の`Dim msg As String`で変数`msg`を宣言し、`msg = "hello"`で`msg`に値を代入。


# データ型
変数入る値の種類（数値、文字、日付、ワークシート等）を**型**という。型には**値型**と**参照型**の2種類がある。

```VB
Dim i as Long
i = 1000   '値型の例

Dim rg as Range
Set rg = Range("A2")   '参照型の例
```

## 値型
`変数名 = 値`で代入する。代表的な型は以下のとおり:

| 型 | 名前 | 説明 |
|:-:|:-|:-|
| String    | 文字列型      | 任意の長さの文字 |
| Long      | 長整数型      | 「Integerが無いようだが？」「あんなの飾りです。偉い人にはそれが分からんのですよ。」 |
| Double    | 浮動小数点型  | 実数のこと <BR> 「Singleが無い(ry？」「あんなの(ry」|
| Boolean   | ブール型      | 真偽値（TrueまたはFalse） |
| Date      | 日付型        | 日付時刻を表す |

## 参照型
`Set 変数名 = 値`で代入する（使い分ける必要があるのか…）。オブジェクトを代入する際に使用する。オブジェクトの種類には、ワークシートを表す`Worksheet`型、セル範囲を表す`Range`型、テーブルを表す`ListObject`型等、値型と違って無数にある。値型以外のものはすべてオブジェクトと覚えておいてよい。

# 四則演算
| 演算子 | 処理 | 備考 |
|:-:|:-:|:-|
| +	    | 加算 | |
| -	    | 減算 | |
| *	    | 乗算 | |
| /	    | 除算 | |
| \	    | 除算の商 | 
| Mod   | 除算の余り |
| ^     | べき乗 | |

# 制御構文
## If文と比較演算子
### If文
`If 条件式 Then` ～ `End If`で、条件にあった場合、`Then` ～ `End If`部分が実行される。複数の`Else If`で二つ目の条件を、`Else`でいずれの条件にも合致しない場合の処理を実行できる。

```VB
If x = "犬" Then
    処理1
Else IF x = "猫" Then
    処理2
Else
    処理3
End If
```
### 比較演算子
下記の比較演算子の結果を論理演算子（`And`, `Or`, `Not`等）および括弧（`(`, `)`）でつなげて、条件式を作る。

| 演算子 | 説明 |
|:-:|:-|
| =	    | 左辺と右辺は等しい |
| <>    | 左辺と右辺は等しくない |
| <     | 左辺は右辺より小さい |
| <=    | 左辺は右辺以下    | 
| >     | 左辺は右辺より大きい|
| >=    | 左辺は右辺以上|
| Like  | 左辺は右辺で指定したパターンを持つ [→Link](https://www.vba-ie.net/programing/operator.php#a4)|
| Is    | 左辺と右辺が同じオブジェクトを参照している [→Link](https://www.vba-ie.net/programing/operator.php#a5)| 

## Select Case文
`Select Case`文を使えば、同じ変数に対する複数の条件をより簡潔に記述できる。[→Link](https://www.sejuku.net/blog/30642)

### 基本
```VB
Select Case x
    Case "犬"
        処理1
    Case "猫"
        処理2
    Case Else
        処理3
End Select
```

### 複数の値

```VB
Select Case x
    Case "犬", "狼"
        処理1
    Case "猫", "ライオン"
        処理2
    Case Else
        処理3
End Select
```

### To で範囲指定

```VB
Select Case age
    Case 0 To 10
        処理1
    Case 11 to 20
        処理2
    Case Else
        処理3
End Select
```

### Is 比較演算子

```VB
Select Case age
    Case Is >= 0, Is <= 10
        処理1
    Case Is >= 11, Is <= 20
        処理2
    Case Else
        処理3
End Select
```

## For Each文
コレクションに含まれる各オブジェクトに対して、繰り返し処理を行う。ループを途中で抜ける場合には`Exit For`を使う。

```VB
For Each 要素 In コレクション
    繰り返し処理
    If 終了条件 Then
        Exit For
    End If
Next
```

配列に対して繰り返し処理を行うには、`For`文を使う:

```VB
For i = 1 to Ubound(配列)
    繰り返し処理
Next
```