【初心者向け】シートデータをコード別に自動で分けるマクロの作り方

 

毎回、Excelの同じ作業に時間を取られていませんか?

たとえば「コードごとにデータを分けてシートを作成する」ような地味だけど面倒な作業…。

でも実は、それ、たった1クリックで自動化できるって知っていましたか?

この記事では、初心者の方でも安心して使える「コードごとにシートを分けるExcelマクロ」の使い方を、画像・手順付きでわかりやすく解説します。

ぜひご自身の作業に合わせて使ってみてください。

 

 

初心者向けマクロの作り方|コードごとに自動シート作成はどんなときに便利?

Excelシートに同じ表形式のデータが大量にあるとき、「コードごとに別のシートに分けて保存したい…」ということはありませんか?

 

たとえば

・売上データ、仕入データなどのシートから
 ・担当者コードシートごとに分ける
 ・商品コードシートごとに分ける
 ・得意先コードシートごとに分ける

・生産実績データのシートから
 ・工場ラインコードごとに分ける

 

そんな時に便利なのが、この「コードごとに自動でシートを分けるマクロ」です。

 

初心者向けマクロの作り方|コードごとに自動シート作成できること

1枚のシートにまとめられたデータから、指定した列(例:A列の「コード」)をキーにして、コードごとに新しいシートを作成し、データを分けて転記します。

 

手作業不要!「マクロ実行」だけですぐに完成します。

 

初心者向けマクロの作り方|コードごとに自動シート作成の使い方はたったの3ステップ

 

1. 元データをExcelに準備する。

2. マクロを起動(フォームから対象のExcelとコード列を指定)

3. 各コードごとのシートが自動で作成されます。

 

もう、手作業でフィルタしてコピー&ペーストする必要はありません。

 

初心者向けマクロの作り方|コードごとに自動シート作成|押さえるべき3つのポイント

 

①モジュール構成を覚えよう

「ThisWorkbook」→ 起動時にフォーム表示

「UserForm」→ フォームの見た目と操作

「標準モジュール」→ 実際の分割処理

 

②対象Excelフォーマット

コード列を統一しておく(たとえば、担当者コードはA列に統一する)

 

③トラブル対策

マクロを実行する前に、対象のExcelファイルをバックアップする(別フォルダにコピーをとる)

 

初心者向けマクロの作り方|コードごとに自動シート作成|よく変更が行われる箇所

変更箇所 内容 たとえば、このように変更
wb.Sheets(1) データがあるシートを指定 wb.Sheets(2)
newWS.Name = code シート名の形式 ”担当 ” & code

 

 

初心者向けマクロの作り方|コードごとに自動シート作成【検証済】コード

シートデータをコード別に自動で分ける【検証済】マクロコード一式(フォーム+標準モジュール+ThisWorkbook)を紹介します。

 

ThisWorkbook モジュール

xlsmファイルを開いたときに自動でフォームを表示するコードです。

 

  1. Option Explicit
  2. Private Sub Workbook_Open()
  3.      UserForm1.Show vbModeless
  4. End Sub
  1. Option Explicit
  2. Private Sub Workbook_Open()
  3.      UserForm1.Show vbModeless
  4. End Sub

 

 

フォーム

フォームのデザイン

オブジェクト名 種類 キャプション
変更しない Label 対象Excelファイル
txtFile TextBox 空白
btnBrowse CommandButton ファイル選択
変更しない Label コード列(例:A)
txtColumn TextBox 空白
btnSplit CommandButton データを分ける
btnClose CommandButton 終了

 

フォームのコード(UserForm1)

 

  1. Option Explicit
  2. Private Sub UserForm_Initialize()
  3.     ' Excelウィンドウを最小化し、フォームを前面に出す
  4.     Application.WindowState = xlMinimized
  5.     Me.StartUpPosition = 1 ' 画面中央
  6.     Me.Show vbModeless
  7. End Sub
  8. Private Sub btnBrowse_Click()
  9.     Dim fd As FileDialog
  10.     Set fd = Application.FileDialog(msoFileDialogFilePicker)
  11.     With fd
  12.         .Title = "Excelファイルを選択してください"
  13.         .Filters.Add "Excel Files", "*.xls; *.xlsx; *.xlsm"
  14.         If .Show = -1 Then
  15.             txtFile.Text = .SelectedItems(1)
  16.         End If
  17.     End With
  18. End Sub
  19. Private Sub btnSplit_Click()
  20.     Application.ScreenUpdating = False
  21.     
  22.     Dim colLetter As String
  23.     colLetter = UCase(txtColumn.Text) ' 大文字に統一
  24.     ' 列記号が正しいかと、2行目のセルに値があるか確認
  25.     Dim wb As Workbook
  26.     Set wb = Workbooks.Open(txtFile.Text)
  27.     Dim srcWs As Worksheet
  28.     Set srcWs = wb.Sheets(1) ' 最初のシートを対象に
  29.     Dim checkValue As Variant
  30.     On Error Resume Next
  31.     checkValue = srcWs.Range(colLetter & "2").Value
  32.     On Error GoTo 0
  33.     
  34.     ' 列記号の妥当性チェック
  35.     If Not IsValidColumnLetter(colLetter) Then
  36.         MsgBox "列記号が無効です。" & vbCrLf & "A ? XFD の範囲で入力してください。", vbExclamation
  37.         Application.ScreenUpdating = True ' MsgBox後に復元
  38.         wb.Close SaveChanges:=False
  39.         Exit Sub
  40.     End If
  41.     If IsEmpty(checkValue) Or checkValue = "" Then
  42.         MsgBox "範囲外の列指定になっています。" & vbCrLf & _
  43.                "指定した列の2行目に値がありません。", vbExclamation
  44.         Application.ScreenUpdating = True ' MsgBox後に復元
  45.         wb.Close SaveChanges:=False
  46.         Exit Sub
  47.     End If
  48.     
  49.     Application.ScreenUpdating = True
  50.     
  51.     If txtFile.Text = "" Or txtColumn.Text = "" Then
  52.         MsgBox "ファイルと列を指定してください", vbExclamation
  53.         Exit Sub
  54.     End If
  55.     
  56.     ' データ処理を実行
  57.     Call 分割処理(txtFile.Text, txtColumn.Text)
  58. End Sub
  59. Private Sub btnClose_Click()
  60.     Application.WindowState = xlNormal
  61.     ThisWorkbook.Save
  62.     Application.Quit
  63. End Sub
  64. Function IsValidColumnLetter(colLetter As String) As Boolean
  65.     On Error GoTo ErrHandler
  66.     Dim rng As Range
  67.     Set rng = Worksheets(1).Range(colLetter & "1")
  68.     IsValidColumnLetter = True
  69.     Exit Function
  70. ErrHandler:
  71.     IsValidColumnLetter = False
  72. End Function

 

標準モジュール(Module1)

 

  1. Option Explicit
  2. Public Sub 分割処理(ByVal filePath As String, ByVal codeColumn As String)
  3.     Application.ScreenUpdating = False
  4.     Application.DisplayAlerts = False
  5.     Dim wb As Workbook
  6.     Dim ws As Worksheet
  7.     Dim header As Range
  8.     Dim lastRow As Long
  9.     Dim colNum As Long
  10.     Dim code As Variant
  11.     Dim cell As Range
  12.     Dim rng As Range
  13.     Dim newWS As Worksheet
  14.     Dim destWB As Workbook
  15.     Dim existingCodes As Object
  16.     Set wb = Workbooks.Open(filePath)
  17.     Set ws = wb.Sheets(1)
  18.     ' コード列番号取得
  19.     colNum = Range(codeColumn & "1").Column
  20.     lastRow = ws.Cells(ws.Rows.Count, colNum).End(xlUp).Row
  21.     ' ソート
  22.     Set rng = ws.Range("A1", ws.Cells(lastRow, ws.Cells(1, Columns.Count).End(xlToLeft).Column))
  23.     rng.Sort Key1:=ws.Cells(2, colNum), Order1:=xlAscending, header:=xlYes
  24.     ' すでにシートが存在しているか確認
  25.     Set existingCodes = CreateObject("Scripting.Dictionary")
  26.     For Each newWS In wb.Sheets
  27.         existingCodes(newWS.Name) = True
  28.     Next
  29.     ' コード列ごとに処理
  30.     Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
  31.     Dim i As Long
  32.     For i = 2 To lastRow
  33.         code = Trim(ws.Cells(i, colNum).Value)
  34.         If code <> "" Then
  35.             If Not dict.exists(code) Then
  36.                 dict.Add code, Nothing
  37.             End If
  38.         End If
  39.     Next
  40.     ' すでにシートがあるかチェック
  41.     Dim alreadyExists As Boolean: alreadyExists = False
  42.     For Each code In dict.Keys
  43.         If existingCodes.exists(code) Then
  44.             alreadyExists = True
  45.             Exit For
  46.         End If
  47.     Next
  48.     If alreadyExists Then
  49.         MsgBox "すでにシート分けしています", vbInformation
  50.         wb.Close SaveChanges:=False
  51.         Application.ScreenUpdating = True
  52.         Application.DisplayAlerts = True
  53.         Exit Sub
  54.     End If
  55.     ' シート分割
  56.     For Each code In dict.Keys
  57.         Set newWS = wb.Sheets.Add(After:=wb.Sheets(wb.Sheets.Count))
  58.         newWS.Name = code
  59.         ' ヘッダー
  60.         ws.Rows(1).Copy Destination:=newWS.Rows(1)
  61.         Dim destRow As Long: destRow = 2
  62.         For i = 2 To lastRow
  63.             If Trim(ws.Cells(i, colNum).Value) = code Then
  64.                 ws.Rows(i).Copy Destination:=newWS.Rows(destRow)
  65.                 destRow = destRow + 1
  66.             End If
  67.         Next i
  68.         newWS.Cells.EntireColumn.AutoFit
  69.     Next code
  70.     wb.Save
  71.     wb.Close
  72.     MsgBox "シートの分割が完了しました", vbInformation
  73.     Application.ScreenUpdating = True
  74.     Application.DisplayAlerts = True
  75. End Sub

 

初心者向けマクロの作り方|コードごとに自動シート作成【検証済】コードの使い方

以下手順で、シートデータをコード別に自動で分けるマクロは完成します。

フォームはコードがないので、ご自身で作成することになりますが、その他のコードは、【検証済】コードをコピペすればマクロができます。※フォーム作成方法も、下記で詳しく説明しますので、ご安心ください。

 

Excel起動からユーザーフォーム作成の操作

新規 空白のブックをクリックします

 

ALT+F11で、下記開発画面になります。

 

ユーザーフォームのデザイン画面になります。

 

ツールボックスでユーザーフォームを作成します。

 

下記は、ツールボックスをドラッグで移動してサイズを変更した画面

 

下記は、ツールボックスをドラッグで移動してサイズを変更した画面

 

ツールボックスのコントロールがたくさんありますが、今回使うのは、下記の3種類(ラベル、テキストボックス、コマンドボタン)です。

 

ユーザーフォームを作成:ラベルを作る(表題)①

対象Excelファイル

ユーザーフォームを作成:ラベルを作る(表題)②

 

ユーザーフォーム作成:テキストボックスを作る(画面がら文字入力する場所)

ファイル選択

ユーザーフォーム作成:ボタンを作る(何かの動作をさせる際のボタン)①

 

ユーザーフォーム作成:ボタンを作る(何かの動作をさせる際のボタン)②

コード列(例:A)、データを分ける、終了

ユーザーフォーム作成:残りのラベル、テキストボックス、コマンドボタンも同じように作成します。

 

ユーザーフォーム作成でよくある操作
初心者が、やばい!間違えた。どうしようとやめちゃう操作

 

こうなったら、

 

もう一度、UserForm1画面を表示する前に・・・

 

ユーザーフォームのデザイン画面にするには、プロジェクトエクスプローラーに表示されているUserForm1をダブルクリックします。

 

Cのプロパティウィンドウのオブジェクト名を変更

txtFile

テキストボックスの名称(オブジェクト)を変更

btnBrowse

コマンドボタンの名称(オブジェクト)を変更

txtColumn

テキストボックスの名称(オブジェクト)を変更

btnSplit

コマンドボタンの名称(オブジェクト)を変更

btnClose

コマンドボタンの名称(オブジェクト)を変更

 

【検証済】コードをコピペ

ここから、【検証済】コードをコピペしていきます

 

【検証済】コードをコピペ:Thisworkbok①

下記、ThisWorkbookモジュールをコピーします

  1. Option Explicit
  2. Private Sub Workbook_Open()
  3.      UserForm1.Show vbModeless
  4. End Sub

【検証済】コードをコピペ:Thisworkbok②

 

【検証済】コードをコピペ:UserForm1①

【検証済】コードをコピペ:UserForm1②

下記、フォームのコードをコピーします

  1. Option Explicit
  2. Private Sub UserForm_Initialize()
  3.     ' Excelウィンドウを最小化し、フォームを前面に出す
  4.     Application.WindowState = xlMinimized
  5.     Me.StartUpPosition = 1 ' 画面中央
  6.     Me.Show vbModeless
  7. End Sub
  8. Private Sub btnBrowse_Click()
  9.     Dim fd As FileDialog
  10.     Set fd = Application.FileDialog(msoFileDialogFilePicker)
  11.     With fd
  12.         .Title = "Excelファイルを選択してください"
  13.         .Filters.Add "Excel Files", "*.xls; *.xlsx; *.xlsm"
  14.         If .Show = -1 Then
  15.             txtFile.Text = .SelectedItems(1)
  16.         End If
  17.     End With
  18. End Sub
  19. Private Sub btnSplit_Click()
  20.     Application.ScreenUpdating = False
  21.     
  22.     Dim colLetter As String
  23.     colLetter = UCase(txtColumn.Text) ' 大文字に統一
  24.     ' 列記号が正しいかと、2行目のセルに値があるか確認
  25.     Dim wb As Workbook
  26.     Set wb = Workbooks.Open(txtFile.Text)
  27.     Dim srcWs As Worksheet
  28.     Set srcWs = wb.Sheets(1) ' 最初のシートを対象に
  29.     Dim checkValue As Variant
  30.     On Error Resume Next
  31.     checkValue = srcWs.Range(colLetter & "2").Value
  32.     On Error GoTo 0
  33.     
  34.     ' 列記号の妥当性チェック
  35.     If Not IsValidColumnLetter(colLetter) Then
  36.         MsgBox "列記号が無効です。" & vbCrLf & "A ? XFD の範囲で入力してください。", vbExclamation
  37.         Application.ScreenUpdating = True ' MsgBox後に復元
  38.         wb.Close SaveChanges:=False
  39.         Exit Sub
  40.     End If
  41.     If IsEmpty(checkValue) Or checkValue = "" Then
  42.         MsgBox "範囲外の列指定になっています。" & vbCrLf & _
  43.                "指定した列の2行目に値がありません。", vbExclamation
  44.         Application.ScreenUpdating = True ' MsgBox後に復元
  45.         wb.Close SaveChanges:=False
  46.         Exit Sub
  47.     End If
  48.     
  49.     Application.ScreenUpdating = True
  50.     
  51.     If txtFile.Text = "" Or txtColumn.Text = "" Then
  52.         MsgBox "ファイルと列を指定してください", vbExclamation
  53.         Exit Sub
  54.     End If
  55.     
  56.     ' データ処理を実行
  57.     Call 分割処理(txtFile.Text, txtColumn.Text)
  58. End Sub
  59. Private Sub btnClose_Click()
  60.     Application.WindowState = xlNormal
  61.     ThisWorkbook.Save
  62.     Application.Quit
  63. End Sub
  64. Function IsValidColumnLetter(colLetter As String) As Boolean
  65.     On Error GoTo ErrHandler
  66.     Dim rng As Range
  67.     Set rng = Worksheets(1).Range(colLetter & "1")
  68.     IsValidColumnLetter = True
  69.     Exit Function
  70. ErrHandler:
  71.     IsValidColumnLetter = False
  72. End Function

 

【検証済】コードをコピペ:標準モジュール(Module1)

下記、標準モジュールをコピーします

  1. Option Explicit
  2. Public Sub 分割処理(ByVal filePath As String, ByVal codeColumn As String)
  3.     Application.ScreenUpdating = False
  4.     Application.DisplayAlerts = False
  5.     Dim wb As Workbook
  6.     Dim ws As Worksheet
  7.     Dim header As Range
  8.     Dim lastRow As Long
  9.     Dim colNum As Long
  10.     Dim code As Variant
  11.     Dim cell As Range
  12.     Dim rng As Range
  13.     Dim newWS As Worksheet
  14.     Dim destWB As Workbook
  15.     Dim existingCodes As Object
  16.     Set wb = Workbooks.Open(filePath)
  17.     Set ws = wb.Sheets(1)
  18.     ' コード列番号取得
  19.     colNum = Range(codeColumn & "1").Column
  20.     lastRow = ws.Cells(ws.Rows.Count, colNum).End(xlUp).Row
  21.     ' ソート
  22.     Set rng = ws.Range("A1", ws.Cells(lastRow, ws.Cells(1, Columns.Count).End(xlToLeft).Column))
  23.     rng.Sort Key1:=ws.Cells(2, colNum), Order1:=xlAscending, header:=xlYes
  24.     ' すでにシートが存在しているか確認
  25.     Set existingCodes = CreateObject("Scripting.Dictionary")
  26.     For Each newWS In wb.Sheets
  27.         existingCodes(newWS.Name) = True
  28.     Next
  29.     ' コード列ごとに処理
  30.     Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
  31.     Dim i As Long
  32.     For i = 2 To lastRow
  33.         code = Trim(ws.Cells(i, colNum).Value)
  34.         If code <> "" Then
  35.             If Not dict.exists(code) Then
  36.                 dict.Add code, Nothing
  37.             End If
  38.         End If
  39.     Next
  40.     ' すでにシートがあるかチェック
  41.     Dim alreadyExists As Boolean: alreadyExists = False
  42.     For Each code In dict.Keys
  43.         If existingCodes.exists(code) Then
  44.             alreadyExists = True
  45.             Exit For
  46.         End If
  47.     Next
  48.     If alreadyExists Then
  49.         MsgBox "すでにシート分けしています", vbInformation
  50.         wb.Close SaveChanges:=False
  51.         Application.ScreenUpdating = True
  52.         Application.DisplayAlerts = True
  53.         Exit Sub
  54.     End If
  55.     ' シート分割
  56.     For Each code In dict.Keys
  57.         Set newWS = wb.Sheets.Add(After:=wb.Sheets(wb.Sheets.Count))
  58.         newWS.Name = code
  59.         ' ヘッダー
  60.         ws.Rows(1).Copy Destination:=newWS.Rows(1)
  61.         Dim destRow As Long: destRow = 2
  62.         For i = 2 To lastRow
  63.             If Trim(ws.Cells(i, colNum).Value) = code Then
  64.                 ws.Rows(i).Copy Destination:=newWS.Rows(destRow)
  65.                 destRow = destRow + 1
  66.             End If
  67.         Next i
  68.         newWS.Cells.EntireColumn.AutoFit
  69.     Next code
  70.     wb.Save
  71.     wb.Close
  72.     MsgBox "シートの分割が完了しました", vbInformation
  73.     Application.ScreenUpdating = True
  74.     Application.DisplayAlerts = True
  75. End Sub

 

 

作成したマクロを保存します

作成したマクロを保存します①

 

作成したマクロを保存します②

 

 

作成したマクロを保存します③

 

作成したマクロを保存します④

 

作成したマクロを実行

マクロ実行前にシートを分けたい対象のExcelをチェック

 

マクロ実行でシートが分けられているかチェック①

 

マクロ実行でシートが分けられているかチェック②

 

マクロ実行でシートが分けられているかチェック③

 

マクロ実行でシートが分けられているかチェック④

 

マクロ実行でシートが分けられているかチェック⑤

 

フォームでチェックしている項目について

フォームでチェックしている項目について①

 

フォームでチェックしている項目について②

 

マクロの条件について

 

初心者向けマクロの作り方|コードごとに自動シート作成であなたの作業はもっと楽になる

このようなマクロを使えば、あなたの毎日のデータ整理や、月末の資料作成もぐっとラクになります。

「マクロって難しそう…」と思っていた方も、命令からコツコツ覚えるのも大切ですが、まずは、コピペしたマクロを実感してください。

ぜひ一度使ってみてください。

 

📌まずはコピペでOK。少しずつ「わかる」に近づこう

このページでは、難しいことは抜きにして「まずはコピペで業務を効率化する」ことを目的にしています。でも、使っているうちに「この命令って何をしてるんだろう?」と気になる場面も出てくるはずです。そんなときに役立つのが 「VBAエキスパート資格解説書」

基準をもってVBAの理解を深めたい方におすすめです。

👉初心者の人は、Excel VBAエキスパートベーシック解説書

👉マクロの基礎知識がある人は、Excel VBAエキスパートスタンダード解説書

初心者向けマクロの作り方|もし、ダメだ動かない。わからないなど気になることがあれば・・・

以下、お問い合わせ内容は、後日まとめて対応内容を本記事に掲載します。

メールアドレスの入力はありませんので、お気軽にお問い合わせください。