# VBA 入門向けあんちょこ

# はじめに

只の VBA 入門向けあんちょこである、それなりに他の言語のプログラムを書きつつ VBA をほぼ書かない人間が構文を思い出す程度のメモである。 プログラムを教えてくれとの要望対応として自身のあやふやな知識の修正と初学者への説明を助ける為に用意した。 内容には何かしらの勘違いがあるかもしれない、より正しく学習をするなら以下のサイトを参照を。

* [MS VBA 言語リファレンス](https://msdn.microsoft.com/ja-jp/vba/vba-language-reference)
* [MS VBA Language Specification](https://msdn.microsoft.com/ja-jp/library/dd361851.aspx)
* [Google検索 VBA 入門](https://www.google.co.jp/search?source=hp&ei=3IxpWq-XKcXb8QX4iJjgDg&q=VBA+%E5%85%A5%E9%96%80&oq=VBA+%E5%85%A5%E9%96%80&gs_l=psy-ab.3..0i131k1j0l7.1800.1800.0.2159.3.2.0.0.0.0.85.85.1.2.0....0...1c.1.64.psy-ab..1.1.85.0...63.IAAfB7O9lbU)

VBA を嫌いで堪らないのに止む無くまとめた故に入門に向いてないかもしれないがご容赦を。 検索したらいいやんとか思ったのは秘密である。 とりあえず私に VBA の仕事を振らないでもらいたい。

**にゃ～ん** 

この記事より高度な事をやりたい場合、 私は [xlwings](https://qiita.com/m5knt/items/a7bc555f287ac7fe761d) をお勧めしている。

# VBA の開発を有効化する

以下は Excel2010 の例である。 (手元ではサブスクリプション契約しているので最新が使えるのだが...)

![Excelオプション.png](https://qiita-image-store.s3.amazonaws.com/0/59404/e546bd7b-5607-0f29-517e-ca04c18304bb.png)

![ExcelVBA開発.png](https://qiita-image-store.s3.amazonaws.com/0/59404/9d954c0f-e8d0-868f-129f-36d0799ca549.png)

# VBA を記述していく

![vbe.png](https://qiita-image-store.s3.amazonaws.com/0/59404/7f0fea18-3d22-27b4-8865-303e3b9bbaf6.png)

![twb.png](https://qiita-image-store.s3.amazonaws.com/0/59404/835ef267-1c48-0426-205e-5a2221d0091e.png)

# VBA の関数

[VBA の関数を緩く説明](https://qiita.com/m5knt/items/273750cc77d283a9e005)

[Sub プロシージャを作成する](https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/writing-a-sub-procedure) / [Function プロシージャを作成する](https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/writing-a-function-procedure) / [Sub プロシージャと Function プロシージャの呼び出し](https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/calling-sub-and-function-procedures) / [コードでかっこを使用する](https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/using-parentheses-in-code) / [同じ名前のプロシージャを呼び出す](https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/calling-procedures-with-the-same-name) / [名前付き引数と省略可能な引数について](https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/understanding-named-arguments-and-optional-arguments) / [引数を効率的に渡す](https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/passing-arguments-efficiently) / [パラメーター配列について](https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/understanding-parameter-arrays)

```vbnet
    ' 注釈
    Sub Start()
        ' 返り値を使わない場合の呼び出し方
        Subプロシージャ名 引数名:=引数, ...
        Call Subプロシージャ名(引数名:=引数, ...)
        Funcプロシージャ名 引数名:=引数, ...)
        Call Funcプロシージャ名(引数名:=引数, ...)
        ' 返り値を使う場合の呼び出し方
        変数 = Funcプロシージャ名(引数名:=引数, ...)
    End Sub

    Sub Subプロシージャ名(受け渡し種別 引数名 as 引数の型, ...)
        ' Exit Sub で脱出可能
    End Sub

    Function Funcプロシージャ名(受け渡し種別 引数名 as 引数の型, ...) as 戻り値の型
        ' Exit Function で脱出可能
        Funcプロシージャ名 = 戻り値
    End Function
```

* ```引数名:=``` / ```as 引数の型``` / ```as 戻り値の型``` / ```関数名 = 戻り値``` は省略可能である。
* ```受け渡し種別``` ... ByVal, ByRef, Optional が指定出来る、また省略可能である。

# VBA の分岐

[VBA の分岐を緩く説明](https://qiita.com/m5knt/items/cfabbacfa7e9cdfe7859) 

[If...Then...Else ステートメントを使用する](https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/using-ifthenelse-statements) / [Select Case ステートメントの使用](https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/using-select-case-statements)

```vbnet
    If 式 Then
    ElseIf 式        ' 省略可能
    Else             ' 省略可能
    End If

    Select Case 式
    Case 値, ...
    Case 最小値 To 最大値
    Case Is 演算子 式
    Case Else        ' 省略可能
    End Select

    GoTo ラベル
ラベル:
```

# VBA のループ

[VBA のループを緩く説明](https://qiita.com/m5knt/items/2ae7a3747425ece9199f)

[For...Next ステートメントを使用する](https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/using-fornext-statements) / [Do...Loop ステートメントを使用する](https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/using-doloop-statements) / [For Each...Next ステートメントを使用する](https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/using-for-eachnext-statements)

```vbnet
    For 変数名 as 型 = 式 To 式 Step 式              ' as 型 / Step 式 は省略可能
        ' Exit For で脱出可能
    Next 変数名

    Do While 式
        ' Exit Do で脱出可能
    Loop

    Do
    Loop While 式

    Do Until 式
        ' Exit Do で脱出可能
    Loop

    Do
    Loop Until 式

    For Each 変数 in イテレータ
    Next 変数
```

# VBA の演算

[VBA の演算を緩く説明](https://qiita.com/m5knt/items/d9ce0e37d32598feaa87)
[比較演算子](https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/comparison-operators) / [Eqv 演算子](https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/eqv-operator) / [Imp 演算子](https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/imp-operator)

| 単項演算 | 正 | 負 | 優先順位変更 |
|---------|----|----|-------------|
|         | +x | -x | (式)        |

| 二項演算 | 加算   | 減算   | 乗算   | 浮動除算 | 整数除算/商 | 剰余    | べき乗 |
|---------|-------|--------|--------|---------|------------|---------|--------|
|         | x + y | x - y  | x * y  | x / y   | x \ y      | x Mod y | x ^ y  |

| 比較演算 | 小なりLT | 小なりイコールLE | 大なりGT | 大なりイコールGE | 等号  | 否定   |
|---------|---------|-----------------|---------|-----------------|-------|--------|
|         | x < y   | x <= y          | x > y   | x >= y          | x = y | x <> y |

* x < y < z のような記述は出来ない

| ビット毎論理演算 | 論理否定 | 論理積  | 論理和  | 排他的  | 論理同値 | 論理包含  |
|-----------------|---------|---------|--------|---------|---------|----------|
|                 | Not x   | x And y | x Or y | x Xor y | x Eqv y | x Imp y  |

| 文字列演算 | 連結   | パターンマッチ |
|-----------|--------|--------------|
|           | x & y  | x Like y     |

[Like 演算子](https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/like-operator)

# VBA の変数

[VBA の変数を緩く説明](https://qiita.com/m5knt/items/6499d9f8caeca44c86f9)

[宣言ステートメントを作成する](https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/writing-declaration-statements) / [代入ステートメントを作成する](https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/writing-assignment-statements) / [変数を宣言する](https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/declaring-variables) / [配列を宣言する](https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/declaring-arrays) / [定数を宣言する](https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/declaring-constants) / [オブジェクト変数を作成する](https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/creating-object-variables) / [Visual Basic の名前指定の規則](https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/visual-basic-naming-rules) / [スコープと可視性について](https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/understanding-scope-and-visibility) / [変数の有効期間について](https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/understanding-the-lifetime-of-variables)

小規模な範疇であれば次で良い。

```vbnet
Const 変数名 = 初期値　'定数
' 変数を使いたいところで変数をただ表記するだけで良い
変数名 = なにか
Set オブジェクト変数名 = なにか
```

規模の大きいケースはら明示的にすると良いだろう。

```vbnet
Option Explicit                               '宣言の必須化
公開範囲 Const 変数名 as 型名 = 初期値, ...     '定数
公開範囲 Const 変数名型修飾子 = 初期値, ...     '定数
公開範囲 Dim 変数名 as 型名, ...
公開範囲 Dim 変数名(サイズ) as 型名, ...        '固定長配列 変数名(1 To 3) とも 指定可能
公開範囲 Dim 変数名(サイズ,...) as 型名, ...    '多次元固定長配列
公開範囲 Dim 変数名() as 型名, ...              '可変長配列
公開範囲 Dim 変数名 as String * 10             '固定長文字列
```

* 宣言しなくとも変数を使う事が出来る、その場合は Variant 型になる。
* 公開範囲 -- Public, Private 省略可能である、プロシージャ内では指定出来ない。
* ```as 型名``` -- 型修飾文字にする事が出来る、省略した場合は Variant 型になる。

# VBA の型

[VBA の型を緩く説明](https://qiita.com/m5knt/items/989c340f0146ce3fcfe3)

[データ型の概要](https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/data-type-summary) / [データ型を効率的に使用する](https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/using-data-types-efficiently) / [VarType 関数](https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/vartype-function)

## 値型

|　型       | リテラル   | 説明   |
|----------|------------|--------|
| Boolean  | True False | 論理値 |
| Byte     | 無し    | 8ビット符号付き整数 |
| Integer  | 数値%    | 16ビット符号付き整数 |
| Long     | 数値&    | 32ビット符号付き整数 |
| Single   | 数値!    | 単精度浮動小数 |
| Double   | 数値#    | 倍精度浮動小数 |
| Decimal  | 無し         | 10進 |
| Currency | 数値@    | 通貨 |
| String   | "文字列" | |
| Date     | #YYYY/MM/DD# もしくは #YYYY/MM/DD HH:MM:SS# | 日時 |

* 整数数値には 16進数指定: ```&H``` 8進数指定: ```&0``` が付記できる。

## その他の型

[Variant について](https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/understanding-variants)

|　型       | リテラル  | 説明                 |
|----------|-----------|----------------------|
| Object   |           | オブジェクト型        |
| Nothing  | Nothing   | オブジェクト型の初期値 |
| Variant  |           | なんでも入る型        |
| Empty    | Empty     | 組み込み型の初期値    |

* Empty -- 右辺の時あらゆる組込型の初期値になる