同じような作業を繰り返し実行する手間を省くために、プログラミングを行います。
そのためには、どのプログラム言語においても「繰り返し処理」のやり方を理解しなければなりません。
初めてプログラミングを経験する人が一番挫折しやすいと思われるポイントが、この「繰り返し処理」です。
最初はどうしても頭が混乱しやすいかと思います。。
今日は、Excel VBA での「繰り返し処理」の方法である For文について説明したいと思います。
1、同じ処理を繰り返すケース
例えば、下↓の表の1~12月の各月の売上高(C列)と売上原価(D列) のデータから、売上総利益を計算して E列に出力する場合を考えて見ます。
*この計算は、VBA を使わずに Excel の四則演算機能だけでもできることですが、ここでは敢えて VBA を使います。
その場合、VBE(エディタ)を開き(Alt + F11 で開く)以下のコードを記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Sub Test() Dim Uriage '売上' Dim Uriagegenka '売上原価' For i = 1 To 12 Uriage = Worksheets("Sheet1").Cells(5 + i, 3).Value Uriagegenka = Worksheets("Sheet1").Cells(5 + i, 4).Value '↓売上総利益の計算、出力' Worksheets("Sheet1").Cells(5 + i, 5).Value = Uriage - Uriagegenka Next i End Sub |
*VBE(エディタ)中では、1つの行の中で最初に出てくるカンマ「’」以降に書いた文字はコメントアウトされます
(プログラムとして機能しなくなる)。
私の場合、どのような処理を行っているか後で自分が見て分かりやすくするために使うことが多いです。
例:「’↓売上総利益の計算、出力’」
さて、冒頭に記述した
Dim Uriage ‘売上’
Dim Uriagegenka ‘売上原価’
これらは、変数を定義したものです。
「これから、これらの変数をつかいますよ!!」というのを、あらかじめ冒頭で示しておきます。
これらの定義をしなくてもプログラムは一応は機能します。
まぁ、ここではとりあえずのおまじないみたいなものと思って頂ければ良いです。
そして、「For i = 1 To 12」と「Next i」の間に記述した部分で、「1~12月分の売上総利益の計算と出力」という処理を行っています。
このプログラムを実行すると、一瞬で以下↓のように売上総利益が表示されます。
さて、最初にいきなりすべてのコードを書いてしまいましたが、一つ一つ順に説明していきたいと思います。
2、For 文を使わない場合
繰り返し処理の概念を理解するために、まず For 文を使わずに記述する場合を考えてみたいと思います。
まず、1月分の売上総利益の計算と出力を行うためには以下のようなコードを書きます。
1 2 3 4 5 6 7 8 9 10 11 12 |
Sub Test1() Dim Uriage '売上' Dim Uriagegenka '売上原価' Uriage = Worksheets("Sheet1").Cells(6, 3).Value Uriagegenka = Worksheets("Sheet1").Cells(6, 4).Value '↓売上総利益の計算、出力' Worksheets("Sheet1").Cells(6, 5).Value = Uriage - Uriagegenka End Sub |
セルの行番号と列番号の関係は下の図のようになります。
1 |
Uriage = Worksheets("Sheet1").Cells(6, 3).Value |
1 |
Uriagegenka = Worksheets("Sheet1").Cells(6, 4).Value |
1 |
Worksheets("Sheet1").Cells(6, 5).Value = Uriage - Uriagegenka |
単純な引き算です。
一応説明しますと、売上から売上原価をマイナスしたものが売上総利益(粗利)になります。
さて、以上で1月分のみの売上総利益の計算と出力の処理はできるようになりす。
プログラムを実行して確認してみましょう↓
さて、この処理を For 文を使わずに12ヶ月分繰り返すとどうなるでしょうか。
仮に6ヶ月分(1~6月)の計算をする場合、コードはこのようになります↓
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
Sub Test1() Dim Uriage '売上' Dim Uriagegenka '売上原価' '1月分' Uriage = Worksheets("Sheet1").Cells(6, 3).Value Uriagegenka = Worksheets("Sheet1").Cells(6, 4).Value '↓売上総利益の計算、出力' Worksheets("Sheet1").Cells(6, 5).Value = Uriage - Uriagegenka '2月分' Uriage = Worksheets("Sheet1").Cells(7, 3).Value Uriagegenka = Worksheets("Sheet1").Cells(7, 4).Value '↓売上総利益の計算、出力' Worksheets("Sheet1").Cells(7, 5).Value = Uriage - Uriagegenka '3月分' Uriage = Worksheets("Sheet1").Cells(8, 3).Value Uriagegenka = Worksheets("Sheet1").Cells(8, 4).Value '↓売上総利益の計算、出力' Worksheets("Sheet1").Cells(8, 5).Value = Uriage - Uriagegenka '4月分' Uriage = Worksheets("Sheet1").Cells(9, 3).Value Uriagegenka = Worksheets("Sheet1").Cells(9, 4).Value '↓売上総利益の計算、出力' Worksheets("Sheet1").Cells(9, 5).Value = Uriage - Uriagegenka '5月分' Uriage = Worksheets("Sheet1").Cells(10, 3).Value Uriagegenka = Worksheets("Sheet1").Cells(10, 4).Value '↓売上総利益の計算、出力' Worksheets("Sheet1").Cells(10, 5).Value = Uriage - Uriagegenka '6月分' Uriage = Worksheets("Sheet1").Cells(11, 3).Value Uriagegenka = Worksheets("Sheet1").Cells(11, 4).Value '↓売上総利益の計算、出力' Worksheets("Sheet1").Cells(11, 5).Value = Uriage - Uriagegenka End Sub |
売上と売上原価を読み込むセルの行数と、売上総利益を出力するセルの行数を1行ずつ順番に進めています。
売上で言えば、1月分の読込みの場合
1 |
Uriage = Worksheets("Sheet1").Cells(6, 3).Value |
としてセル「C6」から読み込んでいるのを、月数が増えるにしたがってセルの行数を1行ずつ追加していってます。
・2月分
1 |
Uriage = Worksheets("Sheet1").Cells(7, 3).Value |
・3月分
1 |
Uriage = Worksheets("Sheet1").Cells(8, 3).Value |
・4月分
1 |
Uriage = Worksheets("Sheet1").Cells(9, 3).Value |
・5月分
1 |
Uriage = Worksheets("Sheet1").Cells(10, 3).Value |
・6月分
1 |
Uriage = Worksheets("Sheet1").Cells(11, 3).Value |
売上原価の読込みと、売上原価の計算・出力も同様です。
さて、先に6ヶ月分のコードを書きましたがこれら12ヶ月分になるとさらに長くなってしまします。。。
3、For 文の使い方
上記のように同じ処理の繰り返しのコードを書く際に、12ヶ月分の読込みと計算をだらだら長く書いてしまうと記述だけで大変です。
そこでだいたいの場合、このような繰り返し処理には「For文」を使うことになります。
For文はこのように↓ For と Next の間にコードを記述することになります。
冒頭で書いたものと同じコードですがこのようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Sub Test() Dim Uriage '売上' Dim Uriagegenka '売上原価' For i = 1 To 12 Uriage = Worksheets("Sheet1").Cells(5 + i, 3).Value Uriagegenka = Worksheets("Sheet1").Cells(5 + i, 4).Value '↓売上総利益の計算、出力' Worksheets("Sheet1").Cells(5 + i, 5).Value = Uriage - Uriagegenka Next i End Sub |
For i = 1 To 12 は
「変数 i を1から12まで1ずつ増加させる」という処理を行っており
Next i は
「次の i に進む(今が i=2 ならば i=3)」という処理を行っています。
上記の「For i = 1 To 12」と 「Next i」の間で i の値は一定になります。
売上の読込みで言えば
1月分の読込みの場合 i=1 となり
1 |
Uriage = Worksheets("Sheet1").Cells(5 + i, 3).Value |
は
1 |
Uriage = Worksheets("Sheet1").Cells(6, 3).Value |
と同じ意味になります。
2月分の読込みの場合 i=2 となり
1 |
Uriage = Worksheets("Sheet1").Cells(5 + i, 3).Value |
は
1 |
Uriage = Worksheets("Sheet1").Cells(7, 3).Value |
と同じ意味になります。
このように i の値を1~12まで1つずつ増やしていき12ケ月分の処理を行うことになります。
Excel 上での行数は、i の数よりも 5 大きいので行数の指定の仕方は
「5 + i 」と記述することになります。
i の数と、処理を行う行数の関係はこのように↓なります。
i の値が1つ増えるに従って、シート上で処理を行う行数も1行ずつ増えていくという感覚を身に付けて頂きたいと思います。
4、まとめ
以上、「繰り返し処理」を行うために必要な For 文について説明しました。
「i の値が1つずつ増えていき、処理を繰り返す」という概念は、最初はなかなかとっつきづらくプログラミングをはじめたばかりの人は挫折しやすいポイントだと思います。
しかし、繰り返し処理でこそ Excel VBA は最大限の効力を発揮するので、この For文を身に付けて使いこなせるようになれば、様々なことに応用できるようになります!!