仕事で未だに使うことのあるを改めて体系的に学びたく
を読んでいく。
目次
3. VBAの基礎文法
3.2 演算子
3.2.1 計算を行う算術演算子
算術演算を行う算術演算子は以下のとおりである。
演算 |
|
---|---|
加算 |
+ |
減算 |
- |
乗算 |
* |
除算 |
/ |
商 |
\ |
剰余 |
|
冪乗 |
^ |
''' 算術演算 ''' '数値1 演算子 数値2 Range("E1").Value = 5 + 2 Range("E2").Value = 5 - 2 Range("E3").Value = 5 * 2 Range("E4").Value = 5 / 2 Range("E5").Value = 5 \ 2 Range("E6").Value = 5 Mod 2 Range("E7").Value = 5 ^ 2
3.2.2 文字列連結演算子
2つの文字列を結合して1つの文字列にするには&演算子を用いる*1。
Range("C1").Value = "Excel" & "VBA" Range("C2").Value = "Excel" + "VBA" ' +でも文字列結合ができる Range("C3").Value = "Excel" &vbLf & "VBA" ' vbLfはセル内改行を意味する Range("C4").Value = "Excel" & 15 '文字列に数値を結合すると、数値を自動的に文字列として処理する
3.2.4 オブジェクトの比較
オブジェクトが等しいかを判定する場合、演算子を用いる。なおオブジェクトが存在しない状態を表すにはを用いる。
'オブジェクト1 Is オブジェクト2 Worksheets(1) Is Worksheets("Sheet1") Worksheets(1) Is Nothing ' Nothingはオブジェクトが存在しない状態
ただしセルをで比較するのには演算子を用いると正常に判定しない。
3.2.5 論理演算子
複数の条件を組み合わせて判定する場合には論理演算子を用いる。
判定の種類 |
例 |
|
---|---|---|
論理積 | ||
論理和 | ||
論理否定 |
' セルA1が空白でなく、A1の値が数値として認識可能か Range("A1").Value <> "" And IsNumeric(Range("A1").Value) ' IsNumericは引数が数値として認識できる場合はTrueを返す ' セルA1が「Excel」でない場合 Not Range("A1").Value = "Excel" ' セルの値が”Excel”を含むか検索して見つかった場合 Not Cells.Find("Excel") Is Nothing ' Not ... Is Nothingは便利
3.3 条件分岐とループ処理
3.3.1 処理の分岐
処理の分岐ではステートメントによるものがまずは重要である。
で始め、条件式を満たす場合に実行する処理を以降の行に記述し、最後に で挟んで範囲を指定する。
If 条件式 Then 条件式がTrueの場合に実行するコード End If
およびを用いることで、複数の条件分岐を載せたり、条件式がの場合の処理を載せたりすることができる。
If Range("A1").Value = 10 Then MsgBox "セルA1の値は「10」です" ElseIf Range("A1").Value = -10 Then MsgBox "セルA1の値は「-10」です" Else MsgBox "セルA1の値は「10」でも「-10」でもありません" End If
また特定の条件を満たしたらその時点でマクロを終了させたいときには ステートメントを用いる。
If Range("A1").Value <> "完了" Then MsgBox "入力を完了させてからマクロを実行してください" Exit Sub End If
3.3.2 Select Caseによる条件分岐
特定の値に注目して細かく処理の流れを分岐したい場合には、 ステートメントが利用できる。
Select Case 注目したい対象 Case 値1 対象が値1だった場合の処理 Case 値2 対象が値2だった場合の処理 Case Else 対象がリストアップした値(値1および値2)以外だった場合の処理 End Select
リストアップする値を指定するには以下のように範囲指定も可能である。
範囲 |
記述 |
内容 |
---|---|---|
特定の値 |
値が「1」 |
|
複数の値のいずれか |
値が「1」「3」「5」のいずれか |
|
範囲指定① |
値が「5」未満 |
|
範囲指定② |
値が「1」~「5」 |
|
リストアップした値以外 |
リストアップした値以外 |
3.3.3 ループ処理
ステートメントを用いるとループ処理ができる。
単体では、イテレータでループ数をカウントしつつ処理を行う。他方で ステートメントを用いると、指定したリストのメンバー全てに対する繰り返し処理を行う。
' For Nextステートメント For イテレータ = 開始値 To 終了値 繰り返したい処理 Next ' For Eachステートメント For Each メンバー用変数 In リスト 個々のメンバーに対する処理 Next
Dim i As Long 'イテレータ For i = 1 To 5 Debug.Print "処理回数:", i Next Dim rng As Range For Each rng In Range("B3:B7") rng.Value = rng.Value & " 様" ' セルの値の末尾に「 様」を加える Next
~ ステートメントは、ループ処理を行う「数」または「回数」を指定する。このとき更にキーワードを併記すると、カウンタ用変数の増減方向や間隔を指定できる。
Dim i As Long For i = 10 To 1 Step -1 Debug.Print "イテレータの値:", i Next
またある複数の値にループ処理をしたい場合、関数を利用して配列を作成し、配列の要素を順番に表示させればよい。
' Arrayを用いたFor Each Dim tmpList As Variant, tmp As Variant tmpList = Array("巨人", "阪神", "広島", "ヤクルト", "中日", "横浜") For Each tmp In tmpList Debug.Print tmp Next
余談
関数とメソッドは違いがあり、オブジェクトに依存せずに呼び出せるものが関数で、オブジェクトに定義されておりオブジェクト経由で呼び出すのがメソッドである。またステートメントはの文法的な仕組みとして定義されるという違いがある。またではオブジェクトブラウザにおいて単なるモジュールに定義されているものを関数、オブジェクトに定義されているものはメソッドないしプロパティと言える。
*1:+でも結合できるが、加算演算と紛らわしいため、こちらを用いた方が良い。