悲運のVBA入門

前書き
=========
人生には不運がつきもので、そのなかでもExcelをVBAでいじらなきゃいけないというのはなるべく遭遇したくない類いの不運ですよね？
前にそんな境遇になったときにVBAについて調べたやつを転記しておきます。クッソ初歩的な内容です。qiitaでは全角で赤四角表示になるようですが直すのも面倒なので各自読み進めて頂きたく。

Visual Basic for Application
=========
##1. 全般
<BR>

###命名
- VBAはケースセンシティブである。変数Varと変数varは別々の変数として定義される。
- 変数名・関数名は文字で始まらなければいけない。
- 変数名・関数名にスペースは使えない。
- 変数名・関数名に記号は使えない。ただし、アンダースコア（_）は例外。

<BR>

###型（変数・定数）
```
数値    Integer 整数
数値    Long    小数
数値    Double  倍精度少数
文字    String  文字列。""で囲まれた
真偽    Boolean TrueもしくはFalseを取る。

その他、Class を用いた型の定義が可能。
```
<BR>

###変数の宣言
構文

```vbnet
Dim name As type
```

例1

```vbnet
Dim i As Integer
```
<BR>
###定数の宣言
構文

```vbnet
Const name As type
```

例1

```vbnet
Const ci As Integer
```

<BR>

###算術演算子

```
+   加算 
-   減算 
*   乗算 
/   除算
^   べき乗算 
```

###比較演算子

```
=   左項と右項の値が等しい
>   左項の値が右項の値より大きい
<   左項の値が右項の値より小さい
>=  左項の値が右項の値以上
<=  左項の値が右項の値以下
<>  左項と右項の値が等しくない

```
###論理演算子

```
And 左項と右項の両方が真、ならば真
Or  左項と右項のどちらかが真、ならば真
Not 論理値反転
```


<BR>

##2. 関数
###Sub Procedure

構文

```vbnet
Sub name
 Code
End Sub
```

例

```vbnet
Sub PM_MyFirstSub 
 MsgBox ("Hello World") 
End Sub 
```

##3. フローコントロール
###3-1.条件分岐
###If...Then...Else文
構文

```vbnet
If condition Then 
 Code 
Else 
 Code 
End If
```
例


```vbnet
Sub PM_TestingIfThenElse 
 Dim Number As Integer 
 Number = Inputbox (“Give a number:”) 
 If Number > 500 Then 
  MsgBox (“The number you gave is greater than 500.“) 
 Else 
  MsgBox (“The number you gave is less than 500.”) 
 End If
End Sub 

```

###Select...Case文
構文

```vbnet
Select Case value
　Case condition
　　　Code
　Case condition
　　　Code
　Case condition
　　　Code
　Case Else
　　　Code
End Select
```
例1

```vbnet
Select Case value
  Case 1
　　　myColor = 3 '赤
　Case 2
　　　myColor = 6 '黄
　Case 3,4
　　　myColor = 8 '水色
　Case Else
　　　myColor = 10 '緑
End Select
```

例2

```vbnet
Select Case value
　Case Is < 10
　　　myColor = 3 '赤
　Case Is < 20
　　　myColor = 6 '黄
　Case Is < 30
　　　myColor = 8 '水色
　Case Else
　　　myColor = 10 '緑
End Select

```
例3

```vbnet
Select Case value
　Case 1 To 9
　　　myColor = 3 '赤
　Case 10 To 19
　　　myColor = 6 '黄
　Case 20 To 29
　　　myColor = 8 '水色
　Case Else
　　　myColor = 10 '緑
End Select

```

###3-2.繰り返し
###For...Next文
構文

```vbnet
For counter = beginValue To endValue [step Value] 
 Code
Next counter
```

例

```vbnet
Sub PM_TestingForNextLoop 
 Dim Counter As Integer 
 For Counter = 10 To 0 Step -2 
  MsgBox (Counter) 
 Next Counter 
End Sub 
```

###Do While...Loop文
構文1

```vbnet
Do While condition 
 Code 
Loop
```
構文2

```vbnet
Do 
 Code 
Loop While condition 

```

例2

```vbnet
Sub PM_TestDoWhileLoop1 
 Dim Number As Long
 Do While Number<500 
  Number = InputBox("Give a number:") 
 Loop 
End Sub
```

###3-3.例外処理
###On Error GoTo
構文

```vbnet
Code
On Error GoTo label
Code
label:
Code
```
例

```vbnet
Sub test()
　　Dim x
　　On Error GoTo ErrorHandler
　　　　x = Range("A1").Value / Range("B1").Value
　　　　Range("c1").Value = x
　　　　MsgBox "計算が終わりました"
　　Exit Sub
　　ErrorHandler:
　　　　MsgBox "エラーが発生しましたので終了します"
End Sub
```
Errオブジェクト

```vbnet
Err.Number  エラーを指定する数値を設定
Err.Source  最初にエラーを発生させたオブジェクトまたはアプリケーションの名前を示す文字列式を設定
Err.Description エラーを説明する文字列を取得または設定
Err.HelpFile    ヘルプ ファイルへの絶対パスを含む文字列式を設定
Err.HelpContext ヘルプ ファイルのトピックを表すコンテキストIDを含む整数を設定
Err.LastDLLError    DLLの呼び出しにより作成されたシステムエラーコード
```
エラーコードとメッセージ

```vbnet
エラーコード    エラーメッセージ
3   Return に対応する GoSub がありません。
5   プロシージャの呼び出し、または引数が不正です。
6   オーバーフローしました。
7   メモリが不足しています。
9   インデックスが有効範囲にありません。
10  宣言が重複しています。 (バージョン 5.0 および 7.0)
10  この配列は固定されているか、または一時的にロックされています。 (バージョン 97)
11  0 で除算しました。
13  型が一致しません。

```