プログラム開発メモ

プログラム開発で忘れがちなこと、役だったことを自分のためにメモしていくブログです。

【ExcelVBA】for文 GoToでループをスキップする

ある条件の場合はそれ以降の処理を省略し、ループ内の先頭の記述にスキップする。

VBA以外のプログラミング言語だとcontinueを使うのが一般的。

 

Sub sample1()

  Dim i As Integer

  Dim sum As Integer

 

  For i = 2 To 10

L1:

    If Not IsNumeric(Range("B" & i)) Then

      i = i + 1

      GoTo L1

    End If

 

    sum = sum + Range("B" & i)

  Next i

 

  MsgBox "合計点数は" & sum & "点です"

End Sub

【ExcelVBA】for文 Exit Forでループを抜ける

ある条件に合致した場合にループを抜けるなど。

 

 Sub sample1()

   Dim i As Integer

   Dim subject As String

 

   For i = 2 To 10

     If Not IsNumeric(Range("B" & i)) Then

       subject = Range("A" & i)

       Exit For

     End If

   Next i

 

   MsgBox subject & "には数値以外の値が入っています"

 End Sub

 

【ExcelVBA】for文

■構文

 For カウンタ名 = 初期値 To 到達値

   処理

 Next カウンタ名

 

■例

 Sub sample1()

   Dim arr() As Variant

   Dim i As Integer

   Dim str As String

   arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

 

   For i = 0 To 9

     str = str & arr(i) & ", "

   Next i

 

   MsgBox str

 End Sub

 

■Stepの使い方

 For カウンタ名 = 初期値 To 到達値 Step 増減数

   処理

 Next カウンタ名

  ※増減数が1の場合は「Step 増減数」の部分は省略可

 

 Sub sample2()

   Dim arr() As Variant

   Dim i As Integer

   Dim str As String

   arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

 

   For i = 0 To 9 Step 2

     str = str & arr(i) & ", "

   Next i

 

   MsgBox str

 End Sub

 

 Stepステートメントでマイナス値を指定すると、デクリメント(マイナス)で

 逆順にループを回すことができる。

 

 Sub sample3()

   Dim arr() As Variant

   Dim i As Integer

   Dim str As String

   arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

 

   For i = 0 To 9 Step -2

     str = str & arr(i) & ", "

   Next i

 

   MsgBox str

 End Sub

 

 

【ExcelVBA】if文

■構文

 If 条件式1 Then

   処理1

 ElseIf 条件式2 Then

   処理2

 Else

   処理3

 End If

 

■例

 Sub sample1()

   Dim year As Integer

   Dim str As String

 

   'うるう年の場合

   year = 2016

   If year Mod 4 = 0 Then

     str = str & year & "年はうるう年です。" & vbCrLf

   Else

     str = srt & year & "年はうるう年ではありません。" & vbCrLf

   End If

 

   'うるう年でない場合

   If year Mod 4 = 0 Then

     str = str & year & "年はうるう年です。" & vbCrLf

   Else

     str = srt & year & "年はうるう年ではありません。" & vbCrLf

   End If

 

   MsgBox str, vbInformation

 End Sub

【ExcelVBA】配列

■配列の宣言、定義

 ・固定長配列

   Dim 配列名(添字の上限値) As データ型名

 

 ・可変長配列

   Dim 配列名() As データ型名

 

■初期化

 ・Eraseステートメントを使う方法

   Erase 配列名

 

   初期値はデータ型によって異なる。

   ・数値配列:0(ゼロ)

   ・文字列配列:長さ0(ゼロ)の文字列

   ・オブジェクト配列:Nothing

   ・バリアント配列:Empty

 

 ・Array関数を使う方法

   Dim 配列名() As Variant

   配列名 = Array(要素(0), 要素(1), ・・・)

 

■ReDimで再定義

 ReDim 配列名(添字)

 配列に代入されたデータを保持したまま要素数を変更する場合

 ReDim Preserve 配列名(添字)

 データ型の変更も可能だが、変更できるのは可変長配列の宣言時に

 バリアント型で宣言した場合のみ。

 

■2次元配列(多次元配列)

 Dim 配列名(添字の上限値, 添字の上限値, ・・・) As データ型名

 次元ごとに「,」(カンマ)で区切って「()」内に並べる。

 

■セル範囲の値を配列の要素に一括で代入する

 Sub Sample1()

   Dim arr As Variant

   arr = WorksheetFunction.Transpose(Range("A1:B5"))

 

   Dim msg As String

   Dim i As Integer

   Dim j As Integer

 

   For i = 1 To 5

     For j = 1 To 2

       msg = msg & arr(j, i) & ", "

     Next j

     msg = msg & vbCrLf

   Next i

 

   MsgBox msg

 End Sub

 

 配列arrの要素の値にアクセスするためのインデックス番号が

 0からでなく1から始まっている。

 Transpose関数により行と列が入れ替わっている。

 

■要素の値をセルに代入する

 Sub Sample2()

   Dim arr(2, 5) As Variant

   Dim msg As String

   Dim i As Integer

   Dim j As Integer

 

   For i = 0 To 4

     For j = 0 To 1

       arr(j, i) = i + 1 + 10 * j

       msg = msg & arr(j, i) & ", "

     Next j

     msg = msg & vbCrLf

   Next i

 

   Range("A1:B5") = WorksheetFunction.Transpose(arr)

 

   MsgBox msg

 End Sub

 

 Transpose関数を使って行と列を入れ替えて配列要素の値をセルに格納。 

 

■UBound、LBoundで配列の要素数を取得する

 配列の要素数を取得するには以下の式で計算し取得する。

 

  要素数 = UBound関数の戻り値 - LBound関数の戻り値 + 1

 

■Forループで操作する方法

 Dim i As Integer

 For i = LBound(arr) To UBound(arr)

   'arr(i)を使った処理

 Next i

 

■For Eachで操作する方法

 Dim Var As Variant

 For Each Var In arr

   'Varを使った処理

 Next Var

【ExcelVBA】演算子

比較演算

No. 演算子 説明 得られる結果
1 < 小さい 8 < 5 FALSE
2 <= 以下 3 <= 8 TRUE
3 > 大きい 8 > 5 TRUE
4 >= 以上 3 >= 8 FALSE
5 = 等しい 3 = 8 FALSE
6 <> 等しくない 3 <> 8 TRUE

 

算術演算

No. 演算子 説明 得られる結果
1 + 足し算 8 + 5 13
2 - 引き算 10 - 4 6
3 * 掛け算 3 * 5 15
4 / 割り算 8 / 5 1.6
5 \ 割り算の商 8 \ 5 1
6 Mod 割り算の余り 8 Mod 5 33
7 ^ べき乗 6 ^ 2 36

 

論理演算

No. 演算子 説明 得られる結果
1 And 論理積 8 > 4 And 2 <= 3 TRUE
2 Or 論理和 8 > 4 Or 4 <= 1 TRUE
3 Not 論理否定 Not 8 > 4 FALSE