Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


9 / 13657 ツリー ←次へ | 前へ→

【82417】sumifsを使ったVBAの作り方 NANAMI 24/12/17(火) 13:12 質問[未読]
【82418】Re:sumifsを使ったVBAの作り方 マナ 24/12/17(火) 20:09 発言[未読]
【82419】Re:sumifsを使ったVBAの作り方 NANAMI 24/12/18(水) 17:27 お礼[未読]

【82417】sumifsを使ったVBAの作り方
質問  NANAMI E-MAIL  - 24/12/17(火) 13:12 -

引用なし
パスワード
   VBAを勉強し始めたばかりの初心者です。
sheet1の売り上げデータを元に、sheet2(sheet2とはタブが別のシート)の店と商品ごとの売り上げ集計をしたい。といった問題です。
模範解答はこちらです。
Sub 練習問題15()
  Dim i As Long
  Dim ixR As Long
  Dim ixC As Long
  Dim ws1 As Worksheet
  Dim ws2 As Worksheet
  Set ws1 = Worksheets("練習15")
  Set ws2 = Worksheets("練習15_回答")
  ws2.Range("A1").CurrentRegion.Offset(1, 1).ClearContents
  With ws1
    For i = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row
      ixC = 2
      Do Until ws2.Cells(1, ixC) = .Cells(i, 1)
        ixC = ixC + 1
      Loop
      ixR = 2
      Do Until ws2.Cells(ixR, 1) = .Cells(i, 2)
        ixR = ixR + 1
      Loop
      ws2.Cells(ixR, ixC) = ws2.Cells(ixR, ixC) + .Cells(i, 3)
    Next
  End With
End Sub


do loop の無限ループを防ぎたく、for nextとsumifsを使って作りたいのですが、作り方がわかりません。
どなたかご教示いただきたくお願いいたします。
ちなみにこちらがsumifsで自分なりに作ったVBAです。当然起動しませんでした。


Sub 練習問題15()
  Application.ScreenUpdating = False
  Dim i As Long
  Dim j As Long
  Dim ws2Row As Long
  Dim ws2column As Long
  Dim ws1 As Worksheet
  Dim ws2 As Worksheet
  Set ws1 = Worksheets("練習15")
  Set ws2 = Worksheets("練習15_回答")
  ws2.Range("A1").CurrentRegion.Offset(1, 1).ClearContents
  With ws1
    For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
    For j = 1 To 3
      With ws2
      For ws2Row = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
      For ws2column = 2 To 5
      .Cells(ws2Row, ws2column).Value = Application.WorksheetFunction.
        SumIfs(.Range("C1", Cells(i, 3)), .Range("A1", Cells(i, 1)), Cells(1, ws2column), .Range("B1", Cells(i, 2)), Cells(ws2Row, 1))
      Next
      End With
  End With
    
End Sub

【82418】Re:sumifsを使ったVBAの作り方
発言  マナ  - 24/12/17(火) 20:09 -

引用なし
パスワード
   ▼NANAMI さん:
>
>for nextとsumifsを使って作りたいのです

Worksheets("練習15")では、ループ必要ないでしょう。

Sub test()
  Dim r1 As Range
  Dim r2 As Range
  Dim i As Long
  Dim j As Long
  
  Set r1 = Worksheets("練習15").Range("A1").CurrentRegion
  Set r2 = Worksheets("練習15_回答").Range("A1").CurrentRegion
  
  For i = 2 To r2.Rows.Count
    For j = 2 To r2.Columns.Count
      r2(i, j).Value = WorksheetFunction.SumIfs(r1.Columns(3), _
        r1.Columns(1), r2(1, j).Value, r1.Columns(2), r2(i, 1).Value)
    Next
  Next

End Sub

数式を一括で挿入して、それを値に変換すると
ープなしでできます。

Sub test2()
  Dim r1 As Range
  Dim r2 As Range
  Dim f As String

  Set r1 = Worksheets("練習15").Range("A1").CurrentRegion
  Set r2 = Worksheets("練習15_回答").Range("A1").CurrentRegion
  Set r2 = Intersect(r2, r2.Offset(1, 1))
  
  f = "=sumifs(" _
    & r1.Columns(3).Address(-1, -1, , -1) & "," _
    & r1.Columns(1).Address(-1, -1, , -1) & "," _
    & r2(0, 1).Address(-1, 0) & "," _
    & r1.Columns(2).Address(-1, -1, , -1) & "," _
    & r2(1, 0).Address(0, -1) & ")"
    
  r2.Formula = f
  r2.Value = r2.Value

End Sub

【82419】Re:sumifsを使ったVBAの作り方
お礼  NANAMI E-MAIL  - 24/12/18(水) 17:27 -

引用なし
パスワード
   ▼マナ さん:
>▼NANAMI さん:
>>
>>for nextとsumifsを使って作りたいのです
>
>Worksheets("練習15")では、ループ必要ないでしょう。
>
>Sub test()
>  Dim r1 As Range
>  Dim r2 As Range
>  Dim i As Long
>  Dim j As Long
>  
>  Set r1 = Worksheets("練習15").Range("A1").CurrentRegion
>  Set r2 = Worksheets("練習15_回答").Range("A1").CurrentRegion
>  
>  For i = 2 To r2.Rows.Count
>    For j = 2 To r2.Columns.Count
>      r2(i, j).Value = WorksheetFunction.SumIfs(r1.Columns(3), _
>        r1.Columns(1), r2(1, j).Value, r1.Columns(2), r2(i, 1).Value)
>    Next
>  Next
>
>End Sub
>
>数式を一括で挿入して、それを値に変換すると
>ープなしでできます。
>
>Sub test2()
>  Dim r1 As Range
>  Dim r2 As Range
>  Dim f As String
>
>  Set r1 = Worksheets("練習15").Range("A1").CurrentRegion
>  Set r2 = Worksheets("練習15_回答").Range("A1").CurrentRegion
>  Set r2 = Intersect(r2, r2.Offset(1, 1))
>  
>  f = "=sumifs(" _
>    & r1.Columns(3).Address(-1, -1, , -1) & "," _
>    & r1.Columns(1).Address(-1, -1, , -1) & "," _
>    & r2(0, 1).Address(-1, 0) & "," _
>    & r1.Columns(2).Address(-1, -1, , -1) & "," _
>    & r2(1, 0).Address(0, -1) & ")"
>    
>  r2.Formula = f
>  r2.Value = r2.Value
>
>End Sub


sumifsを使ったVBA、とてもわかりやすかったです。理解できました。ありがとうございました。

9 / 13657 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free