オデッセイの運営サイト一覧

Excel®️、Accessのマクロ・VBAのスキルを評価する資格VBAエキスパート

企業・教育機関の皆さまへ 試験会場を探す お問い合せ

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

第23話「システム化への第一歩」

第23話「システム化への第一歩」

登場人物紹介

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

					

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との出会い」編:エピソード一覧

一覧へ戻る

MENU