将空白单元格上方的行汇总到前一个空白单元格

时间:2018-04-19 08:05:24

标签: excel vba loops sum blank-line

您好!

我正在尝试构建一个宏,它在单个列的范围内找到一个空白单元格,并将此空白单元格与前一个空白单元格之间的所有单元格相加。

我已经在网上搜索了很多,而其他人已经问过这个问题,我发现他们的答案在我的情况下特别有用,因为我需要在3500多行中工作。

例如:

4  
3  
4  
BLANK 1  
2  
5  
7  
1  
BLANK 2  
1  
4  
BLANK 3

在这种情况下,名为"BLANK 1"的单元格将是前3行的总和:4 + 3 + 4 = 11
"Blank 2"将是15等等。

范围是" G8:G3561"。

修改

快速回答请看Mr_Nitrogen的回答。它工作得很漂亮! 但是,由于我不熟悉VBA和编码,我不知道代码的工作原理和原因。

我非常渴望更好地了解VBA,这就是为什么我要继续这个主题(如果允许的话)。
此外,我想为评论者提供证据,我自己也确实在这方面工作,我更愿意建立自己的代码。

了解我的代码工作原理或工作原理非常重要,这就是为什么我希望您仍然希望帮助我开发自己的代码。

我终于找到了一种合乎逻辑的方法。我知道这不是最简单的方法,但我想知道它是否可行。

我已经写了以下代码。

Sub Sum_storage()
Dim rng As Range
Dim cell As Range
Dim cell2 As Range
Dim cell3 As Range

Range("G8").End(xlDown).Offset(1, 0).Select
Set cell = Selection
cell.Value = "temp" 'Finds the first blank cell in column G _
                     and creates a temporary value in order _
                     to find the second blank cell

Range("G8").End(xlDown).Offset(1, 0).Select
Set cell2 = Selection

cell.Offset(1, 0).Select
Set cell3 = Selection  'The range i need to sum can _
                        now be described as "cell3:cell2"

Set rng = Range(Range("cell3"), Range("cell2")) 'The code works until this point
cell2.Value = WorksheetFunction.Sum(rng)

我的想法是定义我想要与多个变量相加的范围 我的问题是尝试引用这些变量(并以比使用.Offset更简单的方式设置它们)。

根据两个先前设定的范围,是否根本无法设定范围(rng)?

如果可能的话,我的下一步就是创建某种循环,使其适用于所有超过3500行。

2 个答案:

答案 0 :(得分:3)

使用End(xlDown),你走在正确的轨道上。

这个应该比循环遍历所有单元格更快,因为它跳转到下一个空单元格并通过WorksheetFunction.Sum求和。

Option Explicit

Public Sub DoMyStuff()
    Dim ws As Worksheet
    Set ws = Worksheets("Tabelle8") 'define your worksheet here

    Dim FirstCell As Range
    Set FirstCell = ws.Range("G8")

    Dim VeryLastCell As Range 'get very last cell as stop criteria
    Set VeryLastCell = ws.Cells(ws.Rows.Count, "G").End(xlUp)

    Do
        Dim LastCell As Range
        If FirstCell.Offset(1) = vbNullString Then 'test if there is only one cell to sum
            Set LastCell = FirstCell
        Else
            Set LastCell = FirstCell.End(xlDown)
        End If

        With LastCell.Offset(1, 0) 'this is the cell we want to write the sum
            .Value = Application.WorksheetFunction.Sum(ws.Range(FirstCell, LastCell))
            .Interior.Color = RGB(255, 0, 0)
        End With

        Set FirstCell = LastCell.Offset(2, 0)

    Loop While FirstCell.Row < VeryLastCell.Row
End Sub

答案 1 :(得分:1)

这对于for循环来说并不复杂,可能类似于

lastrow = Cells(Rows.Count, "G").End(xlUp).Row
firstrow = 8
TempTotal = 0
for x = firstrow to lastrow + 1
    If Cells(x, "G") <> "" Then
        TempTotal = TempTotal + Cells(x, "G")
    Else:   Cells(x, "G") = TempTotal
            Cells(x, "G").Interior.ColorIndex = 4
            TempTotal = 0
    End if
    Next x

我做了一个编辑,使它更简单

守则的逻辑:

  1. 使用“G”列中的数据定义最后一行
  2. 逐个单元格向下移动直到该行
  3. 如果单元格中包含值,请将其添加到临时总计中。
  4. 如果为空,则插入临时总计并将tempTotal重置为零

      
        
    1. 这是第一行,我们在其中选择“G”列中的最后一个单元格,使用End(xlup)来获取带有数据的最后一个单元格并使用.row来获取该单元格的行号

    2.   
    3. 设置For循环,重复运行“for”和“next x”行之间的代码,同时每次重复时将x的值从“firstrow”增加到“lastrow + 1”(如果firsrow为1,lastrow为100)然后它将运行代码100次,x = 1,2,3,4,5等。)

    4.   
    5. 这是“if”语句,“&lt;&gt;”意思是不相等,所以我们说如果第x行,col“G”上的单元格不等于“”,这是一个空字符串(或什么都没有),那么我们进行下一行(将其值添加到tempTotal)
    6.   
    7. 如果“If”语句不为真(如果单元格为空)则我们执行“Else”下的操作并使该单元格等于TempTotal,将其颜色更改为绿色(4是颜色代码,它们介于两者之间1和50),并将temptotal重置为0.
    8.