【初心者向けエクセルVBA】For~Next文で簡潔にプログラムを書く

★気に入ったらシェアをお願いします!


Nest

Kapa65 / Pixabay

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

今回は請求データ一覧から請求書を自動で作成するを目的とした初心者向けエクセルVBA講座の第2回で

【初心者向けエクセルVBA】データ一覧から請求書を自動で作る
初心者向けVBAの実用的な使い方について、請求データ一覧から請求書を自動で作成するを目標に進めます。初回はシートを取り扱うためのWorksheetオブジェクトの準備とセルの値の操作についてお伝えします。

こちらの記事の続きです。

エクセルVBAでは特定のデータを別のところに転記する、いわゆるコピー&ペーストを自動化するという処理がよく活用されていますが、その際にセルの一つ一つについていちいち記述するのは面倒ですしミスも多くなります。

そのような繰り返しのときはFor~Nextを使うとスッキリします。前回の例を用いて解説をしていきますね。

コンピュータは繰り返しが大得意ですので、しっかり命令をして私たちの代わりに大いに働いてもらいましょう。

では、いってみます!

スポンサーリンク

前回のおさらい:一つ一つのセルをいちいちコピペ…

「請求データ」シートから「請求書ひな形」にデータを転記するというプログラムを作りました。

はい、明らかにダルい書き方です。

10行目から22行目までがセルを一つ一つコピペをするような命令になっています。

いちいち記述するのが面倒ですし、行数や列数の数値を間違えてしまいそうです。

こういうときはFor~Nextを使う絶好のチャンス!

For~Next文の書き方

For カウント用変数 = 最初の値 To 最後の値

(繰り返したい処理)

Next カウント用変数

このように書きます。

カウント用変数For~Nextを繰り返すたびに値が1ずつ加算されていくという特性を持つ変数で、たいがいiやjなどのアルファベット1文字の変数を使います。

エクセルVBAの場合は繰り返しながら行や列を移動しながら何かしらかの処理をする場合が多いので、1つずつ増えてくれるという特性は大変重宝します。

従ってFor~Nextの構文で決めるべきは最初の値、最後の値、処理内容の3つを決めるだけです。

具体的な例ですと

これは、「イミディエイトウィンドウにiの内容を表示する」という処理をi=1からi=3になるまで繰り返すということになりますので、結果としては

For~Nextの例

と表示されます。

For~Nextで行を移動しながらコピぺを繰り返し

今回のケースでは「請求データ」シートの2行目から4行目のデータを

請求データ

「請求書ひな形」の21行目から23行目に

請求書ひな形

それぞれ転記するという繰り返し処理をします。

繰り返しが3回なので最初の値を1、最後の値を3としたいところですが、ちょっと工夫して最初の値を0、最後の値を2とします。

iの初期値を0とすると、セルの行数の指定それぞれのシートの開始行+iというシンプルな指定の仕方とすることができます。

一方でiの初期値を1、最終値を3としますと、

というように各セルの行数を「-1」する必要が出てきます。

それぞれのシートの開始行は「請求書ひな形」は21行目、「請求データ」は2行目なのですが、カウント変数の初期値i=1を足し算してしまった状態でFor~Nextを開始すると、「請求書ひな形」は22行目、「請求データ」は3行目からスタートすることになってしまいます。

従って、セルの行数の指定で-1をしなくてはいけなくなります。

どちらでも正しく動くのですが、セルの位置の指定方法として、使いやすい方をセレクト頂ければと思います。

For~Next文を入れ子にして列方向にも繰り返す

さて、これでだいぶスッキリさせることができたのですが、さらに簡略化することができます。

この部分ですが、1列目から始まって3列目まで同じ処理を繰り返していますので、この部分もFor~Nextで置き換えることができます。

列方向の移動については、iとは別の新たなカウント変数jを用いて

とすることができます。

元々のプログラムが何だったのか、というくらいスッキリしましたね。

このようにFor~Next文の中に、For~Next文を記述するような書き方を入れ子といいます。

コピペの自動化の場合は、行移動に繰り返す中に列移動の繰り返しを入れ子するというのが非常にスタンダードな方法ですので、ぜひマスターしちゃってください。

まとめ

今回はFor~Next文をガッツリと解説させて頂きました。

全体のプログラムはこちらです。

エクセルVBAの場合、コピペの自動化をはじめFor~Next文はかなり使いますので、ここでしっかり慣れて頂けると良いです。

また、For~Nextの考え方や記述法はVBAに限らず、様々なプログラム言語で応用が利く汎用性の高いものです。エクセルVBAですと、実際に”表”という形で視覚的に動きを見ることができますので、プログラミング初心者としてはとても入りやすいと思います。

次回はこのプログラムをさらに発展させて、より実用的なものに近づけていますので、合わせてお読みください。

【初心者向けエクセルVBA】行の数をカウントする&不要な行を隠す
今回は行数をカウントする、行を隠す、などの「行を取り扱うテクニック」を紹介しています。いずれもデータや帳票を扱ったエクセルVBAではかなり重宝するテクニックですので、知っておいて損はありませんよ。

では、またお会いしましょう!

連載目次:データ一覧から請求書を自動で作る

  1. 【初心者向けエクセルVBA】データ一覧から請求書を自動で作る
  2. 【初心者向けエクセルVBA】For~Next文で簡潔にプログラムを書く
  3. 【初心者向けエクセルVBA】行の数をカウントする&不要な行を隠す
  4. 【初心者向けエクセルVBA】文字列の連結&Format関数での書式変更
  5. 【初心者向けエクセルVBA】If~Thenを使った条件分岐の超入門
  6. 【初心者向けエクセルVBA】Public変数の宣言とSubプロシージャの呼び出し
  7. 【初心者向けエクセルVBA】InputBoxでの日付入力と月末日の自動算出
  8. 【初心者向けエクセルVBA】Worksheetのコピーを活用して複数の請求書を作る
  9. 【初心者向けエクセルVBA】ファイルのコピーを使って取引先別の請求書を作る


コメント

  1. Nats より:

    Cells(21 + i, j)のセルが、結合されたセルだった場合、どのようなコードを使用すればよいでしょうか。
    MargeAreaとかためしているのですが、エラーがでて困っております.
    よろしくお願いいたします.