フィールドの値ごとに別のシートへ転記する

フィールドの値ごとに別のシートへ転記する

Sub フィールドの値別にシートへ転記()
Dim myCon As New ADODB.Connection
Dim myRS As New ADODB.Recordset
Dim tmpRS As New ADODB.Recordset
Dim myFile As String, myTbl As String, myFld As String

'対象となるデータベース、テーブル、フィールド
myFile = ThisWorkbook.Path & "\mdb\4-sampleDB.mdb"
myTbl = "アルバイト"
myFld = "所属"

'接続
With myCon
  .Provider = "Microsoft.Jet.OLEDB.4.0;"
  .Open myFile
End With

'指定したテーブルの任意フィールドから重複を取り除いたリストを取得
tmpRS.Open "SELECT DISTINCT " & myFld & " FROM " & myTbl, myCon

'フィールドの見出しとデータリストを転記
With ActiveWorkbook.Worksheets.Add
  .Name = tmpRS.Fields(0).Name
  Range("A1").CopyFromRecordset tmpRS
End With

'取り出し元となるテーブルを取得
With myRS
  .Source = myTbl
  .ActiveConnection = myCon
  .CursorLocation = adUseClient
  .Open
End With

'tmpRSのカーソルを先頭へ戻す
tmpRS.MoveFirst

'取得したりデータ分だけ「フィルタ→転記」を繰り返す
Do Until tmpRS.EOF
  '取得レコードにフィルタをかける
  myRS.Filter = myFld & "='" & tmpRS.Fields(0).Value & "'"
  'シートを追加、シート名を取得フィールド名にして、データ転記
  With ActiveWorkbook.Worksheets.Add
    .Name = tmpRS.Fields(0).Value
    .Range("A1").CopyFromRecordset myRS
  End With
  '重複を除いたリストのデータを次に進める
  tmpRS.MoveNext
Loop

tmpRS.Close: Set tmpRS = Nothing
myRS.Close: Set myRS = Nothing
myCon.Close: Set myCon = Nothing

End Sub

特定フィールドの重複を取り除いた値を返すDISTINCT指定を行ったSELECT命令の結果を受け取るRecordsetオブジェクト(tmpRS)と、任意のテーブル全体を扱うRecordsetオブジェクト(myRS)の2つを用意し、重複を取り除いたリストを元にフィルタをかけ、転記を行う。

データ取得元となる「アルバイト」テーブル

実行結果

「所属」シート (重複を除いたデータ)

「キッチン」シート

「ホール」シート

「洗浄」シート