Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA循环和变量-查找空行并将行号放入变量中_Vba_Excel - Fatal编程技术网

VBA循环和变量-查找空行并将行号放入变量中

VBA循环和变量-查找空行并将行号放入变量中,vba,excel,Vba,Excel,我正在编写一个宏,它循环遍历Excel数据,该数据按列a排序,如果coulmn的值与上面的值不同,则插入一个空行。这将我的数据按A列分组 然后,我想对分离组的d列的值求和。我的大部分代码都在下面工作,但是我遇到的问题是startCell变量。我知道我想做什么,但逻辑不正确,请有人帮我总结一下这些群体 非常感谢 Sub PutARowInWithFormula() Range("A3").Select Dim startCell As Integer Dim endCell As I

我正在编写一个宏,它循环遍历Excel数据,该数据按列a排序,如果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

我太想知道,为什么不使用数据透视表,或者只使用工作表函数创建数据透视表,这也是可能的。我也不喜欢这种选择,但这是你的方式,我尊重这一点。这似乎是一个很好的例子,当它可能是一个好主意,使用它们的情况。因为现在,我能想到的任何其他方法,在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
此功能也可通过功能区菜单->数据->求和使用

为了避免出现错误消息,您只需要为数据设置一个标题行,如:


日期|名称|计数器|值

您能否在问题下方复制一些样本数据(通过更新,而不是通过注释)?我指的是一个屏幕,显示您需要排序/分组的内容以及您期望的答案。为什么不使用一个数据透视表,它可以按天汇总您的总数?