yuhtaryouko
@yuhtaryouko (Yuta Kato)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

WorksheetFunction.SumIfsで複数シートから集計を行い、複数のセルに転記したい

解決したいこと

業務にて、従業員ごとの1か月分の売上集計をしています。
集計元のワークシート(日付ごと・同じフォーマット)からSUMIFS関数で集計し、別シート("集計")のセルに転記していきたいです。

ワークブックの構成は以下の通りです。
・集計対象としないワークシート×3、ワークシート"集計"→ コード上でa,b,c,dとします

・集計対象とする毎日の売上表(ワークシート名は"yyyy/mm/dd")
L3:L45にスタッフ名、H3:H45に集計対象となる売上金額が入力されています。

ワークシート"集計"への転記時には列にスタッフ名、行に日付を入れようとしています
ex. B1=山田 C1=加藤 D1=佐藤、、、、、、
  A2=1日 A3=2日 A4=3日、、、、、
  B2=ワークシート"20220501"内の山田の売上 C2=ワークシート"20220501"内の加藤の売上、、、
  B3=ワークシート"20220502"内の山田の売上 C3=ワークシート"20220502"内の加藤の売上、、、

発生している問題・エラー

ワークシート名とセルを紐づける方法が浮かばないのと、そもそも全体のコードがいまいちはっきりしていません。

該当するソースコード

まず試しに1人分の集計をテストしてみました。

Sub test()
   'シート名を指定して1日分の合計を転記する
   With Worksheets("20220501")
   Worksheets("集計").Cells(2, "B") = WorksheetFunction.SumIf(.Range("L3:L45"), "山田", .Range("H3:H45"))
   
   End With
   

End Sub

これは正常に動きましたので、これをすべてのワークシートでループさせればと思い今度はFor文とIF notを混ぜて、集計対象としたいワークシートのみをループさせるようにコードを書いてみました。
ですがこれがうまく動きません。エラーも出ず、ただ転記先が空白のまま。
また、これだと1か月分を集計してB2に転記してしまうので、やりたいこととずれてしまうと途中で気づきました。

Sub syuukei()

'使わないsheet名を定義

 Dim a As Worksheet
 Dim b As Worksheet
 Dim c As Worksheet
 Dim d As Worksheet
 
 Set a = Worksheets("集計対象外1")
 Set b = Worksheets("集計対象外2")
 Set c = Worksheets("集計対象外3")
 Set d = Worksheets("集計")
 
 
 'for文で繰り返し、シート名がa,b,c,dに一致するものをif not~で除外する
 
 Dim sheetNo As Integer
 
 For sheetNo = 1 To Worksheets.Count
     
  If Not Worksheets(sheetNo).Name = a.Name And Worksheets(sheetNo).Name = b.Name And Worksheets(sheetNo).Name = c.Name And Worksheets(sheetNo).Name = d.Name Then
   With Worksheets(sheetNo)       
     Worksheets("集計").Cells(2, "B") = WorksheetFunction.SumIf(.Range("L3:L45"), "山田", .Range("H3:H45"))
       End with
    End If
         
 Next
 
End Sub

これが機能しないことと、
Worksheets("集計").Cells(2, "B")の部分をどのようにしたらワークシート名と連動させられるのかが今の問題です。

よろしくお願いいたします。

自分で試したこと

今調べてできる中でコードを書きました。

0

2Answer

Comments

  1. @yuhtaryouko

    Questioner

    ご回答ありがとうございます!Power Queryというものを初めて聞いたので調べてみます。
  2. @yuhtaryouko さん
    そもそも、"山田" だと、山田さんしか計算できませんので、そこのところうまくやれば、VBA でも、うまくできるとは思いますが、配列が同じ形式なら、やはり、Power Query をお勧めします。

INDIRECT関数を使えばワークシート名も動的に指定可能ですので数式だけで解決できるのではないかと思います。

例えば、集計シートのB2セルの数式を書くとすれば、
=SUMIF(INDIRECT("20220501!L3:L45",TRUE), "山田", INDIRECT("20220501!H3:H45",TRUE))
といった感じで数式を組み立てられれば良いので、
最終的には
=SUMIF(INDIRECT(TEXT($A2, "yyyymmdd")&"!L3:L45",TRUE), B$1, INDIRECT(TEXT($A2, "yyyymmdd")&"!H3:H45",TRUE))
のような感じにすれば行けるかと思います。
※集計シートのA列に日付シリアル値が入っている前提です。

0Like

Comments

  1. @yuhtaryouko

    Questioner

    アドバイス通り、INDIRECT関数を使って個人の売上を参照することができました!ありがとうございます。

    あとはこれを上手くfor文に組み込めるようにもうひと頑張りしてみます!

Your answer might help someone💌