こんにちは。ECF Tech担当
Michiharu.Tです。
今回はExcel VBA トレーニング問題 No.1と致しまして、本ブログで提供しているExcel VBA入門第1回~第6回までの内容を活用した練習問題をご用意致しました。
Excel VBA初学者の方でも取り組める問題をご用意しております。ぜひ、普段の学習にご活用頂ければと思います。
その他のExcel VBA関連の教材および練習問題は下記よりご覧いただけます。

使い方
- 資料をこちらよりダウンロードしてください。
- 各問題はダウンロードデータの初期状態から取り組むことを前提としています。
- 各問題は次の要素から構成されています。
- 問題:プログラムの作成指示です。
- 条件:プログラムを作成するにあたり、守るべき条件です。
- ヒント:プログラムを書くためのヒントです。
- 解答例:動作するプログラムの例です。
問題1
問題
「売上データ」シートのB列の内容を、F列にコピーするマクロを作成ください。マクロ名は「pickItemName」とします。
処理イメージ
条件
「売上データ」シートがアクティブシートであることを前提に作成して構いません。
ヒント
- For Nextステートメントを使って、11回のくり返し処理をしましょう。
問題2
問題
「売上データ」シートの各行の数量と単価をかけ算し、F列に商品ごとの小計を求めるマクロを作成してください。マクロ名は「calcSubTotal」とします。
処理イメージ
条件
「売上データ」シートがアクティブシートであることを前提に作成して構いません。
ヒント
- 小計を求めるために、C列とD列の値をかけ算します。
- かけ算の処理は売上データの数(10件分)だけ行う必要がありますので、For Nextステートメントを使いましょう。
問題3
問題
「売上データ」シートのF1に入力された商品名をB列から探すマクロを作成します。
- F1の商品名が見つかった場合は、メッセージボックスで「〇行目に見つかりました。」と表示します。
- F1の商品名が見つからなかった場合は、「一致する商品がありません。」と表示します。
マクロ名は「findItem」とします。
該当商品が見つかった場合
該当商品が見つからない場合
条件
- 「売上データ」シートがアクティブシートであることを前提に作成して構いません。
- F1セルには何らかの値が入っているものとします。
ヒント
-
メッセージボックスを使ったメッセージの出力は次のようなプログラムで記述できます。
MsgBox "表示したいメッセージ"
表示したいメッセージの部分には変数を使うこともできます。 -
見つからなかった場合のメッセージをあらかじめ変数に代入しておくと、プログラムが書きやすくなります。下記は参考プログラムです。
Dim msg msg = "一致する商品がありません。"
問題4
問題
「売上データ」シートのA1~D11の内容を、F1~I11にコピーするマクロを作成してください。
処理イメージ
ヒント
- 二重ループを使用しましょう。
- Cellsを使って次のように記述することで、変数を使ってセルを参照できます。
Cells(i, j).Value
問題5
問題
「売上データ」シートの各商品名を、「商品データ」シートのA列にコピーするマクロを作成してください。
処理イメージ
条件
- 「商品データ」シートはあらかじめ作成されているものとします。
- どのシートがアクティブシートであっても、正しく動作するようにしてください。
ヒント
Worksheets("シート名")
の表現を使って、シートを明確に参照するようにしましょう。- For Nextステートメントを使いましょう。
問題6
問題
「売上データ」シートから、数量が10以上の商品の商品名を抽出し、「売れ筋商品一覧」シートのA列(A2から)に商品名をならべてください。マクロ名は「hotItems」とします。
処理イメージ
条件
- 「売れ筋商品一覧」シートは作成されているものとします。
- どのシートがアクティブシートであっても、正しく動作するようにしてください。
ヒント
- For NextステートメントとIfステートメントを使用します。
- それぞれのシートを参照する変数は個別に準備しましょう。
問題1 解答例
Sub pickItemName() Dim i As Integer '変数iの宣言 'iを1~11までくり返して、1行ずつコピーする For i = 1 To 11 Range("F" & i).Value = Range("B" & i).Value Next i End Sub
解説
Dim i As Integer
は、繰り返しのカウンタを宣言しています。For i = 1 To 11
で1行目から11行目まで繰り返します。Range("F" & i).Value = Range("B" & i).Value
で、B列の値をF列にコピーしています。
問題2 解答例
Sub calcSubTotal() Dim i As Integer '「小計」を出力 Range("F1").Value = "小計" '2行目から11行目の各売上の数量と単価をかけ算し、F列に出力 For i = 2 To 11 Range("F" & i).Value = Range("C" & i).Value * Range("D" & i).Value Next i End Sub
解説
Range("F1").Value = "小計"
でF1セルに見出しを入れます。Range("C" & i).Value * Range("D" & i).Value
で、C列(数量)とD列(単価)の掛け算を行い、結果をF列に書き込みます。
問題3 解答例
Sub findItem() Dim i As Integer Dim msg As String '見つからなかった場合のメッセージをあらかじめセット msg = "一致する商品がありません。" 'B列から商品名を検索 For i = 2 To 11 If Range("B" & i) = Range("F1") Then msg = i & "行目に見つかりました。" End If Next i 'メッセージを出力 MsgBox msg End Sub
解説
msg
変数に初期メッセージを入れておきます。If Range("B" & i) = Range("F1") Then
で、F1セルの値とB列の各行を比較します。- 見つかったら、
msg
を上書きし、最後にMsgBox msg
でメッセージを表示します。
問題4 解答例
Sub areaCopy() Dim i As Integer Dim j As Integer For i = 1 To 11 '行のくり返し For j = 1 To 4 '列のくり返し Cells(i, j + 5).Value = Cells(i, j).Value Next j Next i End Sub
解説
- 二重ループで行(i)と列(j)を繰り返しています。
Cells(i, j + 5)
で、コピー先(F列以降)を指定しています。Cells(i, j)
はコピー元(A列~D列)を参照します。
問題5 解答例
Sub itemNameCopy() Dim i As Integer 'iを1~11までくり返して、1行ずつコピーする For i = 1 To 11 Worksheets("商品データ").Range("A" & i).Value = Worksheets("売上データ").Range("B" & i).Value Next i End Sub
解説
Worksheets("シート名")
で特定のシートを指定しています。- 「売上データ」シートのB列を 「商品データ」シートのA列にコピーしています。
問題6 解答例
Sub hotItems() Dim i As Integer Dim j As Integer j = 2 'iを2~11までくり返す。 For i = 2 To 11 '数量が10以上かをチェック If Worksheets("売上データ").Range("C" & i).Value >= 10 Then '売れ筋商品一覧シートにコピー Worksheets("売れ筋商品一覧").Range("A" & j).Value = Worksheets("売上データ").Range("B" & i).Value '売れ筋商品一覧シートを参照する変数を1加算 j = j + 1 End If Next i End Sub
解説
j
は「売れ筋商品一覧」シートの出力行を指します。2から開始して、見つけるたびに加算しています。If
文で数量が10以上かどうかを判定しています。Worksheets("売上データ")
とWorksheets("売れ筋商品一覧")
でシートを明確に指定しています。
今回はここまでとさせて頂きます。最後までご覧いただき、ありがとうございました。ひきつづき、実践的な問題を提供していきたいと思います。次回以降もどうぞよろしくお願いいたします。