1433922666 VBA:excelで複数のexcelファイルより特定の条件の行を指定して、その行内のセルの数値を合計して集計する方法について。


現場毎に取引先からの請求を集計する作業に追われております。
一つのフォルダ(たとえば「2月請求書まとめ」)に取引先毎のその月の請求書がまとまって置いてあります。以下の画像のように現場毎にコードを付与し、仕訳してあります。
この複数のファイルから、コードを元に(画像では現場コード1506002)金額を抽出し、合計したいと考えております。
この場合はどのようなマクロを書けばよろしいでしょうか。
宜しくお願いします。

回答の条件
  • 1人3回まで
  • 13歳以上
  • 登録:2015/06/10 16:51:06
  • 終了:2015/06/12 20:47:21

ベストアンサー

id:a-kuma3 No.2

a-kuma3回答回数4559ベストアンサー獲得回数19032015/06/10 22:43:19

ポイント500pt

エラー処理とか端折ってますが、マクロを書いてみました。

Const TARGET_DIR = "D:\hoge\2月請求書まとめ\"		' 請求書が置いてあるフォルダ
Const MAX_ROW = 1000

Sub 請求書集計()
    r2 = 5
    code = Cells(2, 1).Value

    fname = Dir(TARGET_DIR & "*.xlsx")

    Do While fname <> ""

        Set this_book = ActiveWorkbook
        Set target_book = Workbooks.Open(TARGET_DIR & fname)
        this_book.Activate
        r = 6
        
        Set s = target_book.Sheets(1)
        Sum = 0

        Do While r < MAX_ROW
            Set c = s.Cells(r, 1)
            If IsEmpty(c) Or c.Value = "" Then
                Exit Do
            End If
            place = ""
            If c.Value = code Then
                place = s.Cells(r, 2).Value
                Sum = Sum + s.Cells(r, 3).Value
            End If
            r = r + 1
        Loop

        Cells(r2, 1).Value = s.Cells(3, 1).Value
        Cells(r2, 2).Value = s.Cells(3, 2).Value
        Cells(r2, 3).Value = Sum
        
        target_book.Close SaveChanges:=False

        r2 = r2 + 1
        fname = Dir()
    Loop

    Cells(r2, 2).Value = "小計"
    Cells(r2, 3).Formula = "=SUM(C5:C" & (r2 - 1) & ")"

End Sub

以下のことを前提にしてます。
・集計する請求書が置いてあるフォルダには、請求書以外の .xlsx なファイルが無い
・集計結果の取引先コードの順序は気にしない

集計元のフォルダをマクロの先頭に書いてあるので、適宜変更してください。
フォルダの最後は \ で終わるようにしてください。

その他の回答(2件)

id:taknt No.1

きゃづみぃ回答回数13539ベストアンサー獲得回数11982015/06/10 21:25:18

http://okwave.jp/qa/q7054772.html

ほかのブックから VLOOKUPでもってくればいいと思いますよ。

id:a-kuma3 No.2

a-kuma3回答回数4559ベストアンサー獲得回数19032015/06/10 22:43:19ここでベストアンサー

ポイント500pt

エラー処理とか端折ってますが、マクロを書いてみました。

Const TARGET_DIR = "D:\hoge\2月請求書まとめ\"		' 請求書が置いてあるフォルダ
Const MAX_ROW = 1000

Sub 請求書集計()
    r2 = 5
    code = Cells(2, 1).Value

    fname = Dir(TARGET_DIR & "*.xlsx")

    Do While fname <> ""

        Set this_book = ActiveWorkbook
        Set target_book = Workbooks.Open(TARGET_DIR & fname)
        this_book.Activate
        r = 6
        
        Set s = target_book.Sheets(1)
        Sum = 0

        Do While r < MAX_ROW
            Set c = s.Cells(r, 1)
            If IsEmpty(c) Or c.Value = "" Then
                Exit Do
            End If
            place = ""
            If c.Value = code Then
                place = s.Cells(r, 2).Value
                Sum = Sum + s.Cells(r, 3).Value
            End If
            r = r + 1
        Loop

        Cells(r2, 1).Value = s.Cells(3, 1).Value
        Cells(r2, 2).Value = s.Cells(3, 2).Value
        Cells(r2, 3).Value = Sum
        
        target_book.Close SaveChanges:=False

        r2 = r2 + 1
        fname = Dir()
    Loop

    Cells(r2, 2).Value = "小計"
    Cells(r2, 3).Formula = "=SUM(C5:C" & (r2 - 1) & ")"

End Sub

以下のことを前提にしてます。
・集計する請求書が置いてあるフォルダには、請求書以外の .xlsx なファイルが無い
・集計結果の取引先コードの順序は気にしない

集計元のフォルダをマクロの先頭に書いてあるので、適宜変更してください。
フォルダの最後は \ で終わるようにしてください。

  • id:jan8
    ピボットテーブルの使い方を覚えれば、マクロを作らなくても集計できますよ。

    Accessなどを使って仕訳帳や現場台帳をデータベースにすれば良いのですが、
    Excelでもピボットテーブルを使えばデータベースのような集計が可能です。
  • id:jan8
    ピボットテーブルの例
    https://docs.google.com/spreadsheets/d/1HBdkcKK-v7l7XjKTePKGXxXS2N0UcIBIEoGMVlBcVAY/edit?pli=1#gid=2058425130
  • id:a-kuma3
    現場単位で請求書に当たる Excel Book が複数あって(多分、数も多い)、ファイルがいくつになるかも分からない、という状況でしょう。
    INDIRECT でファイル名も式に含めることはできなくはないですけれど、やっぱり面倒だと思いますよ。

    # 少なくとも、自分では集計役をやりたいとは思わない
  • id:jan8
    データベース的な計算をする事よりも、大量のExcelブックから情報を集める作業が求められているのですね。
  • id:a-kuma3
    ぼくの勝手な想像ですけれどね。
  • id:jan8
    複数の担当者が情報をまとめているだろうから、複数のExcelブックになると考えるのが自然ですよ。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません