Dim lastrow As Integer
Dim lastcol As Integer, thiscol As Integer
xlWorkbook = xlApp.Workbooks.Open(Filename:="C:\Users\d3p823\Desktop\test data.xlsx") 'opens workbook'
xlWsheet2 = xlWorkbook.Sheets("Sheet4") 'set active sheet'
xlApp.Visible = True
With xlWsheet2
lastrow = xlWsheet2.Cells(xlWsheet2.Rows.Count, 1).End(Excel.XlDirection.xlUp).Row
lastcol = xlWsheet2.Cells(1, xlWsheet2.Columns.Count).End(Excel.XlDirection.xlToLeft).Column
For thiscol = 2 To lastcol
xlWsheet2.Cells(lastrow + 1, thiscol).Select()
xlApp.ActiveCell.Value = xlApp.WorksheetFunction.Sum(xlWsheet2.Cells(2, xlApp.ActiveCell.Column), xlApp.ActiveCell)
Next
End With
好的,所以我在电子表格上有一个矩形数据块,其中第1行和第1列为标签(文本和数字),单元格(2,2)上有数据。数据文件的行数和列数可以变化,但所有数据都是连续的:没有空单元格。 @Clif和我提出了上面的代码来查找数据的最后一行和一列,然后在每列下面的第一个空单元格中总结每一列。
我不再感到错误,谢天谢地,但是添加到第一个空行的总和并不是整个列,只是第一个单元格。这让我觉得FOR-NEXT循环没有超过第一次迭代,但我不明白为什么会发生这种情况。
答案 0 :(得分:1)
通过将变量声明为整数,可将其限制为32,768。因此,如果您要汇总低于该级别的行,则您的宏将失败。
由于您指示数据区域是连续的,并且是矩形的,并且从A1开始,因此您只需使用CurrentRegion来获取数据区域的范围引用。
出于速度目的,当在vba数组中完成时,这样的操作将更快地执行,而不是在工作表上执行。
一些有限的测试表明,与使用SUM工作表函数相比,循环到ADD的执行速度更快(数量级),至少在有限的数据集上。是否会 如果您的真实数据只能通过测试来解决。
-
Option Explicit
Sub AddColumns()
Dim WS As Worksheet
Dim RNG As Range
Dim V As Variant
Dim I As Long, J As Long
Dim dTemp As Double
Set WS = Worksheets("sheet1")
'with offset, we will skip the labels row, and leave
' one blank at the end for the total
Set RNG = Cells(1, 1).CurrentRegion.Offset(rowoffset:=1)
V = RNG
For I = 2 To UBound(V, 2) 'The "2" to skip the first column
dTemp = 0
For J = 1 To UBound(V, 1) - 1
dTemp = dTemp + V(J, I)
Next J
V(UBound(V), I) = dTemp
Next I
RNG = V
End Sub
答案 1 :(得分:0)
您的代码中存在以下几个问题:
Integer
而不是long
...
With xlWsheet2
lastrow = .Cells(.Rows.Count, 1).End(Excel.XlDirection.xlUp).Row
lastcol = .Cells(1, .Columns.Count).End(Excel.XlDirection.xlToLeft).Column
For thiscol = 2 To lastcol
.Cells(lastrow + 1, thiscol).Value = _
xlApp.Sum(.Range(.Cells(2, thiscol), .Cells(lastrow, thiscol)))
Next
End With
答案 2 :(得分:-1)
您需要第二个For
循环从第2行转到lastrow
。
或者用{
}替换Next
语句之前的语句
ActiveCell.FormulaR1C1 = "=SUM(R[" & -lastrow + 1 & "]C:R[-1]C)"
这使用SUM
函数,无需第二个For循环。