- ベストアンサー
【ExcelVBA】顧客別に抽出データをシート転記
- ExcelVBAを使用して、顧客別の支払い明細を抽出し、シートに転記する方法を教えてください。
- 具体的には、入力シートから「顧客名 × 計上月」を抽出条件として、必要なデータをフィルタオプションで転記します。
- さらに、顧客ごとに新しいシートを作成し、該当するデータを転記する方法も教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
コード内容としては 1)Application.InputBoxで"計上月"を取得。 2)IT2セルに抽出条件の"計上月"を書き込み。 3)C列顧客名から重複を除き、ユニークな顧客リストとしてIV列に書き出し。 4)IV列の顧客リスト範囲をLoop Loop中に"(顧客名)_支払明細"というシートがなければ追加。 追加時にTITLEから抽出項目名をセット。 IU2セルに個々の顧客名をセットしAdvancedFilterで目的シートに抽出。 5)作業エリアIT:IV列を削除。 ..というような流れになってます。 #本当は、TITLEの内容をコードに埋め込むのではなく、 #事前にどこかのセル範囲に抽出項目名を列挙しておいて、 #そこをコピーするようにしたほうが汎用的に使えます。
その他の回答 (1)
- end-u
- ベストアンサー率79% (496/625)
"入力Form"シートだけを別Bookにコピーし、テスト用Bookとして試してみてください。 ~~~~~~~~~~~~~~~~~~~~ ("顧客テーブル"の名前定義も必要です。コピーされるとは思いますが) 【必要な事前作業】 1)現在の"顧客テーブル"の隣、P6セルに"(空白)"という項目名を追加してください。 2)名前定義"顧客テーブル"の範囲にP列まで含んでください。 コード内容は以下。 Sub try() '抽出したい項目名をカンマ区切りで列挙しておきます。顧客テーブルの項目名と一致していないとダメ Const TITLE = "顧客名,業者名,勘定科目,科目名,業者名,(空白),説明,本体金額,消費税,合計,計上月" Const destCell = "A2:K2" '抽出先アドレス Dim ws As Worksheet '抽出先Sheet Dim myTable As Range '顧客テーブル範囲 Dim r As Range 'Loop用 Dim x On Error GoTo extLine x = Application.InputBox("計上月?", Type:=2) If VarType(x) = vbBoolean Then Exit Sub Application.ScreenUpdating = False With Sheets("入力Form") Set myTable = .Range("顧客テーブル") '検索条件範囲 .Range("IT1:IU1").Value = Array("計上月", "顧客名") .Range("IT2").Value = x 'ユニークな顧客リストを抽出 myTable.Columns("C").AdvancedFilter Action:=xlFilterCopy, _ CopyToRange:=.Range("IV1"), _ Unique:=True '顧客リスト範囲内セルをLoop For Each r In .Range("IV2", .Cells(.Rows.Count, "IV").End(xlUp)) 'wsに顧客別Sheetをセット。無い場合追加。 Set ws = Nothing On Error Resume Next Set ws = Sheets(r.Value & "_支払明細") On Error GoTo extLine If ws Is Nothing Then Set ws = Sheets.Add(after:=Sheets(Sheets.Count)) ws.Name = r.Value & "_支払明細" ws.Range(destCell).Value = Split(TITLE, ",") End If '検索条件として顧客名を入れ、wsに抽出。 .Range("IU2").Value = r.Value myTable.AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=.Range("IT1:IU2"), _ CopyToRange:=ws.Range(destCell) Next '作業エリアを削除 .Columns("IT:IV").Delete End With extLine: Set myTable = Nothing Set ws = Nothing Application.ScreenUpdating = True If Err.Number <> 0 Then MsgBox Err.Number & "::" & Err.Description End Sub TITLE = "顧客名,..の箇所で抽出項目名を列挙しておく必要があります。 "顧客テーブル"の項目名と一致させてください。 新規Sheetを追加する時に使います。 検索条件などを書き込むために、作業エリアとしてIT:IV列を使います。 IT1:IU2には検索条件。 IV列は顧客名リスト用です。
お礼
end-uさん ご丁寧にお教えいただき、ありがとうございます! 早速、試してみます。