在Excel上使用VB,列的总和只是一个单元格

时间:2014-09-13 00:46:07

标签: vb.net excel sum

    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循环没有超过第一次迭代,但我不明白为什么会发生这种情况。

3 个答案:

答案 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)

您的代码中存在以下几个问题:

  • 您将两个单独的单元格传递给Sum,而不是Range。
  • 你创建一个With块然后不要使用它,
  • 使用Select / ActiveCell既不必要也不可取
  • 使用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循环。