Excelで売り上げ件数から原材料の使用量を計算するマクロがある程度完成したからメモ
' ------------------------------ ' 商品使用数の集計 ' ※商品マスタのレイアウトが変わった場合、マクロも合わせて修正が必要 ' A列:店舗コード ' B列:店舗名称 ' C列:メニュー区分 ' D列:メニューコード ' E列:メニュー名 ' F列:単価 ' G列:商品コード ' H列:商品区分 ' I列:商品名 ' J列:数量1 ' K列:単位 ' L列:数量2 ' M列:開始日 ' N列:終了日 ' 1行目はタイトル行、2行目からデータ ' ------------------------------ Sub subShiyosu() Dim shtMst As Worksheet ' シート:商品マスタ Dim shtCsv As Worksheet ' シート:CSVの取り込み先 Dim shtWork As Worksheet ' シート:一時保存 Dim shtReport As Worksheet ' シート:出力 Dim strFilepass As String ' csvのファイルパス Dim i As Long ' ループカウンタ Dim lngRow As Long ' 最終行 Dim varTemp As Variant ' 配列 Dim pvc As PivotCache ' ピボットテーブル Dim pvt As PivotTable On Error GoTo ErrTrap Set shtMst = ThisWorkbook.Worksheets("商品マスタ") Set shtCsv = ThisWorkbook.Worksheets("●CSV") Set shtWork = ThisWorkbook.Worksheets("●WORK") Set shtReport = ThisWorkbook.Worksheets("●出力") ' -------------------- ' 開始処理 ' -------------------- ' 画面表示停止 With Application .ScreenUpdating = False .DisplayStatusBar = False .EnableEvents = False End With ' マスタシートの数式再計算停止 With shtMst .DisplayPageBreaks = False .EnableCalculation = False End With ' 処理用シートの初期化 With shtCsv .DisplayPageBreaks = False .Cells.Delete shift:=xlToLeft End With With shtWork .DisplayPageBreaks = False .Cells.Delete shift:=xlToLeft End With With shtReport .DisplayPageBreaks = False .Cells.Delete shift:=xlToLeft End With ' -------------------- ' 売上ファイルを取り込む(店・メニュー毎の売上件数CSV) ' -------------------- With Application.FileDialog(msoFileDialogFilePicker) .InitialFileName = "*売上*.csv" .AllowMultiSelect = False If .Show = True Then strFilepass = .SelectedItems(1) Call subImportCSV(strFilepass, shtCsv, shtCsv.Cells(1, 1)) Else Call MsgBox("処理を中止します") GoTo FIN End If End With ' -------------------- ' 商品使用量を計算する ' -------------------- ' 商品マスタと売上ファイルを突合する ' 条件:店舗コード・メニューコードの一致、売上日が開始日〜終了日の範囲内 ' 処理:メニューで突合して、売上件数と商品使用量の積から使用量の総数を計算 lngRow = shtMst.Cells(Rows.Count, 1).End(xlUp).row varTemp = shtMst.Range(shtMst.Cells(1, 1), shtMst.Cells(lngRow, 14)) shtWork.Range(shtWork.Cells(1, 1), shtWork.Cells(lngRow, 14)) = varTemp shtWork.Cells(1, 15).Value = "使用量" lngRow = shtCsv.Cells(Rows.Count, 1).End(xlUp).row shtWork.Cells(2, 15).Formula = "=IFERROR(" & _ "SUMIFS(" & _ "●CSV!$F$2:$F$" & lngRow & _ ",●CSV!$A$2:$A$" & lngRow & ",●WORK!A2" & _ ",●CSV!$D$2:$D$" & lngRow & ",●WORK!D2" & _ ",●CSV!$C$2:$C$" & lngRow & ","">=""&●WORK!M2" & _ ",●CSV!$C$2:$C$" & lngRow & ",""<=""&●WORK!N2" & _ ") * ●WORK!J2" & _ ",0)" lngRow = shtWork.Cells(Rows.Count, 1).End(xlUp).row shtWork.Cells(2, 15).AutoFill Destination:=shtWork.Range(shtWork.Cells(2, 15), shtWork.Cells(lngRow, 15)) ' 計算式を値に変換する varTemp = shtWork.Range(shtWork.Cells(2, 15), shtWork.Cells(lngRow, 15)) shtWork.Range(shtWork.Cells(2, 15), shtWork.Cells(lngRow, 15)) = varTemp ' ピボットテーブルで店舗、商品ごとに合算する Set pvc = ThisWorkbook.PivotCaches.Create( _ SourceType:=xlDatabase _ , SourceData:=shtWork.Range(shtWork.Cells(1, 1), shtWork.Cells(lngRow, 15)) _ , Version:=xlPivotTableVersion14) Set pvt = pvc.CreatePivotTable( _ TableDestination:=shtWork.Cells(1, 27) _ , TableName:="pvtSyukei_Shiyosu" _ , DefaultVersion:=xlPivotTableVersion14) With pvt.PivotFields(shtWork.Cells(1, 1).Value) .Orientation = xlRowField .Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False) .LayoutForm = xlTabular .RepeatLabels = True .Position = 1 End With With pvt.PivotFields(shtWork.Cells(1, 2).Value) .Orientation = xlRowField .Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False) .LayoutForm = xlTabular .RepeatLabels = True .Position = 2 End With With pvt.PivotFields(shtWork.Cells(1, 8).Value) .Orientation = xlRowField .Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False) .LayoutForm = xlTabular .RepeatLabels = True .Position = 3 End With With pvt.PivotFields(shtWork.Cells(1, 7).Value) .Orientation = xlRowField .Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False) .LayoutForm = xlTabular .RepeatLabels = True .Position = 4 End With With pvt.PivotFields(shtWork.Cells(1, 9).Value) .Orientation = xlRowField .Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False) .LayoutForm = xlTabular .RepeatLabels = True .Position = 5 End With With pvt.PivotFields(shtWork.Cells(1, 11).Value) .Orientation = xlRowField .Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False) .LayoutForm = xlTabular .RepeatLabels = True .Position = 6 End With pvt.AddDataField pvt.PivotFields(shtWork.Cells(1, 15).Value), "合計 / 使用量", xlSum ' 集計結果を出力シートに転記 lngRow = shtCsv.Cells(Rows.Count, 1).End(xlUp).row With shtReport .Cells(1, 1).Value = "商品使用量の集計" .Cells(2, 1).Formula = "=""抽出期間:""&TEXT(MIN(●CSV!C2:C" & lngRow & "),""yyyy/m/d"")&"" 〜 ""&TEXT(MAX(●CSV!C2:C" & lngRow & "),""yyyy/m/d"")" .Cells(2, 1).Value = shtReport.Cells(2, 1).Value End With lngRow = shtWork.Cells(Rows.Count, 27).End(xlUp).row varTemp = shtWork.Range(shtWork.Cells(1, 27), shtWork.Cells(lngRow, 33)) shtReport.Range(shtReport.Cells(4, 2), shtReport.Cells(lngRow + 3, 8)).Value = varTemp ' Work初期化 shtWork.Cells.Delete shift:=xlToLeft ' -------------------- ' マスタ設定漏れをチェックする ' -------------------- ' 商品マスタと売上ファイルを突合する ' 条件:店舗コード・メニューコードの一致、売上日が開始日〜終了日の範囲内 ' 処理:メニュー名が不一致の場合、マスタ設定漏れを疑う shtCsv.Cells(1, 10).Value = "マスタチェック用" lngRow = shtMst.Cells(Rows.Count, 1).End(xlUp).row shtCsv.Cells(2, 10).Formula = "=IF(●CSV!E2 = " & _ "OFFSET(商品マスタ!$A$1" & _ ",SUMIFS(" & _ "商品マスタ!$Q$2:$Q$" & lngRow & _ ",商品マスタ!$A$2:$A$" & lngRow & ",●CSV!A2" & _ ",商品マスタ!$D$2:$D$" & lngRow & ",●CSV!D2" & _ ",商品マスタ!$M$2:$M$" & lngRow & ",""<=""&●CSV!C2" & _ ",商品マスタ!$N$2:$N$" & lngRow & ","">=""&●CSV!C2" & _ ") - 1" & _ ",4)" & _ ",TRUE,FALSE)" lngRow = shtCsv.Cells(Rows.Count, 1).End(xlUp).row shtCsv.Cells(2, 10).AutoFill Destination:=shtCsv.Range(shtCsv.Cells(2, 10), shtCsv.Cells(lngRow, 10)) ' 計算式を値に変換する varTemp = shtCsv.Range(shtCsv.Cells(2, 10), shtCsv.Cells(lngRow, 10)) shtCsv.Range(shtCsv.Cells(2, 10), shtCsv.Cells(lngRow, 10)) = varTemp ' 集計結果を出力シートに転記 shtReport.Cells(1, 11).Value = "マスタ設定漏れと思われるもの" With shtCsv.Range(shtCsv.Cells(1, 1), shtCsv.Cells(lngRow, 10)) .AutoFilter Field:=10, Criteria1:="<>TRUE" .Copy Destination:=shtReport.Cells(3, 11) .AutoFilter End With ' CSV初期化 shtCsv.Cells.Delete shift:=xlToLeft ' -------------------- ' 集計結果を新しいブックへコピー ' -------------------- With shtReport .Visible = True .Copy .Visible = False .Cells.Delete shift:=xlToLeft End With GoTo FIN ErrTrap: ' -------------------- ' エラー処理 ' -------------------- MsgBox "エラー番号:" & Err.Number & vbCrLf & _ "エラーの種類:" & Err.Description, vbExclamation GoTo FIN FIN: ' -------------------- ' 終了処理 ' -------------------- ' マスタシートの数式再計算を戻す With shtMst .DisplayPageBreaks = True .EnableCalculation = True End With ' 処理用シートの印刷範囲の再計算を戻す With shtCsv .DisplayPageBreaks = True End With With shtWork .DisplayPageBreaks = True End With With shtReport .DisplayPageBreaks = True End With ' 画面表示を戻す With Application .ScreenUpdating = True .DisplayStatusBar = True .EnableEvents = True End With End Sub ' ------------------------------ ' 仕入数の集計 ' ------------------------------ Sub subShiire() On Error GoTo ErrTrap ' -------------------- ' 開始処理 ' -------------------- ' 画面表示停止 With Application .ScreenUpdating = False .DisplayStatusBar = False .EnableEvents = False End With ' -------------------- ' 売上システム分の集計 ' -------------------- Call subShiire_Uriage ' -------------------- ' 弥生販売分の集計 ' -------------------- Call subShiire_Yayoi GoTo FIN ErrTrap: ' -------------------- ' エラー処理 ' -------------------- MsgBox "エラー番号:" & Err.Number & vbCrLf & _ "エラーの種類:" & Err.Description, vbExclamation GoTo FIN FIN: ' -------------------- ' 終了処理 ' -------------------- ' 画面表示を戻す With Application .ScreenUpdating = True .DisplayStatusBar = True .EnableEvents = True End With End Sub ' ------------------------------ ' 仕入数の集計(売上システム分) ' ------------------------------ Sub subShiire_Uriage() Dim shtCsv As Worksheet ' シート:CSVの取り込み先 Dim shtWork As Worksheet ' シート:一時保存 Dim shtReport As Worksheet ' シート:出力 Dim strFilepass As String ' csvのファイルパス Dim i As Long ' ループカウンタ Dim lngRow As Long ' 最終行 Dim varTemp As Variant ' 配列用 Dim pvc As PivotCache ' ピボットテーブル Dim pvt As PivotTable Dim strStoreCode As String ' 仕入情報の一時保管 Dim strStoreName As String Dim strClientCode As String Dim strClientName As String Dim strSiire As String Dim strTradingDate As String On Error GoTo ErrTrap_Uriage Set shtCsv = ThisWorkbook.Worksheets("●CSV") Set shtWork = ThisWorkbook.Worksheets("●WORK") Set shtReport = ThisWorkbook.Worksheets("●出力") ' -------------------- ' 開始処理 ' -------------------- ' 処理用シートの初期化 With shtCsv .DisplayPageBreaks = False .Cells.Delete shift:=xlToLeft End With With shtWork .DisplayPageBreaks = False .Cells.Delete shift:=xlToLeft End With With shtReport .DisplayPageBreaks = False .Cells.Delete shift:=xlToLeft End With ' -------------------- ' 仕入を取り込む(店毎の仕入情報txt) ' -------------------- With Application.FileDialog(msoFileDialogFilePicker) .InitialFileName = "*仕入*.txt" .AllowMultiSelect = False If .Show = True Then strFilepass = .SelectedItems(1) Call subImportCSV(strFilepass, shtCsv, shtCsv.Cells(1, 1)) Else Call MsgBox("処理を中止します") GoTo FIN_Uriage End If End With ' -------------------- ' 仕入データを整形する ' ※1)カンマ区切りテキスト形式だが、数値の桁区切りカンマが使われている ' とりあえず最終列の売上額だけが1000を超えているため対処しているが ' 購入数など途中の列が1000を超えた場合はお手上げ ' ※2)データ内の購入数と単価をかけても購入金額にはならない ' 売上システムで合計金額も手入力できるため打ち間違いが起こっているように見える ' このマクロでは、比較的信頼できる購入数と単価をもとに計算しているため ' <店舗計>や<総計>と異なる額になっている ' -------------------- ' 配列内で処理 lngRow = shtCsv.Cells(Rows.Count, 1).End(xlUp).row varTemp = shtCsv.Range(shtCsv.Cells(1, 1), shtCsv.Cells(lngRow, 11)) For i = 1 To lngRow Select Case True Case varTemp(i, 1) = "【レポートファイル名:RDin400_2】" ' 処理なし Case varTemp(i, 1) = "◇◆◇ 仕入 ◇◆◇" ' 処理なし Case Left(varTemp(i, 1), 6) = "【範囲指定】" ' 処理なし Case varTemp(i, 1) = "< 店 舗 計 >" ' 処理なし Case varTemp(i, 1) = "< 仕入先計 >" ' 処理なし Case varTemp(i, 3) = "< 仕入先計 >" ' <仕入先計>がページ先頭の場合、A-B列に店舗が入るためC列を参照 ' 処理なし Case varTemp(i, 1) = "< 総 計 >" ' 処理なし Case varTemp(i, 1) = "分類" ' 処理なし Case varTemp(i, 1) = "仕入先" ' 処理なし Case varTemp(i, 1) = "店舗:" ' 店舗またはページの切り替わり ' 店舗を保持 strStoreCode = varTemp(i, 2) strStoreName = varTemp(i, 3) Case IsDate(varTemp(i, 4)) _ And varTemp(i + 1, 3) = "" _ And Right(varTemp(i + 2, 3), 1) = "締" ' ※※※ バグ対応 ※※※ ' <仕入先計>が前ページの最終行の場合(?) ' 1行目のA-B列に誤った仕入先、2行目のA-B列に正しい仕入先、3行目に単位などが出力する ' 仕入先を保持(2行目から引っ張ってくる) strClientCode = varTemp(i + 1, 1) strClientName = varTemp(i + 1, 2) strSiire = varTemp(i, 3) strTradingDate = varTemp(i, 4) ' 正しい仕入先を入れる(バグ対応) varTemp(i, 1) = strClientCode varTemp(i, 2) = strClientName ' 売上金額をまとめる(桁区切りカンマ対応) If varTemp(i, 9) <> "" And IsNumeric(varTemp(i, 9)) = True Then varTemp(i, 7) = varTemp(i, 7) & _ Right("000" & varTemp(i, 8), 3) & _ Right("000" & varTemp(i, 9), 3) ElseIf varTemp(i, 8) <> "" And IsNumeric(varTemp(i, 8)) = True Then varTemp(i, 7) = varTemp(i, 7) & _ Right("000" & varTemp(i, 8), 3) End If ' 店舗、単位(空欄の場合もある)を挿入 varTemp(i, 8) = strStoreCode varTemp(i, 9) = strStoreName varTemp(i, 10) = varTemp(i + 2, 6) varTemp(i, 11) = "●" ' 2つ後の行から単位を回収したのでスキップ i = i + 2 Case IsDate(varTemp(i, 2)) _ And Right(varTemp(i + 1, 3), 1) = "締" ' ※※※ バグ対応 ※※※ ' 同じ日に、同じ店舗で、同じ商品を2回以上仕入れた場合(?) ' それ以降、その商品のA-B列の仕入れ先が省略されてしまう ' 店舗を挿入(右シフト) varTemp(i, 11) = varTemp(i, 9) varTemp(i, 10) = varTemp(i, 8) varTemp(i, 9) = varTemp(i, 7) varTemp(i, 8) = varTemp(i, 6) varTemp(i, 7) = varTemp(i, 5) varTemp(i, 6) = varTemp(i, 4) varTemp(i, 5) = varTemp(i, 3) varTemp(i, 4) = varTemp(i, 2) varTemp(i, 3) = varTemp(i, 1) varTemp(i, 2) = strClientName varTemp(i, 1) = strClientCode ' 仕入先を保持 strTradingDate = varTemp(i, 4) ' 売上金額をまとめる(桁区切りカンマ対応) If varTemp(i, 9) <> "" And IsNumeric(varTemp(i, 9)) = True Then varTemp(i, 7) = varTemp(i, 7) & _ Right("000" & varTemp(i, 8), 3) & _ Right("000" & varTemp(i, 9), 3) ElseIf varTemp(i, 8) <> "" And IsNumeric(varTemp(i, 8)) = True Then varTemp(i, 7) = varTemp(i, 7) & _ Right("000" & varTemp(i, 8), 3) End If ' 店舗、単位(空欄の場合もある)を挿入 varTemp(i, 8) = strStoreCode varTemp(i, 9) = strStoreName varTemp(i, 10) = varTemp(i + 1, 4) varTemp(i, 11) = "●" ' 次の行から単位を回収したのでスキップ i = i + 1 Case IsDate(varTemp(i, 4)) _ And Right(varTemp(i + 1, 3), 1) = "締" ' 店舗−仕入先の1件目の取引 ' 1行目のA-C列に取引先、D列に取引日、2行目のA列に「yyyy/m/d締」が入る ' 仕入先を保持 strClientCode = varTemp(i, 1) strClientName = varTemp(i, 2) strSiire = varTemp(i, 3) strTradingDate = varTemp(i, 4) ' 売上金額をまとめる(桁区切りカンマ対応) If varTemp(i, 9) <> "" And IsNumeric(varTemp(i, 9)) = True Then varTemp(i, 7) = varTemp(i, 7) & _ Right("000" & varTemp(i, 8), 3) & _ Right("000" & varTemp(i, 9), 3) ElseIf varTemp(i, 8) <> "" And IsNumeric(varTemp(i, 8)) = True Then varTemp(i, 7) = varTemp(i, 7) & _ Right("000" & varTemp(i, 8), 3) End If ' 店舗、単位(空欄の場合もある)を挿入 varTemp(i, 8) = strStoreCode varTemp(i, 9) = strStoreName varTemp(i, 10) = varTemp(i + 1, 4) varTemp(i, 11) = "●" ' 次の行から単位を回収したのでスキップ i = i + 1 Case IsDate(varTemp(i, 1)) _ And Right(varTemp(i + 1, 1), 1) = "締" ' 店舗−仕入先の2件目以降の取引で、その取引日の1件目の商品 ' 1行目のA列に取引日、2行目のA列に「yyyy/m/d締」が入る ' 仕入先を挿入(右シフト) varTemp(i, 11) = varTemp(i, 8) varTemp(i, 10) = varTemp(i, 7) varTemp(i, 9) = varTemp(i, 6) varTemp(i, 8) = varTemp(i, 5) varTemp(i, 7) = varTemp(i, 4) varTemp(i, 6) = varTemp(i, 3) varTemp(i, 5) = varTemp(i, 2) varTemp(i, 4) = varTemp(i, 1) varTemp(i, 3) = strSiire varTemp(i, 2) = strClientName varTemp(i, 1) = strClientCode ' 取引日を保持 strTradingDate = varTemp(i, 4) ' 売上金額をまとめる(桁区切りカンマ対応) If varTemp(i, 9) <> "" And IsNumeric(varTemp(i, 9)) = True Then varTemp(i, 7) = varTemp(i, 7) & _ Right("000" & varTemp(i, 8), 3) & _ Right("000" & varTemp(i, 9), 3) ElseIf varTemp(i, 8) <> "" And IsNumeric(varTemp(i, 8)) = True Then varTemp(i, 7) = varTemp(i, 7) & _ Right("000" & varTemp(i, 8), 3) End If ' 店舗、単位(空欄の場合もある)を挿入 varTemp(i, 8) = strStoreCode varTemp(i, 9) = strStoreName varTemp(i, 10) = varTemp(i + 1, 4) varTemp(i, 11) = "●" ' 次の行から単位を回収したのでスキップ i = i + 1 Case Else ' 店舗−仕入先の2件目以降の取引で、その取引日の2件目以降の商品 ' 1行目のA列が商品名、次の行のB列へ「対象」や「非対称」などが入る ' 仕入先を挿入(右シフト) varTemp(i, 11) = varTemp(i, 7) varTemp(i, 10) = varTemp(i, 6) varTemp(i, 9) = varTemp(i, 5) varTemp(i, 8) = varTemp(i, 4) varTemp(i, 7) = varTemp(i, 3) varTemp(i, 6) = varTemp(i, 2) varTemp(i, 5) = varTemp(i, 1) varTemp(i, 4) = strTradingDate varTemp(i, 3) = strSiire varTemp(i, 2) = strClientName varTemp(i, 1) = strClientCode ' 売上金額をまとめる(桁区切りカンマ対応) If varTemp(i, 9) <> "" And IsNumeric(varTemp(i, 9)) = True Then varTemp(i, 7) = varTemp(i, 7) & _ Right("000" & varTemp(i, 8), 3) & _ Right("000" & varTemp(i, 9), 3) ElseIf varTemp(i, 8) <> "" And IsNumeric(varTemp(i, 8)) = True Then varTemp(i, 7) = varTemp(i, 7) & _ Right("000" & varTemp(i, 8), 3) End If ' 店舗、単位(空欄の場合もある)を挿入 varTemp(i, 8) = strStoreCode varTemp(i, 9) = strStoreName varTemp(i, 10) = varTemp(i + 1, 3) varTemp(i, 11) = "●" ' 次の行から単位を回収したのでスキップ i = i + 1 End Select Next i ' タイトル行 varTemp(1, 1) = "取引先コード" varTemp(1, 2) = "取引先名" varTemp(1, 3) = "仕入" varTemp(1, 4) = "取引日" varTemp(1, 5) = "商品名" varTemp(1, 6) = "仕入数" varTemp(1, 7) = "単価" varTemp(1, 8) = "店舗コード" varTemp(1, 9) = "店舗名" varTemp(1, 10) = "単位" varTemp(1, 11) = "集計用" ' 書式を初期化してから展開する shtCsv.Cells.Delete shift:=xlToLeft shtCsv.Range(shtCsv.Cells(1, 1), shtCsv.Cells(lngRow, 11)) = varTemp ' 仕入情報だけを抽出(=K列に"●"が入っている行) With shtCsv.Range(shtCsv.Cells(1, 1), shtCsv.Cells(lngRow, 11)) .AutoFilter Field:=11, Criteria1:="=●" .Copy Destination:=shtWork.Cells(1, 1) .AutoFilter End With ' CSV初期化 shtCsv.Cells.Delete shift:=xlToLeft ' ピボットテーブルで店舗、商品ごとに合算する ' ※単位は入力内容が統一されていないため集計条件から除外する lngRow = shtWork.Cells(Rows.Count, 1).End(xlUp).row Set pvc = ThisWorkbook.PivotCaches.Create( _ SourceType:=xlDatabase _ , SourceData:=shtWork.Range(shtWork.Cells(1, 1), shtWork.Cells(lngRow, 11)) _ , Version:=xlPivotTableVersion14) Set pvt = pvc.CreatePivotTable( _ TableDestination:=shtWork.Cells(1, 15) _ , TableName:="pvtSyukei_Uriage" _ , DefaultVersion:=xlPivotTableVersion14) With pvt.PivotFields(shtWork.Cells(1, 8).Value) .Orientation = xlRowField .Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False) .LayoutForm = xlTabular .RepeatLabels = True .Position = 1 End With With pvt.PivotFields(shtWork.Cells(1, 9).Value) .Orientation = xlRowField .Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False) .LayoutForm = xlTabular .RepeatLabels = True .Position = 2 End With With pvt.PivotFields(shtWork.Cells(1, 5).Value) .Orientation = xlRowField .Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False) .LayoutForm = xlTabular .RepeatLabels = True .Position = 3 End With pvt.AddDataField pvt.PivotFields(shtWork.Cells(1, 7).Value), "平均 / 単価", xlAverage pvt.AddDataField pvt.PivotFields(shtWork.Cells(1, 6).Value), "合計 / 仕入数", xlSum ' 集計結果を出力シートに転記 With shtReport .Cells(1, 1).Value = "仕入数の集計(仕入から)" .Cells(2, 1).Formula = "=""抽出期間:""&TEXT(MIN(●WORK!D2:D" & lngRow & "),""yyyy/m/d"")&"" 〜 ""&TEXT(MAX(●WORK!D2:D" & lngRow & "),""yyyy/m/d"")" .Cells(2, 1).Value = shtReport.Cells(2, 1).Value End With varTemp = shtWork.Range(shtWork.Cells(1, 15), shtWork.Cells(lngRow, 19)) shtReport.Range(shtReport.Cells(4, 2), shtReport.Cells(lngRow + 3, 6)).Value = varTemp ' Work初期化 shtWork.Cells.Delete shift:=xlToLeft ' -------------------- ' 集計結果を新しいブックへコピー ' -------------------- ' 弥生の取り込み後にコピーする GoTo FIN_Uriage ErrTrap_Uriage: ' -------------------- ' エラー処理 ' -------------------- MsgBox "エラー番号:" & Err.Number & vbCrLf & _ "エラーの種類:" & Err.Description, vbExclamation GoTo FIN_Uriage FIN_Uriage: ' -------------------- ' 終了処理 ' -------------------- ' 処理用シートの印刷範囲の再計算を戻す With shtCsv .DisplayPageBreaks = True End With With shtWork .DisplayPageBreaks = True End With With shtReport .DisplayPageBreaks = True End With End Sub ' ------------------------------ ' 仕入数の集計(弥生販売分) ' ------------------------------ Sub subShiire_Yayoi() Dim shtCsv_1 As Worksheet ' シート:CSVの取り込み先1 Dim shtCsv_2 As Worksheet ' シート:CSVの取り込み先2 Dim shtWork As Worksheet ' シート:一時保存 Dim shtReport As Worksheet ' シート:出力 Dim strFilepass As String ' csvのファイルパス Dim lngRow As Long ' 最終行 Dim varTemp As Variant ' 配列用 Dim pvc As PivotCache ' ピボットテーブル Dim pvt As PivotTable Dim myExcel As New Excel.Application ' 取り込むExcelシート Dim myBook As Workbook Dim mySheet As Worksheet ' On Error GoTo ErrTrap_Yayoi Set shtCsv_1 = ThisWorkbook.Worksheets("●CSV1") Set shtCsv_2 = ThisWorkbook.Worksheets("●CSV2") Set shtWork = ThisWorkbook.Worksheets("●WORK") Set shtReport = ThisWorkbook.Worksheets("●出力") ' -------------------- ' 開始処理 ' -------------------- ' 処理用シートの初期化 With shtCsv_1 .DisplayPageBreaks = False .Cells.Delete shift:=xlToLeft End With With shtCsv_2 .DisplayPageBreaks = False .Cells.Delete shift:=xlToLeft End With With shtWork .DisplayPageBreaks = False .Cells.Delete shift:=xlToLeft End With With shtReport .DisplayPageBreaks = False ' 売上の取り込み結果が入っているため削除しない '.Cells.Delete shift:=xlToLeft End With ' -------------------- ' 売上明細表を取り込む(店毎の仕入情報Excel) ' ※弥生販売からExcel出力したもの、シート名が「sheet1」の前提 ' ※2アカウント分をそれぞれ取り込む(どちらから取り込んでもOK) ' -------------------- ' 1回目の取り込み strFilepass = Application.GetOpenFilename() If strFilepass = "False" Then Call MsgBox("処理を中止します") GoTo FIN_Yayoi End If Set myBook = myExcel.Workbooks.Open(strFilepass) Set mySheet = myBook.Sheets("Sheet1") lngRow = mySheet.Cells(Rows.Count, 2).End(xlUp).row varTemp = mySheet.Range(mySheet.Cells(1, 1), mySheet.Cells(lngRow, 33)) shtCsv_1.Range(shtCsv_1.Cells(1, 1), shtCsv_1.Cells(lngRow, 33)) = varTemp myBook.Close Savechanges:=False ' 2回目の取り込み strFilepass = Application.GetOpenFilename() If strFilepass = "False" Then Call MsgBox("処理を中止します") GoTo FIN_Yayoi End If Set myBook = myExcel.Workbooks.Open(strFilepass) Set mySheet = myBook.Sheets("Sheet1") lngRow = mySheet.Cells(Rows.Count, 2).End(xlUp).row varTemp = mySheet.Range(mySheet.Cells(1, 1), mySheet.Cells(lngRow, 33)) shtCsv_2.Range(shtCsv_2.Cells(1, 1), shtCsv_2.Cells(lngRow, 33)) = varTemp myBook.Close Savechanges:=False ' -------------------- ' 仕入データを整形する ' -------------------- ' 1回目のシートに2回目の取り込んだデータを挿入する With shtCsv_1 .Rows(4).Insert shift:=xlDown .Cells(4, 1).Value = shtCsv_2.Cells(3, 1).Value End With lngRow = shtCsv_2.Cells(Rows.Count, 2).End(xlUp).row varTemp = shtCsv_2.Range(shtCsv_2.Cells(7, 2), shtCsv_2.Cells(lngRow, 33)) shtCsv_1.Range(shtCsv_1.Cells(shtCsv_1.Cells(Rows.Count, 2).End(xlUp).row + 1, 2), shtCsv_1.Cells(shtCsv_1.Cells(Rows.Count, 2).End(xlUp).row + lngRow + 1, 33)) = varTemp ' 仕入情報だけを抽出(=F列が空欄でない行) lngRow = shtCsv_1.Cells(Rows.Count, 2).End(xlUp).row With shtCsv_1.Range(shtCsv_1.Cells(6, 2), shtCsv_1.Cells(lngRow, 33)) .AutoFilter Field:=14, Criteria1:="<>" .Copy Destination:=shtWork.Cells(1, 1) .AutoFilter End With ' ピボットテーブルで店舗、商品ごとに合算する lngRow = shtWork.Cells(Rows.Count, 1).End(xlUp).row Set pvc = ThisWorkbook.PivotCaches.Create( _ SourceType:=xlDatabase _ , SourceData:=shtWork.Range(shtWork.Cells(1, 1), shtWork.Cells(lngRow, 32)) _ , Version:=xlPivotTableVersion14) Set pvt = pvc.CreatePivotTable( _ TableDestination:=shtWork.Cells(1, 40) _ , TableName:="pvtSyukei_Yayoi" _ , DefaultVersion:=xlPivotTableVersion14) With pvt.PivotFields(shtWork.Cells(1, 1).Value) .Orientation = xlRowField .Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False) .LayoutForm = xlTabular .RepeatLabels = True .Position = 1 End With With pvt.PivotFields(shtWork.Cells(1, 2).Value) .Orientation = xlRowField .Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False) .LayoutForm = xlTabular .RepeatLabels = True .Position = 2 End With With pvt.PivotFields(shtWork.Cells(1, 14).Value) .Orientation = xlRowField .Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False) .LayoutForm = xlTabular .RepeatLabels = True .Position = 3 End With With pvt.PivotFields(shtWork.Cells(1, 15).Value) .Orientation = xlRowField .Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False) .LayoutForm = xlTabular .RepeatLabels = True .Position = 4 End With With pvt.PivotFields(shtWork.Cells(1, 16).Value) .Orientation = xlRowField .Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False) .LayoutForm = xlTabular .RepeatLabels = True .Position = 5 End With With pvt.PivotFields(shtWork.Cells(1, 17).Value) .Orientation = xlRowField .Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False) .LayoutForm = xlTabular .RepeatLabels = True .Position = 6 End With With pvt.PivotFields(shtWork.Cells(1, 23).Value) .Orientation = xlRowField .Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False) .LayoutForm = xlTabular .RepeatLabels = True .Position = 7 End With pvt.AddDataField pvt.PivotFields(shtWork.Cells(1, 21).Value), "合計 / 数量", xlSum ' 集計結果を出力シートに転記 With shtReport .Cells(1, 9).Value = "仕入数の集計(弥生の売上明細表)" .Cells(2, 9).Value = shtCsv_1.Cells(3, 1).Value .Cells(3, 9).Value = shtCsv_1.Cells(4, 1).Value End With lngRow = shtWork.Cells(Rows.Count, 40).End(xlUp).row varTemp = shtWork.Range(shtWork.Cells(1, 40), shtWork.Cells(lngRow, 47)) shtReport.Range(shtReport.Cells(5, 10), shtReport.Cells(lngRow + 4, 17)).Value = varTemp ' Work初期化 shtWork.Cells.Delete shift:=xlToLeft ' CSV初期化 shtCsv_1.Cells.Delete shift:=xlToLeft shtCsv_2.Cells.Delete shift:=xlToLeft ' -------------------- ' 集計結果を新しいブックへコピー ' -------------------- With shtReport .Visible = True .Copy .Visible = False .Cells.Delete shift:=xlToLeft End With GoTo FIN_Yayoi ErrTrap_Yayoi: ' -------------------- ' エラー処理 ' -------------------- MsgBox "エラー番号:" & Err.Number & vbCrLf & _ "エラーの種類:" & Err.Description, vbExclamation GoTo FIN_Yayoi FIN_Yayoi: ' -------------------- ' 終了処理 ' -------------------- ' 処理用シートの印刷範囲の再計算を戻す With shtCsv_1 .DisplayPageBreaks = True End With With shtCsv_2 .DisplayPageBreaks = True End With With shtWork .DisplayPageBreaks = True End With With shtReport .DisplayPageBreaks = True End With End Sub ' --------------- ' CSVファイルの取り込み処理 ' --------------- Sub subImportCSV(strFilepass As String, mySheet As Worksheet, myRange As Range) With mySheet.QueryTables.Add(Connection:="TEXT;" & strFilepass, Destination:=myRange) .Name = "CSV取り込み" .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .TextFilePromptOnRefresh = False .TextFilePlatform = 932 .TextFileStartRow = 1 .TextFileParseType = xlDelimited .TextFileTextQualifier = xlTextQualifierDoubleQuote .TextFileConsecutiveDelimiter = False .TextFileTabDelimiter = True .TextFileSemicolonDelimiter = False .TextFileCommaDelimiter = True .TextFileSpaceDelimiter = False .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1) .TextFileTrailingMinusNumbers = True .Refresh BackgroundQuery:=False ' ※接続を削除(データ>接続に残っていなければ成功) .Parent.Names(.Name).Delete .Delete End With End Sub