トップ > 資格を活かすには > やってみよう!Excel VBAで業務改善! > VBAとの出会い編 第23話「システム化への第一歩」

やってみよう!Excel VBAで業務改善!|VBAとの出会い編

ブラッシュアップしよう!

    Dim i As Long
    Dim j As Long
    Dim Hantei As Boolean

「カウンタ変数の"i"と"j"は整数値を扱うからLong型で、"Hantei"は真偽の2値を扱うからBoolean型で宣言する。
あと文字列を扱うならString型を、日付を扱うときはDate型を、小数値を扱うときはDouble型を使用するから、一緒に覚えておくといい」
星くんは、フンフンとうなずきながら聞いています。

「ちなみに15行目のIfステートメントで"Hantei = True"と、Boolean型の変数を条件式で比較しているけど、Ifステートメントはそもそも、与えられた条件が"真"か"偽"かで分岐するものだからこの場合、条件式はいらない…」

    If Hantei Then
        '変数の値を"False"に戻す
        :

※ 変数HanteiがFalseのケースを判定するときは"If Not Hantei Then"と記述します。

「…つまり、こう書けばいいんだよ」

星くんは目を丸くしました。

「そっか…Boolean型の変数Hanteiは、そもそも"真"か"偽"のどちらかしか持ちえないんだから、
それをわざわざ条件式で判定するのはナンセンスなんだね」
「そういうこと。
あと、For…Nextステートメントの終了値に"100"と固定値が設定されているけど、
オーダー表のアイテム数がきっちり100と決まっているわけではないんだろう?
…なら、ここはその列の最終行を自動的に取得するコードに変えたほうがいい。
あとRangeオブジェクトでセルを指定しているけど、これはこのあいだ作った"とりあえず動く"プログラム用の苦肉の策で、本来はこういったケースではCellsプロパティを使ったほうがベターだ」
「あ…」

星くんが、何か思い出したかのようにつぶやきました。

    For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
        For j = 2 To Cells(Rows.Count, 3).End(xlUp).Row
            If Cells(i, 1) = Cells(j, 3) Then

「こんな感じかな…。
"Rows.Count"はワークシートの行数、つまりExcel 2003までなら65536行、Excel 2007以降なら1048576行だよ。
"End(xlUp).Row"はそこから上に見ていって、最初に見つかった使用されているセルの行数を返すんだ。
つまり、150行までアイテムが入力されていれば150が、200行まで入力されていれば200が返るよ。
Cellsプロパティは、セルを"(行, 列)"の数字で指定するプロパティだ。
Cells(1, 1)ならA1セルが、Cells(3, 2)ならB3セルが指定できる。
変数を使ってセルの行や列を指定するなら、こっちを使ったほうがずっと便利だよ」
「…なるほど、これならオーダー表のアイテム数やレイアウトが変わっても、柔軟に対応できるね」

シーズン1 「VBAとの出会い」編: 各エピソードへのリンク
一覧にもどる