Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.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
Vb.net 在excel上使用VB,列的和只有一个单元格_Vb.net_Excel_Sum - Fatal编程技术网

Vb.net 在excel上使用VB,列的和只有一个单元格

Vb.net 在excel上使用VB,列的和只有一个单元格,vb.net,excel,sum,Vb.net,Excel,Sum,好的,我在一个电子表格上有一个矩形的数据块,第一行和第1列是文本和数字的标签,第2,2单元的数据。数据文件的行数和列数是可变的,但所有数据都是连续的:没有空单元格@Clif和我已经想出了上面的代码来查找数据的最后一行和最后一列,然后对每列下第一个空单元格中的每一列求和 谢天谢地,我再也不会出错了,但添加到第一个空行的总和并不是整个列的总和,只是第一个单元格。这使我认为FOR-NEXT循环没有经过第一次迭代,但我不明白为什么会发生这种情况。您需要第二次FOR-NEXT循环才能从第2行转到最后一行

好的,我在一个电子表格上有一个矩形的数据块,第一行和第1列是文本和数字的标签,第2,2单元的数据。数据文件的行数和列数是可变的,但所有数据都是连续的:没有空单元格@Clif和我已经想出了上面的代码来查找数据的最后一行和最后一列,然后对每列下第一个空单元格中的每一列求和

谢天谢地,我再也不会出错了,但添加到第一个空行的总和并不是整个列的总和,只是第一个单元格。这使我认为FOR-NEXT循环没有经过第一次迭代,但我不明白为什么会发生这种情况。

您需要第二次FOR-NEXT循环才能从第2行转到最后一行

或者,将下一条语句之前的语句替换为

ActiveCell.FormulaR1C1==SUMR[&-lastrow+1&]C:R[-1]C

这使用了SUM函数,并且不需要第二个for循环

通过将变量声明为整数,可以将它们限制为32768。因此,如果对低于该级别的行求和,宏将失败

因为您指示数据区域是连续的、矩形的,并且从A1开始,所以您可以使用CurrentRegion来获取数据区域的范围引用

为了提高速度,在vba数组中执行这样的操作比在工作表上执行要快得多

一些有限的测试表明,至少在有限的数据集上,循环加法的执行速度比使用SUM工作表函数更快。是否会 只有通过测试才能解决实际数据的问题

我建议如下,您需要添加代码以打开工作簿,并更改相应工作表的代码设置 -


您的代码中有几个问题:


将两个单独的单元格传递给求和,而不是一个范围。 您创建了一个With块,然后不使用它, 使用Select/ActiveCell既不必要也不可取 使用整数而不是long


将两个单独的单元格传递给求和,而不是一个范围。还有几点:创建With块后不使用它,使用Select/ActiveCell既不必要也不需要desirable@chrisneilsen,我尝试在不使用Select和ActiveCell的情况下运行代码,只使用Cellslastrow+1、thiscol.Value=WorksheetFunction.SumRangeCells1、ActiveCell.Column和ActiveCell,但它无法运行。“你能告诉我我做错了什么吗?”克里夫对汉克斯补充道!这很有效。我一直在与“.Cells”语法作斗争。VS Express不会给我足够的提示。我还陷入了为未定义变量生成属性/方法存根的问题中,最终我解决了这个问题。在这里,我的代码中总是有一个WITH块,但有一次,我试着定义所有的东西,看看会有什么效果,但一旦不起作用,就忘了清理。A1 Excel参考样式有很多帮助;对于.cell语法来说并不是太多。我确信这只是因为我对代码应该如何工作,尤其是对于,了解得不够,但是当我运行它时,它会停在第二行lastrow=,需要运行时错误“424”对象。我还注意到,在调试时,“局部变量”窗口将xlSheet1和xlApp显示为变量,类型为Variant。我使用的是Excel 2010,我的数据在第一个选项卡上,因此我将xlWsheet2更改为xlWsheet1,如果这有区别的话。@Clif不太适合劫持其他人的Q,但请注意,这被标记为vb.net,而不是vba。如果在vba中执行此操作,某些细节将有所不同,但总体流程是相同的。听起来您需要向模块中添加显式选项,以强制声明所有变量@克里斯·内尔森,我道歉。
    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
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
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