1

ここに画像の説明を入力列 A で並べ替えられた Excel データをループし、coulmn の値が上記の値と異なる場合は空白行を挿入するマクロを作成しています。これにより、データが列 A によってグループに分けられます。

次に、分離されたグループの列 d の値を合計します。ほとんどのコードは下で動作していますが、startCell 変数に問題があります。やりたいことはわかっていますが、論理を正しく理解できません。誰かがそれらの個々のグループを要約するのを手伝ってくれませんか。

どうもありがとう

Sub PutARowInWithFormula()
  Range("A3").Select

  Dim startCell As Integer
  Dim endCell As Integer

  startCell = 3
  endCell = 0

  Do Until ActiveCell.Value = ""
    If ActiveCell.Value = ActiveCell.Offset(-1, 0).Value Then
      ActiveCell.Offset(1, 0).Select
    Else
      ' I need the bottom code to execute only once in the loop
      ' startCell = ActiveCell.Row
      ActiveCell.EntireRow.Insert

      ' move to column d
      ActiveCell.Offset(0, 3).Select

      endCell = ActiveCell.Row - 1
      ActiveCell.Formula = "=Sum(d" & startCell & ":d" & endCell & ")"

      ' move back to column a
      ActiveCell.Offset(0, -3).Select

      'move 2 rows down
      ActiveCell.Offset(3, 0).Select
    End If
  Loop
End Sub
4

1 に答える 1

3

なぜピボットテーブルを使用しないのか、ワークシート関数を使用してこれを作成するのか、それも可能です。また、私はこのセレクションの試みがあまり好きではありませんが、それはあなたのやり方であり、私はそれを尊重します。それらを使用することが良い考えである場合、それは状況の非常に良い例のようにさえ思えます. 現時点では、VBA でこれを行うには、他の方法を考えると、もっと複雑に思えるからです。

したがって、コードの修正は次のとおりです。

Sub PutARowInWithFormula()
  Range("A2").Select

  Do Until ActiveCell.Value = ""
    If ActiveCell.Value = ActiveCell.Offset(-1, 0).Value Then
      ActiveCell.Offset(1, 0).Select
    Else
      ActiveCell.EntireRow.Insert

      'you can use the offset directly
      'by using an improved formula, you do not need to know start and end row.
      ActiveCell.Offset(0, 3).Formula = _
        "=SUMIF(A:A,OFFSET(INDIRECT(""A""&ROW()),-1,0),D:D)"

      ' move back to column a and move 2 rows down
      ActiveCell.Offset(2, 0).Select
    End If
  Loop
End Sub

編集

わかりました、ほぼ同じことを行うためのより簡単な方法を見つけました:

Public Sub demo()
  UsedRange.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=4
End Sub

この機能は、リボン メニュー -> データ -> 合計からも利用できます。

エラー メッセージを回避するには、次のようなデータのタイトル行が必要です。

日付 | 名前 | カウンター | 価値

于 2012-11-15T14:02:20.350 に答える