【カテゴリー別】Access VBA スタンダード 模擬問題 変数 配列 ユーザー定義 コレクション Access VBA スタンダード 模擬問題 模擬問題 2026.08.07 こちらはカテゴリー別の模擬問題です。 合計25問がシステムに登録した順番どおりに1問1答形式で出題されます。 なおタイマー機能はありません。 準備が整い次第、ボタンを押して試験を開始してください。 1. 変数の「適用範囲(スコープ)」と「有効期間」に関する説明として、最も適切なものを選びなさい。 変数の適用範囲と有効期間は、変数を宣言する場所だけで決まり、宣言するステートメントの種類は関係しない。 適用範囲とは変数に値を保持しておける期間を指し、有効期間とは変数を参照できる範囲を指す。 適切なステートメントを使用し、宣言セクションで宣言した変数はパブリック変数またはモジュールレベル変数になり、プロシージャ内で宣言した変数はプロシージャレベル変数(ローカル変数)になる。 プロシージャ内で宣言した変数は、同じモジュール内であればどのプロシージャからでも参照できる。 None 2. 変数の「種類」「宣言する場所」「宣言するステートメント」「適用範囲」「有効期間」の関係として、最も適切なものを選びなさい。 パブリック変数はプロシージャ内で Public を使って宣言し、すべてのモジュールのすべてのプロシージャから参照可能である。 モジュールレベル変数は宣言セクションで Dim か Private を使って宣言し、宣言されたモジュール内のすべてのプロシージャから参照できる。有効期間はパブリック変数と同じである。 プロシージャレベル変数の有効期間はパブリック変数と同じで、プロシージャを終了しても値は初期化されない。 プロシージャレベル変数は宣言セクションで Dim を使って宣言し、宣言されたプロシージャ内からのみ参照可能である。 None 3. 次のコードは、Exam1 から Exam2 を呼び出している。Exam2 の途中で、すべてのコードの実行を強制終了し、同時にすべての変数を初期化したい。空欄に入る適切な語句を解答しなさい。Sub Exam1() Call Exam2 MsgBox "完了"End SubSub Exam2() Dim N As Long N = "123" End Sub 4. 変数の適用範囲の考え方に関する説明として、選択肢の中から適切なものを1つ解答しなさい。 複数のプロシージャで値を共有したい場合、パブリック変数を使う以外に方法はなく、引数で値を渡すことはできない。 どのプロシージャからでも書き換えられるパブリック変数は利便性が高いため、カウンタ変数などは積極的にパブリック変数として宣言するのがよい。 変数はできる限り適用範囲が狭い方が望ましく、複数のプロシージャで値を共有したい場合を除き、パブリック変数やモジュールレベル変数はなるべく使用しない方がよい。 パブリック変数で宣言したカウンタ変数は、プロシージャを終了すると値が初期化されるため、意図しない値が残る心配はない。 None 5. 次の表は、定数の種類・宣言場所・適用範囲と、宣言に使うステートメントの対応を示している。空欄に入る適切なステートメントを解答しなさい。 種類 宣言場所 適用範囲 使用ステートメント パブリック定数 標準モジュールの宣言セクション すべてのモジュールの全プロシージャから参照可能 モジュールレベル定数 宣言セクション 宣言されたモジュール内の全プロシージャから参照可能 プロシージャレベル定数 プロシージャ内 宣言されたプロシージャ内からのみ参照可能 6. 次のコードを記述し、Exam1 プロシージャを実行した。イミディエイトウィンドウにどのように出力されるか、最も適切ものはどれか。以下の選択肢より1つ解答しなさい。宣言セクションPublic LngPublic As LongDim LngModule As LongーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーSub Variable1() LngPublic = 100 LngModule = 200 Dim LngLocal As Long LngLocal = 500End SubSub Exam1() Dim LngLocal As Long Call Variable1 Debug.Print LngLocal Debug.Print LngPublic Debug.Print LngModule MsgBox "完了"End Sub 「100」「200」の2つだけが出力される。 LngLocal が Variable1 と Exam1 の両方で宣言されているためエラーになり、処理が止まる。 「0」「100」「200」が順に出力される。 「500」「100」「200」が順に出力される。 None 7. 次のコードは、Exam1 を実行するたびに MeNumber に 1 を加えて表示するものである。現在、変数の宣言は「Dim MeNumber As Long」となっているが、プロシージャを終了しても MeNumber の値を 次回コード実行時に向け、初期化せずに保持したい。以下の空欄に入る適切な語句を解答しなさい。Sub Exam1() As Long MeNumber = MeNumber + 1 Debug.Print MeNumber MsgBox "完了"End Sub 8. オブジェクト変数の宣言と Set ステートメントに関する説明として、最も適切ものはどれか。以下の選択肢より1つ解答しなさい。 オブジェクト変数に参照するオブジェクトを代入するときは、Set を省略して「オブジェクト変数 = 参照するオブジェクト」と記述する。 通常の変数に値を代入するときは Let を省略できないが、オブジェクト変数に参照を代入するときの Set は省略できる。 オブジェクトの型が分かっているときは、型を指定する固有オブジェクト型で宣言する方が、エラーを発見しやすく、実行速度もわずかに向上するというメリットがある。 オブジェクトの型が分かっているときでも、総称オブジェクト型(Object)で宣言する方が、エラーを発見しやすく実行速度も向上する。 None 9. オブジェクト変数について、(A)には代入したオブジェクトへの参照を解除するとき と、(B)には参照が代入されているかどうかを調べるとき に記述する内容の組み合わせとして最も適切ものはどれか。以下の選択肢より1つ解答しなさい。 (A)オブジェクト変数 Is Nothing (B)Set オブジェクト変数 = Nothing (A)Set オブジェクト変数 = Nothing (B)オブジェクト変数 Is Nothing (A)Set オブジェクト変数 = Nothing (B)Set オブジェクト変数 = Empty (A)オブジェクト変数 = Nothing (B)オブジェクト変数 = Is Nothing None 10. フォーム「F1」には、テキストボックス txt1・txt2 が配置されている。次のコードで Exam1 を実行し、確認メッセージで「いいえ」をクリックした。このときの動作として、最も適切なものを選びなさい。Sub Exam1() Dim N As Form DoCmd.OpenForm "F1" Set N = Forms("F1") N.txt1.Value = "VBA" N.txt2.Value = "SQL" If MsgBox("フォームを閉じる?", vbYesNoCancel) = vbYes Then Set N = Nothing If N Is Nothing Then DoCmd.Close acForm, "F1" End If End IfEnd Sub txt1 に「VBA」、txt2 に「SQL」が表示された状態のまま、If の条件が成立しないため F1 は閉じられず開いたままになる。 「いいえ」を選ぶと txt1・txt2 に代入された値も取り消され、F1 は空欄の状態に戻る。 「いいえ」でも Set N = Nothing が実行されて参照が解除され、N Is Nothing が True になるため F1 が閉じられる。 「いいえ」を選んでもコードはその場で移動せず即時終了する。 None 11. 配列や配列変数の宣言に関する説明として最も適切ものはどれか。以下の選択肢より1つ解答しなさい。 配列は最大でも二次元までしか宣言できず、三次元以上の配列を作ることはできない。 インデックス番号は通常1から始まるため、1つ目の要素のインデックス番号は1になる。 一次元配列のことを多次元配列と呼び、二次元以上の配列や、配列を持つ変数のことを配列変数と呼ぶ。 配列変数は「Dim 変数(要素数−1) As データ型」の形で宣言する。インデックス番号は通常0から始まるため、要素数が5の一次元配列は「Dim 変数(4) As データ型」と宣言する。 None 12. 同一モジュール内のすべての配列変数について、インデックス番号の最小値を0ではなく1に変更したい。宣言セクションに記述する以下の空欄に入る適切なコードを解答しなさい。'(宣言セクション) 1ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーSub Exam1() Dim N(3) As Long N(1) = 100 N(2) = 100 N(3) = 100 Debug.Print N(1) Debug.Print N(2) Debug.Print N(3) MsgBox "完了"End Sub 13. 次のコードを記述し、Exam1 プロシージャを実行した。イミディエイトウィンドウにどのように出力されたか、最も適切ものはどれか。以下の選択肢より1つ解答しなさい。Sub Exam1() Dim i As Long Dim j As Long Dim MeArray(5, 5) As String Dim str As String For i = 0 To 5 For j = 0 To 5 MeArray(i, j) = i & "-" & j Next j Next i For i = 0 To 5 For j = 0 To 5 str = str & String(2, " ") & MeArray(i, j) Next j Debug.Print str str = "" Next i MsgBox "完了"End Sub str に前の行の内容が残り続けるため、行が進むごとに前の行が連結され、1行ずつ長くなっていく。 6行が出力されるが、スペースは各要素の間にだけ入り、1行目は行の先頭にはスペースが入らない「0-0」から始まる。 6行が出力される。区切りの String(2, " ") は各要素の前に連結されるため、各行の先頭にも半角スペース2つが入る。内容は1行目が「 0-0 0-1 0-2 0-3 0-4 0-5」、行が進むごとに1次元のインデックスが1ずつ増え、6行目が「 5-0 5-1 5-2 5-3 5-4 5-5」となる。 各行の出力前に str が空にされるため、最後の「 5-0 5-1 5-2 5-3 5-4 5-5」の1行だけが出力される。 None 14. 静的配列と動的配列に関する説明として、最も適切ものはどれか。以下の選択肢より1つ解答しなさい。 静的配列は、宣言した後でも ReDim ステートメントを使えば要素数を何度でも変更できる。 動的配列は宣言時にカッコの中へ要素数を必ず指定する必要があり、要素数を省略して宣言することはできない。 動的配列の要素数には数値しか指定できず、変数を要素数として設定することはできない。 動的配列は宣言時に要素数を設定せず「Dim 変数() As データ型」と宣言し、実際に使用する段階で ReDim ステートメントを用いて要素数を設定する。このとき要素数には、数値だけでなく変数を用いることもできる。 None 15. 配列に関する説明として最も適切ものはどれか。以下の選択肢より1つ解答しなさい。 ReDim ステートメントによる動的配列の要素数の変更は一度きりではなく、何度でも変更できる。ただし Preserve キーワードを多次元配列に使用する場合、要素数を変更できるのは最後の次元に限られる。 Erase ステートメントで配列を初期化すると、動的配列でも静的配列でも、値のクリアと同時に、使用していたメモリの解放が行われる。 Preserve キーワードを多次元配列に使用した場合、すべての次元で自由に要素数を変更できる。また To キーワードで最小値と最大値を指定している場合は、最小値を変更できる。 多次元配列はメモリの消費が少ないため、Access VBA では三次元以上の配列も積極的に使用することが推奨されている。 None 16. 次のコードは、動的配列 N を宣言し、要素数を変更しながら値を格納するものである。空欄には要素数を初めて設定する語句、その次の空欄にはそれまでの値を保持したまま要素数を変更する語句が入る。以下の空欄に入る適切な語句を解答しなさい。Sub Exam1() Dim N() As String N(1) N(0) = "VBA" N(1) = "SQL" N(3) N(2) = "CSV" N(3) = "XML" Debug.Print N(0) & N(1) & N(2) & N(3) MsgBox "完了"End Sub 17. 次のコードを記述し、Exam1 プロシージャを実行した。イミディエイトウィンドウにどのように出力されるか、最も適切ものはどれか。以下の選択肢より1つ解答しなさい。Sub Exam1() Dim N() As String ReDim N(1) N(0) = "VBA" N(1) = "SQL" ReDim N(3) N(2) = "CSV" N(3) = "XML" Debug.Print N(0) & N(1) & N(2) & N(3) MsgBox "完了"End Sub ReDim で要素数を2回設定しているためエラーになり、何も出力されない。 VBASQLCSVXML と出力される。 CSVXML と出力される。 VBASQL と出力される。 None 18. 次のコードでは、配列 N に値を格納した後、格納されている値をまとめて初期化(クリア)したい。空欄に入るコードを解答しなさい。Sub Exam1() Dim i As Long Dim N(1 To 5) As String For i = 1 To 5 N(i) = "VBA" & i Next i For i = 1 To 5 Debug.Print N(i) Next i MsgBox "完了"End Sub 19. ユーザー定義型に関する説明として最も適切ものはどれか。以下の選択肢より1つ解答しなさい。 ユーザー定義型は配列と同じく、ひとつの変数に格納できる値はすべて同じデータ型に限られる。 ユーザー定義型は Type ステートメントで定義すれば、それだけでユーザー定義型の変数も同時に作成されるため、変数を別途宣言する必要はない。 ユーザー定義型の変数に値を設定するときは「変数(要素名) = 値」のように、要素名をカッコで囲んで指定する。 ユーザー定義型はユーザーが独自に型を定義できる機能で、Type ステートメント(Type 〜 End Type)を使って標準モジュールの宣言セクションに定義する。定義しただけでは変数は作られないため「Dim 変数 As ユーザー定義型名」で変数を宣言し、値は「変数.要素名 = 値」の形で設定する。 None 20. 次のコードは、ユーザー定義型 MeType を定義し、その変数 MeRec に値を設定して別のプロシージャに渡すものである。ユーザー定義型の定義を開始する行 と、定義を終了する行の空欄に入る適切な語句とコードを解答しなさい。宣言セクション MeType N As String M As Long D As Date ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーSub Exam1() Dim MeRec As MeType MeRec.N = "VBA" MeRec.M = 5000 MeRec.D = #4/1/2020# Call Exam2(MeRec) MsgBox "完了"End SubSub Exam2(ByRef MeRec As MeType) Debug.Print MeRec.D & MeRec.N & MeRec.MEnd Sub 21. 次のコードは、ユーザー定義型 MeType を定義し、その変数 MeRec に値を設定して別のプロシージャに渡すものである。ユーザー定義型 MeType の変数 MeRec を宣言するコードを解答しなさい。宣言セクションType MeType N As String M As Long D As DateEnd TypeーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーSub Exam1() Dim MeRec.N = "VBA" MeRec.M = 5000 MeRec.D = #4/1/2020# Call Exam2(MeRec) MsgBox "完了"End SubSub Exam2(ByRef MeRec As MeType) Debug.Print MeRec.D & MeRec.N & MeRec.MEnd Sub 22. テーブル Table Product1 に連結したフォーム F_Product があり、標準モジュールとフォームモジュールに次のコードが記述されている。フォームを開いて次の操作を行った。・1件目:No「C2001」のレコードで Price を 12000 から 13000 に変更し、次のレコードへ移動した。・2件目:No「C2002」のレコードで Price を 7800 から 8800 に変更し、次のレコードへ移動した。その後 3件目でbtn1 をクリックした。lbl1 に表示される内容として、最も適切なものを選びなさい。1件目2件目【標準モジュール】Type MeType MeNo As String MeName As String MeCategory As String MePrice As CurrencyEnd Type【F_Product フォームモジュール】Dim MeProduct() As MeTypePrivate Sub Form_AfterUpdate() Static i As Long ReDim Preserve MeProduct(i) MeProduct(i).MeNo = Me.txt1.Value MeProduct(i).MeName = Me.txt2.Value MeProduct(i).MeCategory = Me.txt3.Value MeProduct(i).MePrice = Me.txt4.Value i = i + 1 Me.btn1.Enabled = TrueEnd SubPrivate Sub btn1_Click() Dim i As Long Me.lbl1.Caption = "" For i = 0 To UBound(MeProduct) Me.lbl1.Caption = Me.lbl1.Caption & _ MeProduct(i).MeNo & "," & _ MeProduct(i).MeName & "," & _ MeProduct(i).MeCategory & "," & _ MeProduct(i).MePrice & vbCrLf Next iEnd Sub 2行が表示され、Price は「¥13,000」「¥8,800」のように通貨記号と桁区切り付きで表示される。 2行が表示される。1行目「C2001,Hi Chair,Chair,12000」、2行目「C2002,Folding Chair,Chair,7800」。 最後に編集した1行「C2002,Folding Chair,Chair,8800」だけが表示される。 2行が表示される。1行目「C2001,Hi Chair,Chair,13000」、2行目「C2002,Folding Chair,Chair,8800」。 None 23. Access の主なコレクションと、その内容の組み合わせに関する説明として、最も適切なものを選びなさい。 Forms はデータベース内にある全フォームを表し、現在開いているかどうかに関係なく、すべてのフォームが対象になる。 Forms は現在開いている全フォーム、Printers はシステムで使用可能な全プリンタ、Me.Controls はフォーム・レポートの全コントロールを表す。 CurrentProject.AllForms は現在開いている全フォームだけを表し、閉じているフォームは含まれない。 Me.Controls はシステムで使用可能な全プリンタを表し、Printers はフォーム上の全コントロールを表す。 None 24. Access の主なコレクションについて、 ①はフォーム・レポート上のすべてのコントロールを表すコレクション、 ②はシステムで使用可能なすべてのプリンタを表すコレクションである。空欄に入るコレクション名を解答しなさい。① ➁ 25. 次のコードは、フォームモジュールに記述されている。システムで使用可能なすべてのプリンタを取り出し、そのプリンタ名を lbl1 に表示したい。先の空欄には Printers コレクションが属するオブジェクト、後ろの空欄にはプリンタ名を取得するプロパティが入る。以下の空欄に入る適切な語句を解答しなさい。Private Sub btn1_Click() Dim i As Object Me.lbl1.Caption = "" For Each i In .Printers Me.lbl1.Caption = Me.lbl1.Caption & i. & vbCrLf Next i MsgBox "完了"End Sub Time's up