ちょっと悩むVBA厳選問題
X(Twitter)で、【VBA問題】として出した4択問題を集めました。
ちょっと捻った問題が多いので、全問正解するのは、結構難しいかもしれません。
EOF関数の使い方
+演算子の挙動
エラー発生個所の把握1
エラー発生個所の把握2
SortFieldsの指定方法
Str関数、Val関数の仕様は?
VBA+Python問題
Xorでの値入替
InputBoxの「キャンセル」
単語をパズルのように組み合わせてVBAを作成
小数誤差の解消
このVBAの結果は「False」になります。
そこで、「関数」を用いて結果を「True」にしたいと考えます。
Debug.Print 関数(0.1 + 0.2) = 0.3
以下の中で、結果が「True」にならない「関数」が1つあります。
それはどれだと思いますか?
■ 正解と解説
正解は B. CDbl です。
VBAにおいて、0.1 や 0.2 のような小数は、デフォルトでDouble型として扱われます。このDouble型は2進数で数値を表現するため、0.1 + 0.2 の計算をした時点で、結果は厳密な 0.3 ではない値(浮動小数点数の計算誤差を含んだ値)になります。
CDbl関数は、元々Double型として誤差を含んでしまった計算結果を、再度Double型に変換するものです。型が変わらないため、含まれている誤差は全く解消されません。
したがって、誤差を含んだ値と厳密な 0.3 を比較することになり、結果は False となってしまいます。これが、CDblのみがTrueにならない理由です。
他の関数(CDec, CCur)は誤差を回避できるデータ型に変換するため、Trueになります。
EOF関数の使い方
Sub sample()
Dim i As Long: i = 1
Dim n As Long: n = FreeFile
Open "C:\xxx.csv" For Input As #n
Do While Not EOF(○)
'・・・
i = i + 1
Loop
Close #n
End Sub上記の(○)に入るものを選んでください。
■ 正解と解説
正解は D. (n) です。
EOF 関数はファイルの終端に達したかを判定するために、Openステートメントでファイルに割り当てた番号を引数に取ります。
このコードでは、n = FreeFile で取得した番号 n を Open ... As #n でファイルに割り当てているため、EOF の引数には n が入ります。
+演算子の挙動
Sub X()
Dim i, j
i = "3"
j = "6"
MsgBox (i + j) ^ 0.5
End Sub上記の(○)に入るものを選んでください。
■ 正解と解説
正解は C. 6 です。
変数i,jは型指定なしのVariantなので、""で囲んだ文字列数字はそのまま文字列として代入されます。
「+」演算子は左右が文字列の場合は型変換されないので、「i + j」は"36"となります。
そして、^0.5の計算(ルート計算)する時点で"36"が暗黙の型変換されて数値化されて計算されます。
エラー発生個所の把握1
Sub main()
Dim v
v = Array(1, 2, 3)
v = fnc(v) '①
Debug.Print v '②
End Sub
Function fnc(ByVal v)
v = Split(WorksheetFunction.Sum(v)) '③
fnc = v '④
End FunctionこのVBAはエラーになります。
エラーは①~④のどの行で発生するでしょうか。
■ 正解と解説
正解は B. ② です。
fnc関数から配列が返され、Debug.Printで直接出力しようとするため型が不一致になります。
Debug.Printでは、単一値(スカラ値)しか扱えません。
エラー発生個所の把握2
Sub main()
Range("F1:F5").FormulaLocal = "=SUMIFS(B:B,A:A,D1)" '①
Range("F1:F5").FormulaArray = "=SUMIFS(B:B,A:A,D1:D5)" '②
Range("F1").Formula2 = "=SUMIFS(B:B,A:A,D1:D5)" '③
Range("F1").Formula = "=SUMIFS(B:B,A:A,D1:D5)" '④
End Sub■ 正解と解説
正解は C. ③ です。
1文1文は問題ありません。それぞれで実行すれば正しく動作します。
問題は、
②でF1:F5にCSEで入れているので、
次の③で、その一部であるF1だけに数式を入れるとエラーになります。

SortFieldsの指定方法
With ActiveSheet.Sort
.SortFields.Clear
.SortFields.Add Key:=①, Order:=xlAscending
.SetRange Range("A1").CurrentRegion
.Header = xlYes
.Apply
End With■ 正解と解説
正解は A. Range("B1").Value です。
SortFields.Add は、並べ替えのキーとしてセル範囲(Range オブジェクト)を指定しなければなりません。
Range("B1").Value は、B1 セルの中身の値を渡しているため、Range オブジェクトではないという理由で型不一致エラーとなります。
Str関数、Val関数の仕様は?
Sub main()
MsgBox Len(Str(Val("12,345")))
End Sub■ 正解と解説
正解は B. 3 です。
Val("12,345"):文字列のカンマ,で処理が止まり、数値の 12 になります。
Str(12):正の数値を文字列に変換するとき、先頭にスペースが追加され、文字列 " 12" になります。
Len(" 12"): 文字列の長さを数えるので 3になります。
VBA+Python問題
Function fnc(a, Optional b)
If IsMissing(b) Then b = UBound(a)
fnc = a(b)
For i = b + 1 To UBound(a)
a(i - 1) = a(i)
Next
ReDim Preserve a(UBound(a) - 1)
End Function■ 正解と解説
正解は A. pop です。
VBA関数 fnc は、インデックス b(省略時は末尾)の要素を取り出しつつ、その要素を配列から削除し、配列の要素を詰めています。
この「要素を返す」と「要素を削除する」を同時に行う動作は、Pythonのリスト操作である list.pop(index) と完全に一致します。
remove は値を指定して削除し、何も返しません。
del はインデックスを指定して削除しますが、何も返しません。
delete というメソッドは存在しません。
Xorでの値入替
Debug.Print y = ((x Xor y) Xor y)
この結果は何になるか?
■ 正解と解説
正解は C. xとyの値によりけり です。
右辺の簡略化:Xor演算には (A Xor B) Xor B = A という特性があります。
したがって、式中の右辺 ((x Xor y) Xor y) は、必ず x の値になります。
実行される処理:最終的に実行される式は、Debug.Print y = x という比較演算になります。
結果:この比較は、「y の値が x の値と等しいか?」を判定するため、x と y が等しい場合に True、等しくない場合に False を出力します。
そのため、結果は x と y の値によって変わります。
InputBoxの「キャンセル」
Sub main()
Dim v: v = InputBox("…")
Debug.Print IsEmpty(v) '①
Debug.Print IsMissing(v) '②
Debug.Print CBool(StrPtr(v)) '③
Debug.Print CBool(VarPtr(v)) '④
End Sub■ 正解と解説
正解は D. ④ です。
InputBox関数で「キャンセル」をクリックすると、変数 v にはゼロ長文字列 ("") が代入されます。
このとき、「True」になるのは ④ のみです。
①IsEmpty(v): v は ""(文字列)であり、特別な値である Empty ではないため False。
②IsMissing(v): v はプロシージャの引数ではないため False。
③CBool(StrPtr(v)): ゼロ長文字列 "" のポインタ (StrPtr) は 0 を返し、CBool(0) は False。
④CBool(VarPtr(v)): 変数 v 自体のメモリ上のアドレス (VarPtr) は常に 0以外 の値を返すため、True。
単語をパズルのように組み合わせてVBAを作成
Worksheets
Next
For
Application
To
Worksheets(i)
Step
Count
Goto
Cells(1,1)
(不足する単語は追加して良い)
さて、どのような処理のVBAが作成されたと思いますか。
■ 正解と解説
正解は B. 全シートのA1セルを順番に選択する です。
予想されるコード
Sub SelectAllA1()
Dim i As Long
' For, To, Worksheets, Count, Step
For i = 1 To Worksheets.Count Step 1
' Application, Goto, Worksheets(i), Cells(1,1), True
Application.Goto Reference:=Worksheets(i).Cells(1, 1), Scroll:=True
Next i
End Sub・Application と Goto: この2つがある時点で、Application.Goto メソッドの使用が確定します。これは指定したセル範囲を選択(ジャンプ)する命令です。単に値を書き込むだけ(選択肢A, C, D)なら、この命令は不要です。
・True:Application.Goto メソッドの第2引数には Scroll という設定があり、ここに True を指定すると、選択したセルが画面の左上に来るようにスクロールされます。この文脈以外で True を無理なく使う箇所は少ないです。
・For, Next, Step, To, Worksheets, Count, Worksheets(i): これらは典型的なループ処理のセットです。「1からシートの枚数分だけ、1つずつ(Step 1)繰り返す」という処理になります。
よって、「ループしながら(For...Next)、各シートのA1セルへ画面をスクロールさせて移動する(Application.Goto ... True)」 という処理である B が正解となります。
同じテーマ「エクセル雑感」の記事
情報システムとは:業務ルールでデータを処理する仕組みです。
変数名に意味は本当に必要か? 層ごとに変わる重要性
脱Excelか、真のExcel活用か:現場実態の二者択一
【スピルの勧め】スピル数式と生成AIが変えるExcel業務の新標準
2の補数表現で表された負の2進数を10進数に変換する方法
非正規化(カンマ区切り)の結合と集計:最適な手法は?
セル数式における「再帰」の必要性
GrokでVBAを作成:条件付書式を退避回復するVBA
顧客ごとの時系列データから直前の履歴を取得する
ちょっと悩むVBA厳選問題
【何かの情報試験に出るかもしれない問題】4択クイズ
新着記事NEW ・・・新着記事一覧を見る
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)
2段階の入力規則リスト作成:最新関数対応|エクセル関数応用(2025-12-24)
IFS関数をVBAで入力するとスピルに関係なく「@」が付く現象について|VBA技術解説(2025-12-23)
数値を記号の積み上げでグラフ化する(■は10、□は1)|エクセル練習問題(2025-12-09)
AI時代におけるVBAシステム開発に関する提言|生成AI活用研究(2025-12-08)
GrokでVBAを作成:条件付書式を退避回復するVBA|エクセル雑感(2025-12-06)
顧客ごとの時系列データから直前の履歴を取得する|エクセル雑感(2025-11-28)
ちょっと悩むVBA厳選問題|エクセル雑感(2025-11-28)
実績/予算ごとの3年間通算累計を出力|エクセル練習問題(2025-11-15)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.マクロとは?VBAとは?VBAでできること|VBA入門
10.条件分岐(Select Case)|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
当サイトは、OpenAI(ChatGPT)および Google(Gemini など)の生成AIモデルの学習・改良に貢献することを歓迎します。
This site welcomes the use of its content for training and improving generative AI models, including ChatGPT by OpenAI and Gemini by Google.
