ランダムに並んでいるExcelファイルのデータを複数のファイルに分割する

今回は、ランダムに並んだデータをある項目別に分割するサンプルアプリをご紹介します。このサンプルコードは、業務の中で、一つのファイルを部署ごとに分けたり、取引先会社ごとにファイルを分けてメールで送信する際など、多くの場面で活用できます。なお、前回紹介した「ソートされたEXCELデータを複数のファイルに分割する」サンプルアプリについては、以下のサイトでご確認ください。

  https://scodebank.com/?p=541
 

「データをファイル分割する」ボタンをクリックすると、勤務地に基づいてファイルが分割されます。

分割されたファイルは以下のように勤務地別のファイルになります。

【東京都_202302.xlsx】のファイルの内容

【埼玉県_202302.xlsx】のファイルの内容

【新潟県_202302.xlsx】のファイルの内容

サンプルコードの処理内容

今回はリストを定義して、ループ処理で各分割ファイルの処理を行っています。
例えば以下の場合は、WB(1)に東京都のファイル、WB(2)に埼玉県のファイル、WB(3)に新潟県のファイルをそれぞれ格納していますが、その後の処理をWB(1)、WB(2)、WB(3)に対して実施しています。

For n = 1 To 3
  Set WB(n) = Workbooks.Add
Next n

処理の概要は以下の通りです。

 分割元ファイルとシートを指定
      ↓
 分割先ファイルの保存先パスを指定
      ↓
 分割ファイル分について新規ブックを作成
      ↓
 分割先のシートを指定して勤務先別のデータをコピー
      ↓
 分割した勤務先別のファイルを保存

サンプルコード   アプリの作成手順はこちら

Option Explicit

Sub Export_ExcelFile()

    '分割元ブックを格納する変数の定義
    Dim TWB As Workbook 'このブック
    
    '3ファイルに分割することを前提にリストの数を3とする
    Const w As Integer = 3
    
    '分割先ワークブックを格納する変数をリスト形式で定義
    Dim WB(1 To w) As Workbook
    
    'ファイル名を格納する変数をリスト形式で定義
    Dim FileNam(1 To w) As String
    
    '出力先のパスを格納する変数を定義
    Dim xPath As String
    
    'ファイルを分けるキーとなる変数を定義
    Dim key As String
    
    '分割元データカウント変数を定義
    Dim i As Integer
    Dim n As Integer
    
    '分割ファイル別カウント変数
    Dim t As Integer
    Dim s As Integer
    Dim e As Integer

    'ファイル別カウント変数の初期値を格納
    t = 6
    s = 6
    e = 6
   
    '分割元ワークシート変数定義
    Dim Sh1 As Worksheet
    
    '分割元ワークシートを指定する
    Set Sh1 = ThisWorkbook.Worksheets("通勤手当一覧")
    
    '分割先ワークシート変数定義
    Dim ShT1(1 To w) As Worksheet
    
    '分割元のExcelブックを変数にセット
    Set TWB = ThisWorkbook
    'Set TWB = ActiveSheet  '元シートをActiveSheetにセットする
    
    '分割ファイル出力先のパスを指定
    With ActiveWorkbook
       xPath = .Path & "\"  'ファイルが置いてあるフォルダからのパスを指定
    End With
    
    '新規ブック作成
    For n = 1 To 3
      Set WB(n) = Workbooks.Add
    Next n
    
    '分割先ブックのシート名を設定
    For n = 1 To 3
     WB(n).Sheets("Sheet1").Name = "通勤手当一覧"
    Next
    
    '分割先ワークシートを指定
    For n = 1 To 3
      Set ShT1(n) = WB(n).Worksheets("通勤手当一覧")
    Next

     'ファイル出力日を取得
    Dim strDate As String
    strDate = DateSerial(Year(Now), Month(Now) - 1, 1)
    strDate = Format(strDate, "yyyymm")

     'Excelファイル出力先パスを指定
    FileNam(1) = xPath & "東京都" & "_" & strDate & ".xlsx"
    FileNam(2) = xPath & "埼玉県" & "_" & strDate & ".xlsx"
    FileNam(3) = xPath & "新潟県" & "_" & strDate & ".xlsx"

     'タイトル欄を分割先ブックのシートにコピー
    For n = 1 To 3
     Sh1.Range(Sh1.Cells(5, 2), Sh1.Cells(5, 7)).Copy ShT1(n).Range("B5")
    Next


 'データ部分ループ処理 *******************************
 
    'データの始まり6行目を指定
    Dim start As Long
    start = 6
 
    '社員Noが続く間はループ
    Do While Sh1.Cells(start, 2).Value <> ""
 
    '分割元の最初の勤務地を取得
    key = Sh1.Cells(start, 6).Value

    '勤務地が東京都だったら、東京都用のファイルにデータをコピー
    If key = "東京都" Then
      'データ行コピー
      Sh1.Range(Sh1.Cells(start, 1), Sh1.Cells(start, 7)).Copy ShT1(1).Range("A" & t)
      'カウント
      t = t + 1
    End If

    '勤務地が埼玉県だったら、埼玉県用のファイルにデータをコピー
    If key = "埼玉県" Then
     'データ行コピー
      Sh1.Range(Sh1.Cells(start, 1), Sh1.Cells(start, 7)).Copy ShT1(2).Range("A" & s)
     'カウント
      s = s + 1
    End If

    '勤務地が新潟県だったら、新潟県用のファイルにデータをコピー
    If key = "新潟県" Then
      'データ行コピー
      Sh1.Range(Sh1.Cells(start, 1), Sh1.Cells(start, 7)).Copy ShT1(3).Range("A" & e)
     'カウント
      e = e + 1
    End If

     '分割元のデータ行を1つ下にずらす。
    start = start + 1
    
    Loop

  '****************************************************

  For n = 1 To 3
  
   '分割したファイルの各列を文字幅に合わせる。
   WB(n).Worksheets("通勤手当一覧").Range("B:G").Columns.AutoFit
      
   '分割したファイルを保存して閉じる
   WB(n).SaveAs Filename:=FileNam(n)
   WB(n).Close
     
   '分割ファイルのブックを解放
   Set WB(n) = Nothing

  Next

 '終了メッセージ
  MsgBox "分割処理が完了しました。"

End Sub