VBA对另一工作簿中的每列求和

VBA对另一工作簿中的每列求和,vba,excel,Vba,Excel,你好, 我想对另一个工作簿中的每一列求和(参见示例) 我做了下面的代码: Function sumrange(rng As Range) Summ = 1 For Each cell In rng Do While cell <> "" Summ = Summ + cell.Value Loop Next sumrange = Summ End Function sub test() x = sumrange(Workbook

你好,

我想对另一个工作簿中的每一列求和(参见示例)

我做了下面的代码:

Function sumrange(rng As Range)
    Summ = 1
    For Each cell In rng
    Do While cell <> ""
    Summ = Summ + cell.Value
    Loop
    Next
    sumrange = Summ
End Function

sub test()
x = sumrange(Workbooks("Clients").Worksheets("Numbers").Range("A:A"))
thisworkbook.worksheets("Result").cells(1,1)=x
MsgBox x
end sub
功能范围(rng As范围)
总和=1
对于rng中的每个单元
在单元格“”中执行此操作
总和=总和+单元格值
环
下一个
sumrange=sum
端函数
子测试()
x=sumrange(工作手册(“客户”)。工作表(“数字”)。范围(“A:A”))
此工作簿。工作表(“结果”)。单元格(1,1)=x
MsgBox x
端接头

但是我不知道如何循环遍历每一列(将有两列以上),它会阻塞,因为第一个单元格包含一个字符串:error,我如何定义它应该从第二个单元格开始到结束?

您可以使用
IsNumeric
函数来决定是否将单元格的值添加到总和:

Function SumRange(rng As Range)
    Dim dblSum As Double
    Dim rngCell As Range

    For Each rngCell In rng
        If VBA.IsNumeric(rngCell.Value) Then
            dblSum = dblSum + CDbl(rngCell.Value)
        End If
    Next rngCell

    SumRange = dblSum

End Function
如果您迭代列
A
中的所有单元格,并且只有少数条目,那么这可能会非常慢。以下增强功能还检查单元格
是否为空,如果是空的,则退出循环-否则,空单元格的计算结果可能为零:

Function SumRange(rng As Range)
    Dim dblSum As Double
    Dim rngCell As Range

    For Each rngCell In rng
        If VBA.IsEmpty(rngCell.Value) Then
            Exit For
        ElseIf VBA.IsNumeric(rngCell.Value) Then
            dblSum = dblSum + CDbl(rngCell.Value)
        End If
    Next rngCell

    SumRange = dblSum

End Function

您可以使用
IsNumeric
函数来决定是否将单元格的值添加到总和:

Function SumRange(rng As Range)
    Dim dblSum As Double
    Dim rngCell As Range

    For Each rngCell In rng
        If VBA.IsNumeric(rngCell.Value) Then
            dblSum = dblSum + CDbl(rngCell.Value)
        End If
    Next rngCell

    SumRange = dblSum

End Function
如果您迭代列
A
中的所有单元格,并且只有少数条目,那么这可能会非常慢。以下增强功能还检查单元格
是否为空,如果是空的,则退出循环-否则,空单元格的计算结果可能为零:

Function SumRange(rng As Range)
    Dim dblSum As Double
    Dim rngCell As Range

    For Each rngCell In rng
        If VBA.IsEmpty(rngCell.Value) Then
            Exit For
        ElseIf VBA.IsNumeric(rngCell.Value) Then
            dblSum = dblSum + CDbl(rngCell.Value)
        End If
    Next rngCell

    SumRange = dblSum

End Function

从第二个单元格开始,在函数中指定列,并按如下方式调用

Function sumrange(rng As Range, c as integer) 
dim summ as integer  
dim I as integer  
dim cell as integer  
Summ = 1  
'Wouldn't you want to start at 0 for your sum?
for i = 2 to 50,000  
cell = rng.cells(i,c)  

Summ = Summ + cell  

Next  
sumrange = Summ  
End Function  

sub test()  
x = sumrange(Workbooks("Clients").Worksheets("Numbers").Range("A:A"),'column#')  
thisworkbook.worksheets("Result").cells(1,1)=x  
MsgBox x  
end sub  

从第二个单元格开始,在函数中指定列,并按如下方式调用

Function sumrange(rng As Range, c as integer) 
dim summ as integer  
dim I as integer  
dim cell as integer  
Summ = 1  
'Wouldn't you want to start at 0 for your sum?
for i = 2 to 50,000  
cell = rng.cells(i,c)  

Summ = Summ + cell  

Next  
sumrange = Summ  
End Function  

sub test()  
x = sumrange(Workbooks("Clients").Worksheets("Numbers").Range("A:A"),'column#')  
thisworkbook.worksheets("Result").cells(1,1)=x  
MsgBox x  
end sub  

您可以使用内置的sum函数在不循环的情况下对范围求和

例如:

Sub test()
  Dim LastRow As Long
 'open the other workbook , clients
 Set book = Workbooks.Open("clients.xlsx")
 'get last raw starting from B2 down to the last filled cell
 LastRow = book.Worksheets("Numbers").Range("B2").End(xlDown).Row

 Debug.Print LastRow
 Set range2 = book.Worksheets("sheet1").Range("B1:B" & LastRow)
 sum1 = Application.WorksheetFunction.Sum(range2)
 Debug.Print sum1
'write result to active sheet
 ThisWorkbook.Worksheets("result").Cells(1, 1) = sum1
End Sub

您可以使用内置的sum函数在不循环的情况下对范围求和

例如:

Sub test()
  Dim LastRow As Long
 'open the other workbook , clients
 Set book = Workbooks.Open("clients.xlsx")
 'get last raw starting from B2 down to the last filled cell
 LastRow = book.Worksheets("Numbers").Range("B2").End(xlDown).Row

 Debug.Print LastRow
 Set range2 = book.Worksheets("sheet1").Range("B1:B" & LastRow)
 sum1 = Application.WorksheetFunction.Sum(range2)
 Debug.Print sum1
'write result to active sheet
 ThisWorkbook.Worksheets("result").Cells(1, 1) = sum1
End Sub

使用
SpecialCells
对象的
Range
方法仅对数字求和

如果数字仅为“常量”(例如:非公式推导),则使用:

Function sumrange(rng As Range) As Double
    sumrange = WorksheetFunction.Sum(rng.SpecialCells(xlCellTypeConstants, xlNumbers))
End Function
Function sumrange(rng As Range) As Double
    sumrange = WorksheetFunction.Sum(rng.SpecialCells(xlCellTypeFormulas, xlNumbers))
End Function
Function sumrange(rng As Range) As Double
    On Error Resume Next
    sumrange = WorksheetFunction.Sum(rng.SpecialCells(xlCellTypeFormulas, xlNumbers))
    sumrange = sumrange + WorksheetFunction.Sum(rng.SpecialCells(xlCellTypeConstants, xlNumbers))
End Function
如果数字仅来自公式,则使用:

Function sumrange(rng As Range) As Double
    sumrange = WorksheetFunction.Sum(rng.SpecialCells(xlCellTypeConstants, xlNumbers))
End Function
Function sumrange(rng As Range) As Double
    sumrange = WorksheetFunction.Sum(rng.SpecialCells(xlCellTypeFormulas, xlNumbers))
End Function
Function sumrange(rng As Range) As Double
    On Error Resume Next
    sumrange = WorksheetFunction.Sum(rng.SpecialCells(xlCellTypeFormulas, xlNumbers))
    sumrange = sumrange + WorksheetFunction.Sum(rng.SpecialCells(xlCellTypeConstants, xlNumbers))
End Function
最后,数字可以是常数,也可以来自公式,然后使用:

Function sumrange(rng As Range) As Double
    sumrange = WorksheetFunction.Sum(rng.SpecialCells(xlCellTypeConstants, xlNumbers))
End Function
Function sumrange(rng As Range) As Double
    sumrange = WorksheetFunction.Sum(rng.SpecialCells(xlCellTypeFormulas, xlNumbers))
End Function
Function sumrange(rng As Range) As Double
    On Error Resume Next
    sumrange = WorksheetFunction.Sum(rng.SpecialCells(xlCellTypeFormulas, xlNumbers))
    sumrange = sumrange + WorksheetFunction.Sum(rng.SpecialCells(xlCellTypeConstants, xlNumbers))
End Function

使用
SpecialCells
对象的
Range
方法仅对数字求和

如果数字仅为“常量”(例如:非公式推导),则使用:

Function sumrange(rng As Range) As Double
    sumrange = WorksheetFunction.Sum(rng.SpecialCells(xlCellTypeConstants, xlNumbers))
End Function
Function sumrange(rng As Range) As Double
    sumrange = WorksheetFunction.Sum(rng.SpecialCells(xlCellTypeFormulas, xlNumbers))
End Function
Function sumrange(rng As Range) As Double
    On Error Resume Next
    sumrange = WorksheetFunction.Sum(rng.SpecialCells(xlCellTypeFormulas, xlNumbers))
    sumrange = sumrange + WorksheetFunction.Sum(rng.SpecialCells(xlCellTypeConstants, xlNumbers))
End Function
如果数字仅来自公式,则使用:

Function sumrange(rng As Range) As Double
    sumrange = WorksheetFunction.Sum(rng.SpecialCells(xlCellTypeConstants, xlNumbers))
End Function
Function sumrange(rng As Range) As Double
    sumrange = WorksheetFunction.Sum(rng.SpecialCells(xlCellTypeFormulas, xlNumbers))
End Function
Function sumrange(rng As Range) As Double
    On Error Resume Next
    sumrange = WorksheetFunction.Sum(rng.SpecialCells(xlCellTypeFormulas, xlNumbers))
    sumrange = sumrange + WorksheetFunction.Sum(rng.SpecialCells(xlCellTypeConstants, xlNumbers))
End Function
最后,数字可以是常数,也可以来自公式,然后使用:

Function sumrange(rng As Range) As Double
    sumrange = WorksheetFunction.Sum(rng.SpecialCells(xlCellTypeConstants, xlNumbers))
End Function
Function sumrange(rng As Range) As Double
    sumrange = WorksheetFunction.Sum(rng.SpecialCells(xlCellTypeFormulas, xlNumbers))
End Function
Function sumrange(rng As Range) As Double
    On Error Resume Next
    sumrange = WorksheetFunction.Sum(rng.SpecialCells(xlCellTypeFormulas, xlNumbers))
    sumrange = sumrange + WorksheetFunction.Sum(rng.SpecialCells(xlCellTypeConstants, xlNumbers))
End Function

在这种情况下,如何在sub中调用它?因为ig i put Range(“A:A”)它从a2开始就不起作用,你可以将它与
Range(“A:A”)
一起使用,因为它将跳过标题(以及任何其他非数字单元格值),因为
IsNumeric
测试。它必须转到下一行,不要退出循环,否则它只会给我0。我如何定义它呢?第一个函数的执行确实花费了很多时间。第二个解决方案是正确的,但空的条件应转到下一个单元格,而不是退出VBA。第二个示例仅退出空单元格的循环。它不会退出标题上的循环,例如
错误
。你试过了吗?在这种情况下,我怎么能在潜艇里叫它?因为ig i put Range(“A:A”)它从a2开始就不起作用,你可以将它与
Range(“A:A”)
一起使用,因为它将跳过标题(以及任何其他非数字单元格值),因为
IsNumeric
测试。它必须转到下一行,不要退出循环,否则它只会给我0。我如何定义它呢?第一个函数的执行确实花费了很多时间。第二个解决方案是正确的,但空的条件应转到下一个单元格,而不是退出VBA。第二个示例仅退出空单元格的循环。它不会退出标题上的循环,例如
错误
。你试过了吗?@JeanLo你试过这个吗?@JeanLo:你能把feedbakcs给那些想要帮助的人真是太好了you@JeanLo你试过这个吗?@JeanLo:你能把feedbakcs给那些试图帮助你的人真是太好了