【问题标题】:How to use Sumif within array?如何在数组中使用 Sumif?
【发布时间】:2021-01-31 15:53:19
【问题描述】:

我正在尝试对数组中的数字求和。

我收到了附加的错误消息。

在数组中使用 Sumif 的语法是什么?

Sub SumNumbers()

    Dim arr As Variant
    arr = Range("A1").CurrentRegion.Value
    Dim iMax As Long
    iMax = UBound(arr, 1)
    
    Debug.Print WorksheetFunction.SumIf(Range(arr(1, 1), arr(iMax, 1)), "A", Range(arr(1, 2), arr(iMax, 2)))
    
End Sub

【问题讨论】:

  • 您无法从数组值中构建范围!你知道数组到底是什么吗?您是否将范围命名为数组?
  • 清除!谢谢你:)

标签: arrays excel vba sumifs


【解决方案1】:

SumIf 函数适用于范围...至少它的第一个参数必须是范围。

请尝试下一个代码:

Sub testSumif()
 Dim sh As Worksheet, rngB As Range, rngC As Range, lastRow As Long

 Set sh = ActiveSheet 'use here the sheet you need
 lastRow = sh.Range("B" & sh.Rows.count).End(xlUp).row
 Set rngB = sh.Range("B2:B" & lastRow)
 Set rngC = sh.Range("C2:C" & lastRow)

 Debug.Print WorksheetFunction.SumIf(rngB, "A", rngC)
End Sub

如果您坚持使用CurrentRegion,请尝试下一个代码:

Sub testSumifBis()
 Dim sh As Worksheet, rng As Range, rngB As Range, rngC As Range

 Set sh = ActiveSheet 'use here the sheet you need

 Set rng = sh.Range("B2").CurrentRegion
 Set rngB = rng.Columns(1)
 Set rngC = rng.Columns(2)

 Debug.Print WorksheetFunction.SumIf(rngB, "A", rngC)
End Sub

【讨论】:

    【解决方案2】:

    Sumif vs Loop vs Match'n'Loop

    • 我会使用第一个解决方案。

    守则

    Option Explicit
    
    Sub sumIfRange()
        
        Dim rg As Range
        ' Define Current Region range.
        Set rg = Range("A1").CurrentRegion
        ' Only use data from 'A2' to 'Bwhatever' (no headers).
        Set rg = rg.Resize(rg.Rows.Count - 1).Offset(1)
        
        Dim Result As Double
        Result = Application.SumIf(rg.Columns(1), "A", rg.Columns(2))
        
        Debug.Print Result
        
    End Sub
    
    Sub sumIfLoop()
        
        Dim rg As Range
        ' Define Current Region range.
        Set rg = Range("A1").CurrentRegion
        ' Only use data from 'A2' to 'Bwhatever' (no headers).
        Set rg = rg.Resize(rg.Rows.Count - 1).Offset(1)
        ' Only now write to array.
        Dim Data As Variant: Data = rg.Resize(, 2).Value
        
        Dim Result As Double
        Dim i As Long
        Dim j As Long
        
        For i = 1 To UBound(Data, 1)
            If Not IsError(Data(i, 1)) Then
                If Data(i, 1) = "A" Then
                    If IsNumeric(Data(i, 2)) Then
                        Result = Result + Data(i, 2)
                    End If
                End If
            End If
        Next i
        
        Debug.Print Result
        
    End Sub
    
    Sub sumIfMatchLoop()
        
        Dim rg As Range
        ' Define Current Region range.
        Set rg = Range("A1").CurrentRegion
        ' Only use data from 'A2' to 'Bwhatever' (no headers).
        Set rg = rg.Resize(rg.Rows.Count - 1).Offset(1)
        ' Only now write to arrays.
        Dim lData As Variant: lData = rg.Columns(1).Value
        Dim rData As Variant: rData = rg.Columns(2).Value
        
        Dim mData As Variant: mData = Application.Match(lData, Array("A"), 0)
        Erase lData
        
        Dim Result As Double
        Dim i As Long
        
        For i = 1 To UBound(mData)
            If IsNumeric(mData(i, 1)) Then
                Result = Result + rData(i, 1)
            End If
        Next i
        
        Debug.Print Result
        
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-14
      • 2016-11-26
      • 1970-01-01
      • 1970-01-01
      • 2020-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多