エクセル雑感
ちょっと悩むVBA厳選問題

ExcelマクロVBAとエクセル関数についての私的雑感
公開日:2025-11-28 最終更新日:2026-01-18

ちょっと悩むVBA厳選問題


X(Twitter)で、【VBA問題】として出した4択問題を集めました。
ちょっと捻った問題が多いので、全問正解するのは、結構難しいかもしれません。


ページ内目次

小数誤差の解消

Debug.Print (0.1 + 0.2) = 0.3
この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だけに数式を入れるとエラーになります。
エラー発生個所の把握2



SortFieldsの指定方法

A1から連続するデータをB列で並べ替えます。
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
このVBAコードを実行したとき、メッセージボックスに表示される値は?





■ 正解と解説

正解は 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
このVBA関数の挙動と最も近いPythonのリスト操作を選びなさい。





■ 正解と解説

正解は A. pop です。
VBA関数 fnc は、インデックス b(省略時は末尾)の要素を取り出しつつ、その要素を配列から削除し、配列の要素を詰めています。
この「要素を返す」と「要素を削除する」を同時に行う動作は、Pythonのリスト操作である list.pop(index) と完全に一致します。
remove は値を指定して削除し、何も返しません。
del はインデックスを指定して削除しますが、何も返しません。
delete というメソッドは存在しません。



Xorでの値入替

変数x,yには整数が入っています。
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
これを実行し、Inputボックスで「キャンセル」をクリックしたとき、「True」になるのはどれか?





■ 正解と解説

正解は 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を作成

True
Worksheets
Next
For
Application
To
Worksheets(i)
Step
Count
Goto
Cells(1,1)

以上の"単語を全て使用"してVBAを作成してください。
(不足する単語は追加して良い)

という問題を生成AIに出題しました。
さて、どのような処理の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 が正解となります。



シート上にある全ての図形の一括削除

アクティブシート上にある全ての図形(オートシェイプ、画像、テキストボックスなど)を、ループ処理(For Eachなど)を使わずに、一行のコードで一括削除したいと考えています。
次のコードの【①】に入る最も適切なプロパティを選択してください。
ActiveSheet.【①】.Delete





■ 正解と解説

正解は D. DrawingObjects です。
標準的な Shapes プロパティを使って図形を消す場合、図形を1つずつ指定して命令を下す必要があるため、For Each などのループ処理が欠かせません。
ただし、この場合のVBAには問題点があります。
入力規則のドロップダウンが消えてしまうマクロ(Shapes内のDrop Down)

シートのShapeを全削除すると、入力規則のリストのドロップダウンが消えてしまいます。入力規則のリストのドロップダウンの設定については、エクセル入門.入力規則.リスト こちらを参照して下さい。入力規則のリストのドロップダウンが消えてしまう具体的なマクロは、以下のようなVBAコードになります。
一方、DrawingObjects はExcelの旧バージョンとの互換性のために残されている特殊なオブジェクトです。
これに対して Delete を実行すると、シート上のすべての図形(オートシェイプ、画像、テキストボックス等)に対して一括で削除命令が届く仕組みになっています。
そのため、ループを使わず「一行」で書きたい場合には、このプロパティを利用するのが最も効率的で標準的な手法となります。



環境移行時に発生する不可解な文字列関数エラー

VBAでは、意味不明なエラーがでることがあります。
VBAを別の環境に移したところ、標準の文字列関数 Right、Left、Mid が エラー になってしまいました。
次のうち、この現象の最も可能性の高い原因はどれでしょうか?





■ 正解と解説

正解は B. 参照設定に「参照不可」がある です。
VBAの標準関数がエラーになる正体は、参照設定の中に「参照不可」となったライブラリが混じっていることです。
VBAは実行時、参照設定リストを順に確認して関数の場所を特定しますが、一つでも「参照不可」な項目があると、正常な標準関数(LeftやRightなど)の場所まで見失ってしまいます。
これは、環境移行時にOfficeのバージョンが異なったり、必要な外部アプリがなかったりすることで発生します。



情報落ちを防ぐ:大きな数値と微小な数値の加算

Debug.Print 10 ^ 10 + 10 ^ -5
この出力結果は、
「10000000000」
となり、小数以下が消えてしまいます。
以下のように関数を指定することで、
「10000000000.00001 」
と、正しく出力されるようになります。
Debug.Print 関数(10 ^ 10) + 10 ^ -5
適切な関数を選んでください。





■ 正解と解説

正解は D. CDec です。
コンピュータの「有効桁数の限界」に関するものです。
原因:情報落ち
VBAの標準的な数値(Double型)は、約15桁までしか記憶できません。
今回の計算結果 10,000,000,000.00001 は全部で 16桁 必要なため、15桁に収まらない末尾の「1」が切り捨てられてしまいます。
このように、大きな数に小さな数を足した際に値が消える現象を情報落ちと呼びます。
解決策:CDec
CDec(Decimal型)は、最大 28桁 まで保持できる非常に精度の高いデータ型です。
計算の過程で CDec を使えば、16桁の数値も余裕を持って扱えるため、微小な小数も正しく計算・保持されます。
他の選択肢
CDbl / CSng: 桁数が足りず、同様に情報落ちします。
CCur: 小数点以下4桁までしか扱えないため、5桁目の「1」が消えてしまいます。





同じテーマ「エクセル雑感」の記事

情報システムとは:業務ルールでデータを処理する仕組みです。
変数名に意味は本当に必要か? 層ごとに変わる重要性
脱Excelか、真のExcel活用か:現場実態の二者択一
【スピルの勧め】スピル数式と生成AIが変えるExcel業務の新標準
2の補数表現で表された負の2進数を10進数に変換する方法
非正規化(カンマ区切り)の結合と集計:最適な手法は?
セル数式における「再帰」の必要性
GrokでVBAを作成:条件付書式を退避回復するVBA
顧客ごとの時系列データから直前の履歴を取得する
ちょっと悩むVBA厳選問題
【何かの情報試験に出るかもしれない問題】4択クイズ


新着記事NEW ・・・新着記事一覧を見る

AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)
カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ