2026/09/08

マクロ記録から始めて、綴りまで書けるExcel VBA ベーシック対策

出題は選択、ドロップダウン、穴埋め記述の三種類が混ざります。Sub と Function の公開範囲、Option Explicit と有効範囲、Offset と Resize、保存形式まで、読めるから書けるへ引き上げます。

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

VBAエキスパート Excel VBA ベーシックは、株式会社オデッセイ コミュニケーションズが実施する、ExcelのマクロとVBAの基礎を測るCBT試験です。試験時間は50分、出題は40問前後で、1000点満点中700点以上が合格ラインです。公式に公表されている合格率は約80%と入門レベルですが、この試験にはコードの一部を自分で打ち込む穴埋め記述が含まれます。

仕事でマクロを動かせている人ほど、ここでつまずきます。実務では入力候補の一覧が助けてくれますが、試験では Offset なのか Resize なのか、Value なのか Text なのかを綴りごと書き出さなければ得点になりません。「動くコードが書ける」ことと「試験で正解できる」ことの間には、この一段のズレがあります。

選択・ドロップダウン・穴埋め記述が混ざるCBT試験

まず試験の形を押さえます。会場のパソコンで受験するCBT方式で、40問前後を50分なので1問あたりおよそ75秒。時間が極端に厳しい試験ではありません。

  • 主催:株式会社オデッセイ コミュニケーションズ
  • 出題数:40問前後/試験時間:50分
  • 合格ライン:1000点満点中700点以上(試験問題の更新などにより変動することがある)
  • 出題形式:選択肢・ドロップダウンリスト・穴埋め記述(CBT形式)
  • 受験料:一般 13,200円(税込)/割引受験制度適用 11,880円(税込)
  • 対応バージョン:Office 2010〜2016(2019年5月15日に出題範囲を改訂)
  • 合格率:約80%(2019年5月〜2025年12月の受験者データより集計・公式「試験に関するデータ」)

解答形式は3種類が混ざります。選択肢やドロップダウンリストから選ぶ問題は、正解を思い出せなくても候補を見れば思い当たることがあります。しかし空欄にコードを直接入力する穴埋め記述には、その手掛かりがありません。プロパティ名やメソッド名を一字一句そのまま打てるかどうかが、そのまま得点差になります。

入力にはルールがあり、特別な指示がない限り英字は半角小文字、数字・記号・スペースも半角で入力します。普段VBEで書いていると、range と打っても行を確定した瞬間に Range と整えてくれるため、記憶があいまいなことに気づけません。学習の途中で一度、入力補助のない場所に手で書き出してみると弱点がはっきりします。

対応バージョンは Office 2010〜2016 とされていますが、特定のバージョンに依存する問題は出題されないため、手元の Microsoft 365 のExcelで練習して差し支えありません。また公式が示すのは出題範囲の大分類10項目までで、分野ごとの配点比率は公表を確認できませんでした。山を張らず範囲を一巡させるのが安全です。

学習の入口はマクロ記録 — 生成されたコードを読んで直す

VBAをこれから学ぶ人の足がかりになるのが「マクロの記録」です。記録を開始してからExcel上で行った操作が、そのままVBAのコードに変換されます。白紙のモジュールに書き始めるより、入口としてはるかに楽です。

  • 「マクロの記録」は操作をコードに変換する機能で、VBAで書いた命令書そのものである「マクロ」とは役割が違う
  • 記録先は作業中のブック・新しいブック・個人用マクロブックから選ぶ。個人用マクロブックに保存すればどのブックからでも使える
  • マクロを含むブックは「Excel マクロ有効ブック(xlsm)」で保存する。xlsx 形式で保存するとマクロは失われる
  • 記録されたコードは標準モジュールに入り、VBE(Visual Basic Editor)で確認・修正できる
  • マクロを含むブックを開くときは、セキュリティ設定によって有効化を確認する表示が出ることがある

ただし、記録されたコードをそのままお手本にするのは危険です。記録機能は操作を忠実になぞるため、Select でセルを選んでから Selection に処理する冗長な形になります。A1に100を入れる操作は Range("A1").Select と Selection.Value = 100 の2行になりますが、これは Range("A1").Value = 100 の1行で足ります。試験で問われるのも簡潔な形のほうです。

そこで記録は「書き方の手本」ではなく「調べ方」として使います。使われているプロパティ名やメソッド名だけを読み取り、選択に関する行を削って対象を直接指定する形に書き直す。この「記録して、読んで、削る」練習が、そのままオブジェクト式の理解につながります。

モジュールとプロシージャ — Sub と Function、公開範囲の書き分け

コードを書く器が標準モジュール、処理のまとまりがプロシージャです。Sub プロシージャは Sub 名前() で始まり End Sub で終わります。値を返す Function プロシージャは Function 名前() 〜 End Function で、返したい値は関数名に代入して返します。この書き方は、記述で問われると手が止まりやすい箇所です。

呼び出し方にも決まりがあります。Call を付けて呼ぶときは引数をかっこで囲み、Call を省略するときはかっこを付けずに引数を並べます。混ぜて書くと構文エラーになるので、かっこの有無は Call とセットで覚えます。

  • Sub プロシージャ:Sub 名前() 〜 End Sub。値は返さない
  • Function プロシージャ:Function 名前() 〜 End Function。関数名に結果を代入して値を返す
  • Public:他のモジュールからも呼び出せる
  • Private:宣言したモジュールの中からだけ呼び出せる。[マクロ]ダイアログの一覧にも表示されない
  • コメント:アポストロフィ(')または Rem を書くと、その行の以降は処理されない
  • 行の継続:半角スペースに続けてアンダースコア(_)を書くと、次の行へ続けられる

変数と定数 — 宣言・データ型・Option Explicit・有効範囲

変数は値を一時的に入れておく箱、定数は変えない値に名前を付けたものです。変数は Dim 変数名 As データ型 で宣言し、定数は Const 定数名 As データ型 = 値 で定義します。データ型は、整数なら Long、文字列なら String、小数なら Double、真偽値なら Boolean、日付なら Date、何でも入る箱として Variant です。

つまずきやすいのが Dim a, b As Long という書き方です。2つとも Long になるように見えますが、Long になるのは b だけで、a は型を書いていないため Variant になります。型を指定したいなら Dim a As Long, b As Long と変数ごとに As を書きます。なお Integer の範囲は -32768 から 32767 までなので、行番号を入れる変数は Long が安全です。

もうひとつの要点が Option Explicit です。モジュールの先頭(宣言セクション)にこの1行を書くと、宣言していない変数を使ったときにエラーとして検出されます。書いていないと、変数名を打ち間違えても新しい変数として扱われ、マクロは止まらないのに結果だけが合わない不具合になります。

  • プロシージャ内で Dim した変数:そのプロシージャの中だけで有効で、処理が終わると値は保持されない
  • モジュールの宣言セクションで Dim または Private した変数:そのモジュール内のすべてのプロシージャで使える
  • モジュールの宣言セクションで Public した変数:すべてのモジュールから使える
  • セルやシートなどのオブジェクトを変数に入れるときは Set が必要(Set 変数名 = オブジェクト)
  • Const で定義した定数には、あとから値を代入できない

セルの操作 — Range と Cells、Offset と Resize、表の端の見つけ方

収録問題でも最大の分野が、セルの操作です。Range は Range("A1") や Range("A1:C3") のようにアドレスを文字列で指定し、Cells は Cells(1, 2) のように行番号・列番号を数値で指定します。この例はB1で、引数は行が先、列が後。繰り返し処理の中で位置をずらすときは Cells が扱いやすくなります。

値の読み書きに使うのが Value プロパティで、Range("A1").Value = 100 で入力します。紛らわしいのが Text プロパティで、画面に表示されているとおりの文字列を返す読み取り専用のプロパティです。1000という数値が桁区切り付きで表示されているセルなら、Value は 1000、Text は表示どおりの文字列。表示形式の設定には NumberFormat を使います。

  • Range("A1"):アドレスの文字列でセルや範囲を指定する
  • Cells(1, 2):行番号・列番号の順に数値で指定する。この例はB1
  • Value:セルの値を取得・設定する(読み書きできる)/Text:表示されているとおりの文字列を返す(読み取り専用)
  • Offset(行, 列):基準のセルから指定した分だけずらした位置を指す
  • Resize(行数, 列数):左上を固定したまま、範囲の大きさを変える
  • CurrentRegion:空白行と空白列で囲まれた、ひとまとまりの範囲を返す
  • End(xlUp) など:指定した方向の端のセルを返す

Offset と Resize は役割が違います。Range("B2").Offset(1, 2) はD3を指し、Range("A1").Resize(3, 2) はA1からB3までの範囲になります。「Offset は動かす、Resize は広げる」と覚え、どちらも引数は行が先だと押さえます。

表の範囲を自動で捉える書き方も定番です。CurrentRegion は基準セルを含む連続したデータのかたまりを返すため、行が増減しても範囲が追従します。最終行は Cells(Rows.Count, 1).End(xlUp).Row のように、A列の一番下から上方向に詰めて求めます。

ステートメント — If、For...Next、With を正しい形で書き切る

処理の流れを制御するのがステートメントです。中心は条件分岐の If...Then...Else、繰り返しの For...Next、記述をまとめる With の3つ。いずれも開きと閉じが対なので、記述式では閉じる行まで書けるかが問われます。

If は If 条件 Then で始めて End If で閉じます。条件を追加するときは ElseIf 条件 Then を続け、どれにも当てはまらない処理を Else に書きます。起きやすい誤りが ElseIf を Else If と2語に分けることで、そう書くと Else の中に新しい If ブロックが始まり、End If の数が合わなくなります。

For...Next は For カウンタ = 初期値 To 最終値 で始めて Next で閉じます。既定では1ずつ増えますが、Step を付けると増減の幅を変えられ、Step -1 と書けば減らしながら繰り返せます。カウンタ変数をそのまま Cells の行番号に渡す形が、最もよく出てくる組み合わせです。

With は、同じオブジェクトへの記述をまとめるものです。With Range("A1") と書いたら、その中では先頭にピリオドを置いて .Value のように書き、End With で閉じます。ピリオドを書き忘れると対象の指定が外れます。入れ子にもできますが、内側のブロックの中ではピリオドが指す相手が内側のオブジェクトに切り替わる点に注意してください。

  • If 条件 Then 〜 ElseIf 条件 Then 〜 Else 〜 End If(1行で書く形では End If を書かない)
  • For カウンタ = 初期値 To 最終値 [Step 増分] 〜 Next(途中で抜けるときは Exit For)
  • With オブジェクト 〜 .プロパティ 〜 End With(中は先頭のピリオドから書く)
  • 比較演算子:= 等しい、<> 等しくない、>= 以上、<= 以下/論理演算子:And、Or、Not
  • 文字列の連結は & を使う。数値と文字列が混ざる場面では + と意味が変わる

VBAにはこのほかにも、Select Case 式 で始めて Case で分岐し End Select で閉じる書き方や、コレクションの要素を順に処理する For Each...Next、条件が続く間だけ繰り返す Do ループがあります。ただし確実に押さえるべきなのは上の3つで、当サイトの収録問題もその3つを中心に構成しています。

関数 — VBA関数とワークシート関数、MsgBox と2種類の InputBox

関数の分野では、組み込み関数を用途別に覚えます。日付・時刻なら Date、Now、DateAdd。文字列なら文字数を返す Len、左端から取り出す Left、途中から取り出す Mid、位置を調べる InStr。数値なら小数部分を切り捨てる Int、絶対値を返す Abs などが対象です。

混同しやすいのが、VBAの関数とワークシート関数の関係です。シート上で使う SUM や VLOOKUP には同じ名前のVBA関数がないため、VBAから使うときは WorksheetFunction を経由して呼び出します。逆に Len や InStr のようなVBA固有の関数はそのまま書けます。

ダイアログ系の2つが最大の関門です。MsgBox は表示するだけなら MsgBox "完了しました" と書けます。しかし vbYesNo のようなボタン定数を指定して処理を分けたいときは、引数全体をかっこで囲んで変数に代入し、その値を vbYes や vbNo と比べて判定します。「戻り値を使うときだけかっこが要る」が要点です。

InputBox には性質の異なる2種類があります。VBAの InputBox 関数は引数を「メッセージ」「タイトル」「既定値」の順に指定し、常に文字列を返します。キャンセル時は長さ0の文字列です。もうひとつの Application.InputBox はExcel側のメソッドで、Type 引数で受け取る値の種類を指定でき、キャンセル時は False を返します。

  • MsgBox:メッセージを表示する。ボタン定数(vbYesNo など)やアイコン定数を指定できる
  • MsgBox の戻り値:押されたボタンに応じて vbYes、vbNo などが返る。受け取るときは引数をかっこで囲む
  • VBAの InputBox 関数:引数は「メッセージ」「タイトル」「既定値」の順。常に文字列を返し、キャンセル時は長さ0の文字列
  • Application.InputBox:Type 引数で受け取る値の種類を指定できる。キャンセル時は False が返る
  • Len は文字数、Left は左端から、Mid は指定した位置から、InStr は文字列の位置を調べる

ブック・シート操作とマクロの実行 — 保存形式と動かし方

最後の分野は、ブックとシートの操作と、作ったマクロを動かす方法です。ブックは Workbooks.Open で開き、Workbooks.Add で新規作成、Save で上書き保存、SaveAs で名前を付けて保存、Close で閉じます。Close の SaveChanges 引数では、保存してから閉じるかどうかを指定できます。

必ず出てくるのが ThisWorkbook と ActiveWorkbook の違いです。ThisWorkbook はマクロが書かれているブック自身、ActiveWorkbook はその時点でアクティブなブックを指します。ふだんは同じブックを指すため区別があいまいになりますが、別のブックを開いた直後に差が出ます。

  • ブックを開く:Workbooks.Open(ファイル名を指定する)/新規作成:Workbooks.Add
  • 保存:Save は上書き保存、SaveAs は名前や形式を指定して保存
  • 閉じる:Close。SaveChanges 引数で保存の有無を指定できる
  • シートの操作:挿入・削除・コピー・移動と、Name プロパティによる名前の変更
  • マクロを含むブックの保存形式は xlsm(Excel マクロ有効ブック)

作ったマクロを動かす方法は主に3通りです。VBEから対象のプロシージャを実行する、[マクロ]ダイアログを開いて一覧から選ぶ、シート上のボタンや図形にマクロを登録して押す。3つ目は、VBAを知らない人にマクロを渡すときの形でもあります。

収録している330問を8分野で見る

ここからは、当サイト(ケンテイラボ)に収録している対策問題の実データを見ます。次の表は、収録している330問を分野別に分け、収録数・構成比・扱う内容をまとめたものです。なお、この8分野は学習しやすさを優先した当サイト独自の区分であり、公式が示す出題範囲の区分そのものではありません(公式の範囲は大分類10項目)。

収録問題8分野の内訳と比重

ケンテイラボではVBAエキスパート Excel VBA ベーシックの収録問題を8の分野に分けて整理しています (学習しやすさを優先した本サイト独自の区分で、実施団体が公表している 出題区分そのものではありません)。収録している330問を分野別に集計すると、 最も問題数が多いのは「⑤ セルの操作」の50問(全体の15.2%)、 最も少ないのは「② モジュールとプロシージャ」の35問(同10.6%)です。上位3分野だけで全体の41.5%を占めるため、 ここを先に固めるかどうかが得点の土台になります。

分野別の学習負荷を数字で見る

同じ1問でも、分野によって負荷は違います。次の表は、330問を分野別に集計し、「数値を含む問題の割合」と「問題文の平均文字数」を出したものです。数値を含む割合が高い分野は引数の順番や範囲といった数字を覚える比重が大きく、低い分野は用語の意味や挙動の理解が中心になります。

分野別の学習タイプ(収録330問の集計)

ケンテイラボに収録しているVBAエキスパート Excel VBA ベーシックの問題を分野別に集計し、 「問題文または選択肢に数値が登場する問題の割合」と「問題文の平均文字数」を出しました。 数値の割合が高い分野は具体的な数字の暗記が得点を左右しやすく、 低い分野は用語の理解や文章の読み取りが中心になる傾向があります。

この試験でもっとも数値の比率が高いのは「⑤ セルの操作」で50%、 もっとも低いのは「① VBAの基礎とマクロ記録」で11%でした。 また問題文がもっとも長いのは「④ 変数と定数」の平均47字で、 設問を読み解く負担が大きい分野といえます。

  • ① VBAの基礎とマクロ記録38問/数値を含む問題 11%/問題文 平均35
  • ② モジュールとプロシージャ35問/数値を含む問題 34%/問題文 平均32
  • ③ VBAの構文40問/数値を含む問題 40%/問題文 平均34
  • ④ 変数と定数40問/数値を含む問題 33%/問題文 平均47
  • ⑤ セルの操作50問/数値を含む問題 50%/問題文 平均39
  • ⑥ ステートメント42問/数値を含む問題 48%/問題文 平均42
  • ⑦ 関数45問/数値を含む問題 22%/問題文 平均35
  • ⑧ ブック・シート操作とマクロの実行40問/数値を含む問題 20%/問題文 平均37

数値の比率が高い分野は、数字を単独で覚えるより 「どの制度の・何の基準か」とセットで整理すると定着しやすくなります。 比率が低い分野は、似た用語同士の違いを説明できる状態を目指すと得点が安定します。

数値の比率が高い分野は一問一答の反復が効き、平均文字数が長い分野は提示されたコードを読み解く練習そのものが必要です。同じ30分でも、分野によってやり方を変えたほうが結果は変わります。

学習スケジュールの組み方

必要な学習時間は、Excelの使用経験やプログラミングの経験によって大きく変わります。以下は組み立ての目安であって、この期間で必ず合格できるという意味ではありません。自分がどちらに近いかを見て、配分の考え方を参考にしてください。

Excelは使えるがVBAは初めての場合

  • 第1段階:マクロの記録を試し、生成されたコードをVBEで眺める。xlsm形式での保存もここで体験する
  • 第2段階:モジュールとプロシージャ、変数と定数を通して読む。Sub と Function、Dim と Set を書き分けられる状態にする
  • 第3段階:セルの操作に時間を多めに割く。Range と Cells、Value と Text、Offset と Resize を実際に動かして違いを確認する
  • 第4段階:If、For...Next、With を書く練習。表の行数分だけ繰り返す処理を一から書けるようにする
  • 第5段階:関数とブック・シート操作を仕上げ、問題演習で取りこぼしを洗い出す

この進め方なら、1日30分から1時間の学習で3週間から1か月程度が一つの目安になります。つまずくのはたいてい第3段階と第4段階で、ここは読むだけでは進みません。実際にコードを書いて実行し、動かない理由を追いかける時間が要ります。

他のプログラミング言語の経験がある場合

  • 第1段階:文法の差分だけを確認する。End If や End With で閉じる書き方、代入の = と名前付き引数の := の使い分けを押さえる
  • 第2段階:Excel固有の部分に集中する。Range と Cells、Value と Text、Offset と Resize、CurrentRegion、End(xlUp) を実際に動かす
  • 第3段階:オブジェクトの代入に Set が要る点など、VBAならではの約束事を確認する
  • 第4段階:MsgBox の戻り値と2種類の InputBox、ThisWorkbook と ActiveWorkbook の違いを整理する
  • 第5段階:通しの演習を行い、記述で綴りが出てこない項目を潰す

文法そのものの学習は短く済むため、1日1時間程度なら1週間から2週間程度が目安です。むしろ経験者ほど注意したいのが、「読めば分かる」で先へ進んでしまうことです。得点を落とすのは知らない構文ではなく、知っているのに正確に書けない語です。

ケンテイラボの330問で仕上げる

当サイトでは、Excel VBA ベーシック向けの対策問題を8分野・330問収録しています。テキストを読み終えたあとの仕上げに使う想定です。分野別の演習から始め、正答が安定したら全分野からのランダム出題に切り替えます。

  • 分野別に解く:1分野ずつ通して解き、解説を読んで用語と挙動を結びつける
  • 誤答だけを繰り返す:間違えた問題は、正解の記号ではなく理由を言えるまで戻る
  • 解く前に書く:選択肢を見る前に、正解になりそうなプロパティ名やメソッド名を自分で書き出してみる
  • ランダムで通す:分野の並びが分からない状態で解き、切り替えに慣れる
  • 時間を意識する:40問前後を50分なので、1問あたり75秒前後のペース感を体で覚える

選択式の問題集を穴埋め記述の対策に変える方法はひとつだけで、解答する前に自分の手で書いてみることです。Range なのか Cells なのか、Value なのか Text なのか。選択肢に頼らず先に書き、そのあとで答え合わせをする。この一手間で、同じ問題集が記述対策の教材に変わります。

合格率が約80%という数字は、正しく準備した人が順当に受かる試験であることを示しています。落ちる理由の多くは範囲の広さではなく、あいまいなまま放置した綴りと使い分けです。分野を一巡させ、書けない語を潰し、最後にランダム出題で通す。この順番で進めれば十分に射程内の試験です。

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

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

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