2026/09/08

RangeとCellsはどう違う?Excel VBAベーシックの書き分け

Value と Text と Formula は、同じセルを指しても別物です。End の向き、MsgBox の戻り値、2種類の InputBox、Set が要るかどうか。紛らわしい組み合わせを挙動の違いから切り分けます。

執筆:ケンテイラボ編集部(資格試験対策アプリ開発・運営)

実務では結果が出れば書き方は自由ですが、試験では似た2つのうち「こちらでなければならない」理由を問われます。Excel VBA ベーシックはコードを直接入力する穴埋め記述形式を含むため、なんとなく動かしていた部分がそのまま失点になります。

セルの指定:Range と Cells は引数の形が違う

  • Range は Range("A1") や Range("A1:C3") とアドレスを文字列で渡します
  • Cells は Cells(2, 3) と数値で渡します。順番は行が先、列が後で、これはC2セルです
  • Range にセルを2つ渡すと左上と右下で囲まれた範囲になり、Range(Cells(1, 1), Cells(2, 2)) は Range("A1:B2") と同じ

行や列を変数で動かすなら Cells が向きます。位置をずらす Offset と大きさを変える Resize も対で、Range("A1").Offset(1, 2) はC2、Range("A1").Resize(3, 2) はA1からB3です。

値の取得:Value と Text と Formula は同じセルでも別物

  • Value はセルが持つ値そのもので、書き込めます
  • Text は表示されているとおりの文字列を返す読み取り専用のプロパティで、表示形式や列幅の影響を受けます
  • Formula は数式を返し、書き込みもできます。数式のないセルではその値が返ります

通貨の表示形式を設定して 1198.3 を入れたセルでは、Value は 1198.3 を、Text は通貨記号の付いた文字列を返します。Text は読み取り専用で、代入は誤りです。

範囲の取得:End の向きと、参考としての CurrentRegion

CurrentRegion は Range のプロパティで、基準セルから空白行と空白列に囲まれた長方形を返します。UsedRange はワークシートのプロパティで、シート全体の使われた範囲を返します。表が複数あるシートでは前者は1つの表だけ、後者は離れた表まで含みます。

最終行を求める End は向きで結果が変わります。Range("A1").End(xlDown) は途中の空白で止まりますが、Cells(Rows.Count, 1).End(xlUp).Row と下から探せば空白に影響されません。

繰り返し:For...Next の書き方と、上位級で加わる型

ベーシックの出題範囲にある繰り返しは For...Next です。カウンタ変数で回数を制御し、Step を付ければ For i = 10 To 1 Step -1 と逆順にもできます。以下の For Each...Next と Do...Loop は上位のスタンダードの範囲なので、ベーシック対策としては後回しでかまいませんが、書き分けを知っておくと読解が楽になります。For Each...Next はコレクションから要素を1つずつ取り出す形で、カウンタを持たないため、行番号そのものが必要な処理には For...Next のほうが向きます(取り出した対象から .Row で行番号を得ることはできます)。

  • Do While は条件が成り立っている間、Do Until は条件が成り立つまで繰り返します
  • Do While Cells(i, 1).Value <> "" と Do Until Cells(i, 1).Value = "" は同じ動きです
  • 条件を Do でなく Loop の側に書くと、判定より先に中身が実行され最低1回は処理されます

分岐:If...ElseIf の閉じ方と、上位級の Select Case

ベーシックの出題範囲にある分岐は If...Then...Else です。条件を増やすときは ElseIf を使い End If で閉じます。Else If と2語に分ける誤りが多く、記述式では失点します。以下の Select Case は上位のスタンダードの範囲です。1つの式の値で分岐し、Case 60 To 79 の範囲や Case Is >= 80 の比較も書けて End Select で閉じます。

同じ変数を段階で分けるなら Select Case、複数の変数を組み合わせるなら If...ElseIf が向きます。

入力と表示:MsgBox の戻り値と、2種類の InputBox

MsgBox は表示するだけならかっこなし、押されたボタンを受け取るときはかっこが要ります。If MsgBox("続けますか", vbYesNo) = vbYes Then のように戻り値を vbYes などと比べます。

  • InputBox 関数は戻り値が常に文字列で、キャンセルされると長さ0の文字列が返ります
  • Application.InputBox メソッドは Type 引数で型を指定でき、キャンセルされると False が返ります
  • Type は数値なら1、文字列なら2、セル参照なら8。8では Range が返るため代入に Set が必要です
  • Application. を書かずに InputBox とだけ書くと、メソッドでなく関数が呼ばれます

変数:Dim と Public、そして Option Explicit

  • プロシージャ内の Dim はその中だけで有効で、処理が終わると値が失われます
  • Static は処理が終わっても値を保持し、次に呼ばれたとき前回の値から続きます
  • モジュール先頭の Public は、ほかのモジュールからも参照できます

モジュール先頭の Option Explicit は未宣言の変数をエラーにするため、綴りの打ち間違いに気づけます。また Dim i, j As Long は両方が Long になるのではなく、i が Variant、j が Long です。

オブジェクト参照:Set が要るもの、要らないもの

値を入れるときは n = Range("A1").Value、オブジェクトそのものを入れるときは Set r = Range("A1") です。Range 型の変数に Set なしで代入するとエラーになります。

With ブロックの中はピリオドから書き始め、End With で閉じます。先頭のピリオドを落とすとオブジェクトの指定が外れます。入れ子では内側のピリオドが内側のオブジェクトを指します。

記述式で綴りを落とさないための確認手順

考え方が合っていても、入力した文字が違えば得点になりません。次の順で見直します。

  • 英字は半角小文字、数字・記号・スペースも半角にする(特別な指示がある場合を除く)
  • 始まりと終わりの対応。If は End If、With は End With、Select Case は End Select、For は Next、Do は Loop
  • 1語で書くキーワード。ElseIf を2語に分けない
  • 記号。代入は =、名前付き引数は :=、引数の区切りはカンマ、文字列は二重引用符、連結は &
  • プロパティ名の綴り。CurrentRegion や NumberFormat のように単語が続くものは落としやすい

違いを言葉で説明できれば、選択式では選択肢を絞れ、記述式でも手が止まりません。1つずつ書いて動かし、目で確かめるのが確実です。

実際に問題を解いて知識を定着させよう

ケンテイラボではVBAエキスパート Excel VBA ベーシックの問題を無料で練習できます。

問題を解く →
← 記事一覧へ戻る