• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:【ExcelVBA】顧客別に抽出データをシート転記)

【ExcelVBA】顧客別に抽出データをシート転記

このQ&Aのポイント
  • ExcelVBAを使用して、顧客別の支払い明細を抽出し、シートに転記する方法を教えてください。
  • 具体的には、入力シートから「顧客名 × 計上月」を抽出条件として、必要なデータをフィルタオプションで転記します。
  • さらに、顧客ごとに新しいシートを作成し、該当するデータを転記する方法も教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.2

コード内容としては 1)Application.InputBoxで"計上月"を取得。 2)IT2セルに抽出条件の"計上月"を書き込み。 3)C列顧客名から重複を除き、ユニークな顧客リストとしてIV列に書き出し。 4)IV列の顧客リスト範囲をLoop  Loop中に"(顧客名)_支払明細"というシートがなければ追加。  追加時にTITLEから抽出項目名をセット。  IU2セルに個々の顧客名をセットしAdvancedFilterで目的シートに抽出。 5)作業エリアIT:IV列を削除。 ..というような流れになってます。 #本当は、TITLEの内容をコードに埋め込むのではなく、 #事前にどこかのセル範囲に抽出項目名を列挙しておいて、 #そこをコピーするようにしたほうが汎用的に使えます。

riko_0104
質問者

お礼

end-uさん ご丁寧にお教えいただき、ありがとうございます! 早速、試してみます。

その他の回答 (1)

  • end-u
  • ベストアンサー率79% (496/625)
回答No.1

"入力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列は顧客名リスト用です。

関連するQ&A