この記事では、VBAで使用されるさまざまな種類のループと、それらを使用して同じタスクをさまざまな方法で実行する方法について説明しました。

なぜループするのですか?

ループは、多くのプログラミング言語で使用されている最も強力なプログラミング手法の1つです。ループは、必要な回数、または特定の条件がtrueと評価されるか特定の値に達するまでコードのブロックを繰り返すために使用され、その後、次のコードのブロックが実行されます。

Excel VBAループの目的は、Excelにコードの一部を特定の回数繰り返させることです。コードを何回繰り返す必要があるかを、固定数(たとえば、これを10回行う)または変数(たとえば、データの行の数だけ行う)として指定できます。

Excelループは、さまざまな状況に合わせてさまざまな方法で構築できます。多くの場合、個人的な好みに合わせて、さまざまな方法で同じ結果を得ることができます。

Excel VBAで使用できるループには、次の3種類があります。

  1. DOUNTILループ2.DOWHILEループ3.FORループ 1。 DOUNTILループDOUNTILループは、指定された条件がTrueに設定されるまで、コードのブロックを無期限に繰り返すために使用されます。条件は、ループの開始時または終了時にチェックできます。 DOUNTIL…LOOPステートメントは最初に条件をテストしますが、DO…LOOPUNTILステートメントはループの最後に条件をテストします。

DOUNTILの構文…LOOPステートメント

[条件]まで行う

{空} [繰り返されるコードのブロック]

ループ

DOの構文…LOOPUNTILステートメント

[繰り返されるコードのブロック]を実行します

[条件]までループ

DO…UNTILループについて例を挙げて説明しました。 Loop1およびLoop2マクロは、DO…UNTILループを使用して列Aおよび列Bの数値の平均を計算するために使用されます。

サンプルデータはA15:B27の範囲にあります。列Aにはラウンド1のス​​コアが含まれ、列Bにはラウンド2のスコアが含まれます。列Cのラウンド1とラウンド2のスコアの平均を計算します。

Sample1

Loop1マクロでは、「FormulaR1C1」を使用して、アクティブセルに平均数式を挿入しました。 DO UNTILループの条件ステートメントは、ループの最後でチェックされます。

Loop2マクロでは、「WorksheetFunction.Average」を使用してアクティブセルに平均値を挿入しました。このマクロでも、ループの最後で条件ステートメントがチェックされます。

Loop1マクロとLoop2マクロの唯一の違いは、Loop1が平均式を挿入するのに対し、Loop2は平均を計算してから、アクティブセルに平均値を挿入することです。

OutputSample1

{空} 2。 DOWHILEループDOWHILEループは、コードのブロックを無期限に繰り返すために使用されますが、指定された条件は引き続きTrueであり、条件がFalseを返すと停止します。条件は、ループの最初または最後にチェックできます。 DOWHILE…LOOPステートメントは最初に条件をテストしますが、DO…LOOPWHILEステートメントはループの最後に条件をテストします。 DO…LOOPWHILEステートメントは、条件をチェックする前にループでコードのブロックを少なくとも1回実行する場合に使用されます。

DOWHILEの構文…LOOPステートメント

[条件]中に行う

{空} [繰り返されるコードのブロック]

ループ

DOの構文…LOOPWHILEステートメント

[繰り返されるコードのブロック]を実行します

ループWhile [条件]

この例では、Loop3マクロとLoop4マクロを使用して、列Aと列Bのセルの値の平均を計算します。両方のマクロは、マクロLoop1とLoop2で使用されるのと同じサンプルデータで機能します。どちらもDOWHILEステートメントを使用して、データを含む範囲をループします。

Loop3マクロとLoop4マクロの唯一の違いは、DOWHILEループの条件を表す方法が異なることです。

Loop3マクロとLoop4マクロは同じ入力データを使用し、Loop1マクロと同じ機能を実行するため、返される出力もLoop1マクロと同じになります。

{空} 3。 FORループForループは、コードのブロックを特定の回数繰り返すために使用されます。

FORループの構文

count_variable = start_valueの場合end_value [コードのブロック]

次のcount_variableLoop5マクロは、FORループを使用して平均を計算する方法を示しています。また、他のマクロで使用されているものと同じサンプルデータを使用します。サンプルデータは15 ^番目の行から始まるため、開始値として15を使用しました。 Range( “A”&Cells.Rows.Count).End(xlUp).Rowを使用して、データを含む最後の行を検索しました。 FORループは(lastcell-15)回繰り返されます。

Loop5マクロの実行後に返される出力は、Loop1マクロの場合と同じです。

Loop6マクロは、マクロを実行する前に平均機能を持つアクティブセルが空の場合にのみ、平均を計算するために作成されます。

このマクロのサンプルデータは、E15からG27の範囲にあります。

Sample2

DO…LOOPWHILEを使用して、定義された範囲をループしました。 IFステートメントは、関数が挿入されるセルに値が含まれているかどうかを確認するために使用されます。このマクロは、セルが空の場合にのみ平均関数をセルに挿入します。

OutputSample2

Loop7マクロは、平均の計算にも使用されます。再度ループするかどうかを評価する前に、ヘルパー列の値をチェックします。また、平均関数で使用されるセル参照が空であるかどうかもチェックします。

Loop7マクロに使用されるサンプルデータは、J15:M27の範囲です。

Sample3

列Mはヘルパー列として使用されます。このマクロは、列Mのセルが空でない場合にのみ平均関数を挿入します。このマクロは、平均関数を挿入する前に、セルが空であることを確認します。平均関数で参照されているセルが空の場合、平均関数は挿入されません。

OutputSample3

コードについては以下に従ってください

Option Explicit

Sub Loop1()

'Calculating average

'Do Until loop will loop until cell in the previous column of active cell is empty

Range("C15").Select

Do

'Assigning average function on value in cells of previous two consecutive columns

ActiveCell.FormulaR1C1 = "=Average(RC[-1],RC[-2])"

'Moving to cell in next row

ActiveCell.Offset(1, 0).Select

'Checking whether value in cell of previous column is empty

'Do Until loop will loop until condition statement returns True

Loop Until IsEmpty(ActiveCell.Offset(0, -1))

Range("A15").Select

End Sub

Sub Loop2()

'Calculating average

'Do Until loop will loop until cell in the previous column of active cell is empty

'This macro is similar to macro Loop1, only way of calculating average is different

Range("C15").Select

Do

'Worsheet.Average function is used for calculating the average

ActiveCell.Value = WorksheetFunction.Average(ActiveCell.Offset(0, -1).Value, _

ActiveCell.Offset(0, -2).Value)

ActiveCell.Offset(1, 0).Select

Loop Until IsEmpty(ActiveCell.Offset(0, -1))

Range("A15").Select

End Sub

Sub Loop3()

'Calculating average

'Do While loop will run until cell in the previous column of active cell is empty

Range("C15").Select

'Checking whether value in cell of previous column is empty

'Do While loop will loop until condition statement is True

Do While IsEmpty(ActiveCell.Offset(0, -1)) = False

'Assigning average function on value in cells of previous two consecutive column

ActiveCell.FormulaR1C1 = "=Average(RC[-1],RC[-2])"

'Moving to cell in next row

ActiveCell.Offset(1, 0).Select

Loop

Range("A15").Select

End Sub

Sub Loop4()

'Calculating average

'Do While loop will run until cell in the previous column of active cell is empty

'This macro is similar to macro Loop3, only way of applying condition is different

Range("C15").Select

Do While Not IsEmpty(ActiveCell.Offset(0, -1))

ActiveCell.FormulaR1C1 = "=Average(RC[-1],RC[-2])"

ActiveCell.Offset(1, 0).Select

Loop

Range("A15").Select

End Sub

Sub Loop5()

'FOR loop repeats for a fixed number of times determined by the number of rows

Dim i, lastcell As Long

'Finding the last row containing data in column A

lastcell = Range("A" & Cells.Rows.Count).End(xlUp).Row

Range("C15").Select

'i variable is assigned value of 15 as our sample data begin from 15th row

'FOR Loop will loop x

For i = 15 To lastcell

ActiveCell.FormulaR1C1 = "=Average(RC[-1],RC[-2])"

ActiveCell.Offset(1, 0).Select

Next i

Range("A15").Select

End Sub

Sub Loop6()

'Calculating average

'Do Until loop will loop until cell in the previous column of active cell is empty

'It does not calculate an average if there is already something in the cell

Range("G15").Select

Do

If IsEmpty(ActiveCell) Then

ActiveCell.FormulaR1C1 = "=Average(RC[-1],RC[-2])"

End If

ActiveCell.Offset(1, 0).Select

Loop Until IsEmpty(ActiveCell.Offset(0, -1))

Range("E15").Select

End Sub

Sub Loop7()

'Do Until loop runs as long as there is something in cell in next column

'It does not calculate an average if there is already something in the active cell

'Nor if there is no data in cells which are used within average function (to avoid #DIV/0 errors).

'Calculating average

Range("L15").Select

Do

If IsEmpty(ActiveCell) Then

If IsEmpty(ActiveCell.Offset(0, -1)) And IsEmpty(ActiveCell.Offset(0, -2)) Then

ActiveCell.Value = ""

Else

ActiveCell.FormulaR1C1 = "=Average(RC[-1],RC[-2])"

End If

End If

ActiveCell.Offset(1, 0).Select

Loop Until IsEmpty(ActiveCell.Offset(0, 1))

Range("J15").Select

End Sub

このブログが気に入ったら、FacebookやFacebookで友達と共有してください。

私たちはあなたから話を聞くのが大好きです、私たちがどのように私たちの仕事を改善し、あなたのためにそれをより良くすることができるかを私たちに知らせてください。 [email protected]までご連絡ください