動かして学ぶExcel VBA入門 トレーニング問題(1)

Excel VBA

こんにちは。ECF Tech担当
Michiharu.Tです。

今回はExcel VBA トレーニング問題 No.1と致しまして、本ブログで提供しているExcel VBA入門第1回~第6回までの内容を活用した練習問題をご用意致しました。

Excel VBA初学者の方でも取り組める問題をご用意しております。ぜひ、普段の学習にご活用頂ければと思います。

その他のExcel VBA関連の教材および練習問題は下記よりご覧いただけます。

【初心者向け】動かして学ぶExcel VBA入門
Excel VBAを動かしながら学べる連載をお送りしています。講座目次第1回Excel VBAとはExcelマクロを動かしてみようExcelマクロの保存第2回セルに値を設定セルの削除オブジェクト、プロパティ、メソッド第3回ワークシートの指定...

使い方

  • 資料をこちらよりダウンロードしてください。
  • 各問題はダウンロードデータの初期状態から取り組むことを前提としています。
  • 各問題は次の要素から構成されています。
    • 問題:プログラムの作成指示です。
    • 条件:プログラムを作成するにあたり、守るべき条件です。
    • ヒント:プログラムを書くためのヒントです。
    • 解答例:動作するプログラムの例です。

問題1

問題

「売上データ」シートのB列の内容を、F列にコピーするマクロを作成ください。マクロ名は「pickItemName」とします。

処理イメージ

問題1-1

条件

「売上データ」シートがアクティブシートであることを前提に作成して構いません。

ヒント

  • For Nextステートメントを使って、11回のくり返し処理をしましょう。

問題2

問題

「売上データ」シートの各行の数量と単価をかけ算し、F列に商品ごとの小計を求めるマクロを作成してください。マクロ名は「calcSubTotal」とします。

処理イメージ

問題2-1

条件

「売上データ」シートがアクティブシートであることを前提に作成して構いません。

ヒント

  • 小計を求めるために、C列とD列の値をかけ算します。
  • かけ算の処理は売上データの数(10件分)だけ行う必要がありますので、For Nextステートメントを使いましょう。

問題3

問題

「売上データ」シートのF1に入力された商品名をB列から探すマクロを作成します。

  • F1の商品名が見つかった場合は、メッセージボックスで「〇行目に見つかりました。」と表示します。
  • F1の商品名が見つからなかった場合は、「一致する商品がありません。」と表示します。

マクロ名は「findItem」とします。

該当商品が見つかった場合

問題3-1

該当商品が見つからない場合

問題3-2

条件

  • 「売上データ」シートがアクティブシートであることを前提に作成して構いません。
  • F1セルには何らかの値が入っているものとします。

ヒント

  • メッセージボックスを使ったメッセージの出力は次のようなプログラムで記述できます。
    MsgBox "表示したいメッセージ"
    表示したいメッセージの部分には変数を使うこともできます。

  • 見つからなかった場合のメッセージをあらかじめ変数に代入しておくと、プログラムが書きやすくなります。下記は参考プログラムです。

    Dim msg
    msg = "一致する商品がありません。"

問題4

問題

「売上データ」シートのA1~D11の内容を、F1~I11にコピーするマクロを作成してください。

処理イメージ

問題4-1

ヒント

  • 二重ループを使用しましょう。
  • Cellsを使って次のように記述することで、変数を使ってセルを参照できます。
    Cells(i, j).Value

問題5

問題

「売上データ」シートの各商品名を、「商品データ」シートのA列にコピーするマクロを作成してください。

処理イメージ

問題5-1

条件

  • 「商品データ」シートはあらかじめ作成されているものとします。
  • どのシートがアクティブシートであっても、正しく動作するようにしてください。

ヒント

  • Worksheets("シート名")の表現を使って、シートを明確に参照するようにしましょう。
  • For Nextステートメントを使いましょう。

問題6

問題

「売上データ」シートから、数量が10以上の商品の商品名を抽出し、「売れ筋商品一覧」シートのA列(A2から)に商品名をならべてください。マクロ名は「hotItems」とします。

処理イメージ

問題6-1

条件

  • 「売れ筋商品一覧」シートは作成されているものとします。
  • どのシートがアクティブシートであっても、正しく動作するようにしてください。

ヒント

  • 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("売れ筋商品一覧")でシートを明確に指定しています。

今回はここまでとさせて頂きます。最後までご覧いただき、ありがとうございました。ひきつづき、実践的な問題を提供していきたいと思います。次回以降もどうぞよろしくお願いいたします。

タイトルとURLをコピーしました