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セルが指定できる。
変数を使ってセルの行や列を指定するなら、こっちを使ったほうがずっと便利だよ」
「…なるほど、これならオーダー表のアイテム数やレイアウトが変わっても、柔軟に対応できるね」