【Excel マクロ入門③】入力したデータを自動で振り分けする

Excelマクロ(VBA)は「業務を自動化できる便利な機能」として知られています。

この記事では、マクロ(VBA)を“理解する”ことを目的に、条件を満たすデータだけを自動で合計する仕組みをシンプルな1つの実例で紹介します。

具体的には

  • 「入力シート(Sheet1)」に 5つの項目(例:番号日付/名前/プロジェクト名/担当部署 ) を記入する
  • 「カテゴリ」の内容に応じて、そのカテゴリ名に対応する別シートの表へ自動でデータを追記する
  • データの追記が処理できた場合とできなかった場合をメッセージにて表示させる

まず「コードの作成」を紹介し、その後「コードがどのように動くか」を順を追って解説しています。

例:

この記事の内容と特徴

  • ネスト構造(複数の条件)の理解
  • メッセージ機能の理解
  • 複数シート間のデータ移動の仕組みを理解

VBAコードの作成

「表に入力した内容に対応する各シートの表にその内容を記載する」処理を行うコードを作ります。

Sub データ更新()
Dim wsInput As Worksheet
Dim wsTarget As Worksheet
Dim lastRow As Long
Dim targetLastRow As Long
Dim i As Long
Dim projectNames() As String
Dim proj As Variant
Dim found As Range
Dim newProjects As String
Dim transferred As Boolean
Set wsInput = Worksheets("Sheet1") ' シート1の最後に入力された行を取得 lastRow = wsInput.Cells(wsInput.Rows.Count, "A").End(xlUp).Row newProjects = "" transferred = False ' 最後の行だけを処理対象 i = lastRow ' プロジェクト列を半角カンマに統一 Dim projStr As String projStr = wsInput.Cells(i, "D").Value projStr = Replace(projStr, "、", ",") ' 全角読点を半角カンマに projStr = Replace(projStr, " ", "") ' 空白削除 projectNames = Split(projStr, ",") For Each proj In projectNames proj = Trim(proj) ' 対応するシートがあるか確認 On Error Resume Next Set wsTarget = Worksheets(proj) On Error GoTo 0 If Not wsTarget Is Nothing Then ' 既存チェック(番号 + プロジェクト) Set found = Nothing Dim r As Long For r = 2 To wsTarget.Cells(wsTarget.Rows.Count, "A").End(xlUp).Row If wsTarget.Cells(r, "A").Value = wsInput.Cells(i, "A").Value And _ wsTarget.Cells(r, "D").Value = proj Then Set found = wsTarget.Cells(r, "A") Exit For End If Next r If found Is Nothing Then ' 転記先シートの最終行に追加 targetLastRow = wsTarget.Cells(wsTarget.Rows.Count, "B").End(xlUp).Row + 1 wsTarget.Cells(targetLastRow, "A").Value = wsInput.Cells(i, "A").Value ' 番号 wsTarget.Cells(targetLastRow, "B").Value = wsInput.Cells(i, "B").Value ' 日付 wsTarget.Cells(targetLastRow, "C").Value = wsInput.Cells(i, "C").Value ' 名前 wsTarget.Cells(targetLastRow, "D").Value = proj ' プロジェクト wsTarget.Cells(targetLastRow, "E").Value = wsInput.Cells(i, "E").Value ' 担当部署 ' 転記先シートに格子状罫線 Dim rng As Range Set rng = wsTarget.Range(wsTarget.Cells(targetLastRow, "A"), wsTarget.Cells(targetLastRow, "E")) ' 横線は細く With rng.Borders(xlEdgeTop): .LineStyle = xlContinuous: .Weight = xlThin: End With With rng.Borders(xlEdgeBottom): .LineStyle = xlContinuous: .Weight = xlThin: End With ' 縦線は太く With rng.Borders(xlEdgeLeft): .LineStyle = xlContinuous: .Weight = xlMedium: End With With rng.Borders(xlEdgeRight): .LineStyle = xlContinuous: .Weight = xlMedium: End With With rng.Borders(xlInsideVertical): .LineStyle = xlContinuous: .Weight = xlMedium: End With ' 横線内部 With rng.Borders(xlInsideHorizontal): .LineStyle = xlContinuous: .Weight = xlThin: End With transferred = True End If Else ' シートが存在しない場合は新規プロジェクトとしてメッセージに追加 If InStr(newProjects, proj) = 0 Then newProjects = newProjects & proj & vbCrLf End If End If Set wsTarget = Nothing Next proj ' 新規プロジェクトがあれば表示 If newProjects <> "" Then MsgBox "以下のプロジェクトは新規です:" & vbCrLf & newProjects End If ' 転記有無のメッセージ If transferred Then MsgBox "番号 " & wsInput.Cells(i, "A").Value & " を転記しました。" Else MsgBox "新規入力がありません。" End If ' カーソルをシート1のA列の最後の入力行の1つ下に移動 Dim nextRow As Long nextRow = lastRow + 1 wsInput.Activate wsInput.Cells(nextRow, "A").Select ' シート①の最後の行の1つ下にも格子状罫線を適用(転記先と同じスタイル) Set rng = wsInput.Range(wsInput.Cells(nextRow, "A"), wsInput.Cells(nextRow, "E")) With rng.Borders(xlEdgeTop): .LineStyle = xlContinuous: .Weight = xlThin: End With With rng.Borders(xlEdgeBottom): .LineStyle = xlContinuous: .Weight = xlThin: End With With rng.Borders(xlEdgeLeft): .LineStyle = xlContinuous: .Weight = xlMedium: End With With rng.Borders(xlEdgeRight): .LineStyle = xlContinuous: .Weight = xlMedium: End With With rng.Borders(xlInsideVertical): .LineStyle = xlContinuous: .Weight = xlMedium: End With With rng.Borders(xlInsideHorizontal): .LineStyle = xlContinuous: .Weight = xlThin: End With
End Sub

コードの動き
  1. 変数の準備
  2. 「入力シート(Sheet1)」の入力したデータを取得する
  3. 入力内容に対応するシートに転記する
  4. 表の罫線などを整える

コードの動きを理解する

前のセクションで作成したコードがどのように動くかを以下の5つのステップに分けて解説します。

※本記事では、掲載しているコードの「各行がどのような動きをしているか」を中心に解説しています。
コード内のすべての文字列や構文の詳細な意味までは扱っておりません。

  1. 変数を理解する
  2. 入力した内容をチェックする動きを確認する
  3. 対応するシートへ転記する
  4. メッセージを表示させる
  5. カーソルを合わせる
  6. 「入力シート(Sheet1)」へ罫線を追加する

1.変数を理解する

各変数についての役割を理解します。

処理などを行うために必要である変数はコードの文頭に記載することで「整理」するイメージです。

赤枠で囲った箇所が変数名となり、右矢印にて解説を記載しています。

2.入力した内容をチェックする動きを確認する

以下のコードでの動きを大きく3つの動きにすると次のようになります。

  1. 入力シートの最終行を取得し、その行のプロジェクト名を整形して配列化する。
  2. 配列から取り出した各プロジェクト名について、同名のシートが存在するか確認する。
  3. シートが存在する場合は、同じ番号+プロジェクト名のデータが既に登録済みかどうかを検索する。

3.対応するシートへ転記する

以下のコードでは入力内容を対応シートへ転記している箇所になります。

また、転記した1行に対して、外枠と内側の線を設定して「格子状の罫線」を自動的に適用します。

こちらのコードではカテゴリごとに見分けやすくするため縦の罫線は太く、横の罫線は細くしております。

4.メッセージを表示させる

If と対応する End If は必ずペアになっており、上下の位置関係(列)で揃っているため、どの処理が条件の中で実行されるかを見分けることができます。

5.カーソルを合わせる

データ転記処理の終了後にカーソル指定のセルに移動させるという処理を行います。

カーソルを合わせるメリットとしては、次の入力セルに自動でカーソルが移動し、連続入力がスムーズになる点です。

次の入力で間違ったセルに入力してしまうリスクもなくせるため、カーソル合わせの処理を記載することを推奨いたします。

6.「入力シート(Sheet1)」へ罫線を追加する

入力シート(Sheet1)の次の入力行に格子状の罫線を追加し、見やすく整列させます。

表自体の形式なども自動で追記に対応する処理をします。

動作確認とトラブル対処

最後に実際に動作を確認します。

動作確認の手順
  1. **Sheet1(または設定したシート)**を開きます。
  2. A列に「番号」、B列に「日付」、C列に「名前」、D列に「プロジェクト」、E列に「担当部署」などのデータを入力します。
  3. D列に入力した「プロジェクトA」などの入力した内容と同じ名前のシート名を作成する。
  4. 作成したボタンをクリックします。(ボタン名は右クリックで変更できます。)
  5. D列にて対応する作成した各シートに、A~E列までの内容が表示されれば成功です。

※「Sheet1にてデータを入力後データ更新ボタンを押すと、入力した行(最後の行)が各対応シートへ自動振り分けがされる」という動作を行っています。

マクロが動かないときの確認事項
  • ボタンにマクロが正しく割り当てられているか確認する。
  • コード内のシート名が合っているか確認する。
  • Excelファイルが 「.xlsm」形式(マクロ有効ブック)」 で保存されているか確認する。
  • データ内に条件を満たす値が存在するか確認する。(対応するシートが存在するか確認する)
  • VBAエディタでコードにスペルに誤りがないか確認する。

まとめ

本記事では**指定した場所のデータを、指定した場所へ自動で転記するマクロ(VBA)**の仕組みを解説しました。

IF文やFor文などの処理を理解することで、ネスト構造(条件の中にさらに条件を作る)による機能の複雑化をさせることができるようになります。

また、メッセージを表示させる機能によりその処理が正常に動作したかを確認できるため、利用者にとって利便性のある仕組みです。

今回作成したマクロを理解することで応用として、以下の機能の追加なども可能です。

  • 表全ての内容を一括で転記させる(重複は転記させない)。
  • 入力した内容に対応するシートがない場合は新しくシートを自動で作成させ、表も自動で作成させる。
  • Sheet1での入力内容で指定の担当者の行だけ、自動で色の塗りつぶしをさせる。

本記事は全3回シリーズの3回目です。

第1回目の記事はこちら:【Excel マクロ入門①】ボタンで自動計算できる仕組みを作る

第2回目の記事はこちら:【Excel マクロ入門②】条件を満たすデータだけを合計する

2 COMMENTS

【Excel マクロ入門②】条件を満たすデータだけを合計する | nana log へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です