GEN MUTO'S HOMEPAGE  エクセル大事典  エクセルVBA超入門

エクセルExcel大事典 エクセル大事典TOPページへ
 ■ エクセルVBA超入門−9ステップで"Hello World!"からオブジェクト指向まで!
  VBAで繰り返し処理
 
■ 楽をしたいから繰り返し
 
さて、前回で作ったプログラム。セルA1のデータをセルB1に加工して書き出す…ですが、あまりありがたく感じませんよね。
データひとつの書き換えなら正直、手でやったほうが早いです。
プログラムにありがたみを感じるのは、変換するデータが膨大な数にのぼるときです。
つまり繰り返し処理が必要な時ということです。
前回のtestプロシージャを繰り返しできるように改造してみましょう。

Public Sub test()
Dim MyStr As String
Dim i As Long
  For i = 1 To 100
    MyStr = Range("A" & i)
    If MyStr <> "" Then
      Range("B" & i) = "Hello" & MyStr & "!"
    End If
  Next i
End Sub

うん。とってもまずいコードですね。とりあえずこれでやってみましょう。セルA1、A2、A3、くらいに適当な名前を入れて実行してみてください。
B列に"Hello〜"つきのデータが出力されたと思います。まず、For〜Nextの説明です。
3行目にiという変数がLong型で宣言されていますね。このiのことをカウンタとよび通常、整数型で宣言します。
For i = 1 To 100 はiが1からスタートして1づつ増えていき100になるまで繰り返せという意味です。1づつ増えるという指定のStep 1 は省略しています。(省略した場合のデフォルトはStep 1)
カウンタのiは一般的によく使われる変数名ですが別にMyCounterでもかまいません。またカウンタは必ず1から始まる必要はなくどんな数でもかまいません。
For i = 0 To 99 でもちゃんと100回繰り返します。
さてこのコード、いったいどこがまずいのでしょう?

まず繰り返しの上限値が100回なのでデータ数が100を超えると、その部分は無視されちゃいます。さらにデータ数が100未満でも律儀に100回繰り返します。
画面上の変化はありませんがセルA100まで、毎回キッチリとデータを見にいってます。
これはだめなコードのいい見本ですね。
ではもう一つの繰り返し処理をご紹介します。Do〜Loopです。

Public Sub test()
Dim MyStr As String
Dim i As Long
  i = 1
  Do
    MyStr = Range("A" & i)
    If MyStr <> "" Then
      Range("B" & i) = "Hello" & MyStr & "!"
    End If
    i = i + 1
  Loop Until Range("A" & i) = ""
End Sub

うん。ちょっとゴチャゴチャしちゃいましたね。まず、i=1 と i=i+1 が増えましたね。これはFor〜Nextのときは自動的にカウンタを増分してくれたのですが、Do〜Loopはやってくれないので手動で行う必要があります。
それはDo〜Loopは「何回繰り返す」という命令ではなく「条件が真になるまで繰り返す」命令だからです。
その条件は
Loop Until Range("A" & i) = ""
の部分です。ここはその直前で増分したiを使ってA列i行のセルを見にいっています(つまりA3の処理をした時点で次のA4セル)。そしてそのセルが空のときに繰り返しを終えます。
Untilは「条件が真になるまで」繰り返せという意味です。逆に「条件が真のあいだは」繰り返せと命令することもできます。Whileを使います。
Loop While Range("A" & i) <> ""
これでも全く同じに動きます。A列の次のセルが空でない(データがある)あいだは繰り返せという意味になります。
ちょっとましになりましたね。

これでデータ数が100を超えても大丈夫ですし、100未満ならデータが無くなった時点で処理を終了します。
でもまだちょっと問題があります。A列のデータが歯抜けだった場合、そこで処理が止まってしまいます。
歯抜けのデータがある場合はいったいどうしたらいいのでしょう?

要するに問題なのは繰り返しの回数が分らないことなのです。
A列にあるデータの最終行さえわかれば繰り返し回数を指定できるのです。早速やってみましょう。

Public Sub test()
Dim MyStr As String
Dim i As Long
  For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
    MyStr = Range("A" & i)
    If MyStr <> "" Then
      Range("B" & i) = "Hello" & MyStr & "!"
    End If
  Next i
End Sub

最初のFor文と同じです。ただひとつ違うところはカウンタの上限値に
Cells(Rows.Count, 1).End(xlUp).Row
をつかっているところです。
なんじゃこりゃ?そうおもったあなた、ちゃんと一つづつ説明しますからご安心を。
まずRows.Countですが言葉のとおりエクセルの行数です。Excel2003までは65536行、Excel2007は1048576行になります。
 
 
 
Cellsはセルを(行,列)番地で指定できるプロパティです。Cells(Rows.Count, 1)はセル(最終行, 1列目)ということです。Excel2003までならRange("A65536")と同じ意味になります。
簡単にいえばA列の一番下にあるセルのことです。そこから.End(xlUp).Row は上に見ていってデータが見つかった最初のセルの行数を返せという意味になります。
たとえばA列に100行までデータが入っていることにしましょう。この命令でA列を最終行から順に見ていって最初にデータが見つかった行番号(つまり100)を返します。

これならデータが歯抜けでもなんでも、ちゃんとデータの入力されている最終行まで処理し、きちんとそこで処理を終えます。
ちなみに最終列を取得する場合は、
Cells(1, Columns.Count).End(xlToLeft).Column
です。この二つはとてもよくつかいますので覚えておいてください。

さて二つの繰り返し処理を説明しました。他にも繰り返し処理はあるのですがほとんどの場合、For文とDo文で事足ります。
たった二つですのでしっかりとマスターしてください。

※ 繰り返し処理についての詳細な解説はこちらを参照ください。
  いろいろな繰り返し処理

 

>> 次の話にすすむ


サイト内検索ができます

Microsoft Most Valuable Professional

Microsoft MVP Excel
武藤 玄 プロフィール
 

本を執筆しました
ストーリーで学ぶ Excel VBAと
業務改善のポイントがわかる本

Webでは書ききれなかった技術的
解説や描き下ろしイラスト満載
初版限定公式模擬問プレゼント
 

VBAエキスパート公式サイトにて、
連載コラムを執筆しています
毎月10日更新、「やってみよう!
Excel/Access VBAで業務改善

 

本を執筆しました
VBAエキスパート公式テキスト
Access VBA ベーシック
Access VBA スタンダード
VBAエキスパート新試験の
合格を目指す方は必読です
 

本を執筆しました
Excel VBA ゲーム作成入門
Excel VBAの究極テクニックを
惜しげもなく大公開!


TOPページ


■ エクセルVBA超入門

 ・9ステップで"Hello World!"
  からオブジェクト指向まで!
  1."Hello World!"を表示しよう
  2.基本はデータの入出力
  3.繰り返し処理
  4.シートで簡易データベース
  5.名前をつけよう
  6.構造化プログラムに挑戦
  7.構造体を使ってみよう
  8.フォームを使ってみよう
  9.オブジェクト指向に挑戦

■ エクセルVBA中級編

 ・VBAでいろんなテクニック
  変数・関数のスコープ
  引数の参照方法を明示
  配列の中身を一気に複写
  識別子がよいコードを作る
  データ定義型をもっと知ろう
  定数と列挙型を活用しよう
  エラー処理の重要性1
  エラー処理の重要性2
  いろいろな条件分岐
  いろいろな繰り返し処理
  演算子について知ろう
  文字列操作 連結 変換 置換
  文字列操作 検索 比較 書式
  日付操作関数を知ろう
  数値操作・評価・その他関数
  並び替えソートをマスター
  いろいろな検索をマスター
  VBEditorを使いこなそう
  マクロの記録を活用しよう1
  マクロの記録を活用しよう2
  VBAからVBEを操作しよう1
  VBAからVBEを操作しよう2
  VBAからVBEを操作しよう3
 ・ワークシートを使いこなす
  セルの参照をマスターしよう
  セルの選択をマスターしよう
  セルの操作をマスターしよう
  セルの書式設定をマスターしよう
  行・列の操作をマスターしよう
  シートの参照をマスターしよう
  シートの操作をマスターしよう
  ブックの操作をマスターしよう
  ウィンドウの操作をマスターしよう
  イベントプロシージャを活用しよう
  ワークシートを印刷しよう1
  ワークシートを印刷しよう2
  音声(読み上げ)機能を操作しよう
  グラフを操作しよう
 ・ユーザーフォームを使いこなす
  ユーザーフォームを使おう
  UserFormsオブジェクト
  Labelコントロール
  TextBoxコントロール
  ComboBoxコントロール
  ListBoxコントロール
  CheckBoxコントロール
  OptionButtonコントロール
  ToggleButtonコントロール
  CommandButtonコントロール
  ScrollBarコントロール
  SpinButtonコントロール
 ・VBA関数の一覧
  Aから始まる関数の一覧
  Cから始まる関数の一覧
  Dから始まる関数の一覧
  Eから始まる関数の一覧
  Fから始まる関数の一覧
  Gから始まる関数の一覧
 
■ エクセルVBAを極める
 VBAスーパーテクニック
 
 ・データベースへ接続してみよう!
  CSVファイルへの接続
  ワークシートへの接続
  mdbファイルへの接続
  SQL Serverへの接続
  ADOレコードセットの操作1
  ADOレコードセットの操作2
 ・ファイルを操作してみよう!
  FileSystemObjectの操作
  Drive File Folderの操作
  TextStream ダイアログ
  ステートメントでファイル操作1
  ステートメントでファイル操作2
 ・他アプリと連携してみよう!
  ActiveXオートメーションの操作
 ・ゲーム技でマクロを超える
  エクセルで音を鳴らす1
  エクセルで音を鳴らす2  
  スクリーン座標を取得
  様々なイベント取得
  リボンUIを制御しよう1
  リボンUIを制御しよう2
  シート上でアニメを動かそう
 
■ 一歩上行くエクセル
 基本操作の完全マスター!

 
 ・あなたはいったい
  エクセルで何をしたいのか?
  エクセルで業務効率化
  エクセル関数を使いこなす
  エクセルの便利技
  エクセルは最高の帳票ツール
 ・エクセル基本操作上級編!
  セル選択、コメント、シリアル値
  オート機能を使いこなそう!
  参照、条件付書式、入力規則
  関数をもっと理解しよう!
  配列数式を有効利用しよう!
  データの正規化をしよう!
  ショートカットキーを利用しよう1
  ショートカットキーを利用しよう2
 ・世間の誤ったエクセルの
  べからず集
  エクセルで文章を書くべからず
  エクセルで図形を描くべからず
  エクセルでシステムをつくるな
 
■ エクセル関連その他

 ・エクセルコミニュティにあなたも
  参加しませんか?
  Excel関連リンク・コミニュティ
 ・VBの理解がVBAをマスターする
  最短距離!
  VB関連の老舗・大家サイト
 ・エクセルExcel大事典掲示板
 ・プライバシーポリシー

2000アイテムを超えるラベルを販売
送料無料、即納対応の優良ショップ
今買っているラベルより確実に安い!
OAラベルの販売専科グラフトラベル




エクセルExcel大事典ははリンクフリーです エクセル大事典Excel大事典
お問い合わせはこちら gengengen@yahoo.co.jp

Copyright© Gen Muto 武藤 玄 All Rights Reserved,