「大人の教養・知識・気付き」を伸ばすブログ

一流の大人(ビジネスマン、政治家、リーダー…)として知っておきたい、教養・社会動向を意外なところから取り上げ学ぶことで“気付く力”を伸ばすブログです。データ分析・語学に力点を置いています。 →現在、コンサルタントの雛になるべく、少しずつ勉強中です(※2024年1月21日改訂)。

MENU

Excel VBAをはじめから(その04/X)

 仕事で未だに使うことのある\mathrm{Excel\ VBA}を改めて体系的に学びたく

を読んでいく。


power-of-awareness.com

3. VBAの基礎文法

3.2 演算子

3.2.1 計算を行う算術演算子

 算術演算を行う算術演算子は以下のとおりである。

演算
加算
+
減算
-
乗算
*
除算
/
\
剰余
\mathrm{Mod}
冪乗
^
''' 算術演算 '''
'数値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.3 比較演算子

 \mathrm{VBA}の比較演算子は、=, <, >を組み合わせて利用する。

判定内容
等しい =
等しくない <>
より小さい
以下 <=
より大きい >
以上 >=
3.2.4 オブジェクトの比較

 オブジェクトが等しいかを判定する場合、\mathrm{Is}演算子を用いる。なおオブジェクトが存在しない状態を表すには\mathrm{Nothing}を用いる。

'オブジェクト1 Is オブジェクト2
Worksheets(1) Is Worksheets("Sheet1")
Worksheets(1) Is Nothing  ' Nothingはオブジェクトが存在しない状態

ただしセルを\mathrm{Range}で比較するのには\mathrm{Is}演算子を用いると正常に判定しない。

3.2.5 論理演算子

 複数の条件を組み合わせて判定する場合には論理演算子を用いる。

判定の種類
論理積 \mathrm{And} \mathrm{a = a\ And\ b=b}
論理和 \mathrm{Or} \mathrm{a <>b\ Or\ b=b}
論理否定 \mathrm{Not} \mathrm{Not\ a=a}
' セル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 処理の分岐

 処理の分岐では\mathrm{If}ステートメントによるものがまずは重要である。

 \mathrm{If}で始め、条件式を満たす場合に実行する処理を\mathrm{Then}以降の行に記述し、最後に\mathrm{End} \mathrm{If}で挟んで範囲を指定する。

If 条件式 Then
    条件式がTrueの場合に実行するコード
End If

 \mathrm{ElseIf}および\mathrm{Else}を用いることで、複数の条件分岐を載せたり、条件式が\mathrm{False}の場合の処理を載せたりすることができる。

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

 また特定の条件を満たしたらその時点でマクロを終了させたいときには\mathrm{Exit} \mathrm{Sub}ステートメントを用いる。

If Range("A1").Value <> "完了" Then
    MsgBox "入力を完了させてからマクロを実行してください"
    Exit Sub
End If
3.3.2 Select Caseによる条件分岐

 特定の値に注目して細かく処理の流れを分岐したい場合には、\mathrm{Select} \mathrm{Case}ステートメントが利用できる。

Select Case 注目したい対象
    Case1
        対象が値1だった場合の処理
    Case2
        対象が値2だった場合の処理
    Case Else
        対象がリストアップした値(1および値2)以外だった場合の処理
End Select

リストアップする値を指定するには以下のように範囲指定も可能である。

範囲
記述
内容
特定の値
\mathrm{Case\ 1}
値が「1」
複数の値のいずれか
\mathrm{Case}\ 1,3,5
値が「1」「3」「5」のいずれか
範囲指定①
\mathrm{Case\ Is}\ \lt\ 5
値が「5」未満
範囲指定②
\mathrm{Case\ }1\ \mathrm{To}\ 5
値が「1」~「5」
リストアップした値以外
\mathrm{Case\ Else}
リストアップした値以外
3.3.3 ループ処理

 \mathrm{For}ステートメントを用いるとループ処理ができる。
 \mathrm{For}単体では、イテレータでループ数をカウントしつつ処理を行う。他方で\mathrm{For} \mathrm{Each}ステートメントを用いると、指定したリストのメンバー全てに対する繰り返し処理を行う。

' 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

 \mathrm{For}\mathrm{Next}ステートメントは、ループ処理を行う「数」または「回数」を指定する。このとき更に\mathrm{Step}キーワードを併記すると、カウンタ用変数の増減方向や間隔を指定できる。

Dim i As Long
For i = 10 To 1 Step -1
    Debug.Print "イテレータの値:", i
Next

 またある複数の値にループ処理をしたい場合、\mathrm{Array}関数を利用して配列を作成し、配列の要素を順番に表示させればよい。

' Arrayを用いたFor Each
Dim tmpList As Variant, tmp As Variant

tmpList = Array("巨人", "阪神", "広島", "ヤクルト", "中日", "横浜")

For Each tmp In tmpList
    Debug.Print tmp
Next

余談

 関数とメソッドは違いがあり、オブジェクトに依存せずに呼び出せるものが関数で、オブジェクトに定義されておりオブジェクト経由で呼び出すのがメソッドである。またステートメント\mathrm{VBA}の文法的な仕組みとして定義されるという違いがある。また\mathrm{VBA}ではオブジェクトブラウザにおいて単なるモジュールに定義されているものを関数、オブジェクトに定義されているものはメソッドないしプロパティと言える。

*1:+でも結合できるが、加算演算と紛らわしいため、こちらを用いた方が良い。

プライバシーポリシー お問い合わせ