您好!
我正在尝试构建一个宏,它在单个列的范围内找到一个空白单元格,并将此空白单元格与前一个空白单元格之间的所有单元格相加。
我已经在网上搜索了很多,而其他人已经问过这个问题,我发现他们的答案在我的情况下特别有用,因为我需要在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行。
答案 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
我做了一个编辑,使它更简单
守则的逻辑:
如果为空,则插入临时总计并将tempTotal重置为零
这是第一行,我们在其中选择“G”列中的最后一个单元格,使用End(xlup)来获取带有数据的最后一个单元格并使用.row来获取该单元格的行号
设置For循环,重复运行“for”和“next x”行之间的代码,同时每次重复时将x的值从“firstrow”增加到“lastrow + 1”(如果firsrow为1,lastrow为100)然后它将运行代码100次,x = 1,2,3,4,5等。)
- 这是“if”语句,“&lt;&gt;”意思是不相等,所以我们说如果第x行,col“G”上的单元格不等于“”,这是一个空字符串(或什么都没有),那么我们进行下一行(将其值添加到tempTotal)
- 如果“If”语句不为真(如果单元格为空)则我们执行“Else”下的操作并使该单元格等于TempTotal,将其颜色更改为绿色(4是颜色代码,它们介于两者之间1和50),并将temptotal重置为0.
醇>