Vba 颜色范围之间的和值

Vba 颜色范围之间的和值,vba,excel,Vba,Excel,我试图求两个具有相同内部颜色的单元格之间的值的总和。输出应指向一个单元格。用户的目标是为输出定义起始单元格和单元格,函数应一直运行,直到它更改列或找到具有相同内部函数的单元格为止 这就是我所做的,但每次都会出现#值错误。请注意,我没有在列移动以停止计算时添加规则,我的总和可能是导致错误的原因,但我不确定 Function CountCcolor(range_data As Range, criteria As Range, valx As Range) As Long Dim datax As

我试图求两个具有相同内部颜色的单元格之间的值的总和。输出应指向一个单元格。用户的目标是为输出定义起始单元格和单元格,函数应一直运行,直到它更改列或找到具有相同内部函数的单元格为止

这就是我所做的,但每次都会出现#值错误。请注意,我没有在列移动以停止计算时添加规则,我的总和可能是导致错误的原因,但我不确定

Function CountCcolor(range_data As Range, criteria As Range, valx As Range) As Long

Dim datax As Range
Dim xcolor As Long


xcolor = criteria.Interior.ColorIndex
valx = 0

For Each datax In range_data

    If datax.Interior.ColorIndex = xcolor Then
        Exit For
    End If

    If datax.Interior.ColorIndex <> xcolor Then
        valx = datax.Value

    End If

Next datax

End Function
函数CountCcolor(范围\数据作为范围,标准作为范围,valx作为范围)长度
Dim datax As范围
暗X色和长X色一样
xcolor=criteria.Interior.ColorIndex
valx=0
对于范围_数据中的每个数据x
如果datax.Interior.ColorIndex=xcolor,则
退出
如果结束
如果是datax.Interior.ColorIndex xcolor,则
valx=数据x.值
如果结束
下一个数据
端函数

要获取彩色单元格之间的单元格值之和,可以使用以下方法:

Function CountCcolor(range_data As Range, criteria As Range)
Dim datax As Range, CountVal, x%
For Each datax In range_data
    If datax.Interior.Color = criteria.Interior.Color Then
       x = x + 1
    End If
    If datax.Interior.Color <> criteria.Interior.Color And x = 1 Then
        CountVal = CountVal + datax.Value
    End If
Next datax
CountCcolor = CountVal
End Function
函数CountCcolor(范围\数据作为范围,标准作为范围)
Dim datax作为范围,CountVal,x%
对于范围_数据中的每个数据x
如果datax.Interior.Color=criteria.Interior.Color,则
x=x+1
如果结束
如果datax.Interior.Color criteria.Interior.Color和x=1,则
CountVal=CountVal+datax.Value
如果结束
下一个数据
CountCcolor=CountVal
端函数
输出

要获取彩色单元格之间的单元格计数,可以使用以下方法:

Function CountCcolor(range_data As Range, criteria As Range)
Dim datax As Range, CountVal, x%
For Each datax In range_data
    If datax.Interior.Color = criteria.Interior.Color Then
       x = x + 1
    End If
    If datax.Interior.Color <> criteria.Interior.Color And x = 1 Then
        CountVal = CountVal + 1
    End If
Next datax
CountCcolor = CountVal
End Function
函数CountCcolor(范围\数据作为范围,标准作为范围)
Dim datax作为范围,CountVal,x%
对于范围_数据中的每个数据x
如果datax.Interior.Color=criteria.Interior.Color,则
x=x+1
如果结束
如果datax.Interior.Color criteria.Interior.Color和x=1,则
CountVal=CountVal+1
如果结束
下一个数据
CountCcolor=CountVal
端函数
输出


看起来您没有为函数指定返回值:

例如


我可能误解了您的要求,但我想到的是:



结果:

此功能位于Sheet1模块中:

Option Explicit

Public Sub x()
    With Me
        sumColor .UsedRange, .Range("B8"), .Range("D8")
        sumColor .UsedRange, .Range("B9"), .Range("D9")
        sumColor .UsedRange, .Range("B10"), .Range("D10")
        sumColor .UsedRange, .Range("B11"), .Range("D11")
    End With
End Sub

我已经编辑了你的标题。请看“”,其中的共识是“不,他们不应该”。谢谢@JohnSaunders
Option Explicit

Public Sub sumColor(dataRng As Range, criteriaRng As Range, sumRng As Range)
    Dim xFound As Variant, xData As Range, xColor As Long, sumData As Long, lr As Long
    Dim fr As Long, fc As Long, foundRng As Range, inProgress As Boolean

    xColor = criteriaRng.Interior.ColorIndex
    sumData = 0
    lr = dataRng.Rows.Count
    For Each xData In dataRng   'For Each cell in 2D range, it traverse row by row
        With xData
            If .Interior.ColorIndex = xColor Then   'found first cell
                fr = .Row         'get its row
                fc = .Column      'and col
                sumData = xData.Value2  'capture its value

                With dataRng            'rest of the column bellow first found
                    Set foundRng = .Range(.Cells(fr + 1, fc), .Cells(lr, fc))
                End With

                For Each xFound In foundRng 'iterate to end of column
                    inProgress = xFound.Interior.ColorIndex = xColor
                    If inProgress Then
                        sumData = sumData + xFound.Value2
                    Else
                        Exit For
                    End If
                Next
                If Not inProgress Then Exit For
            End If
        End With
    Next
    sumRng.Value2 = sumData
    If sumData > 0 Then sumRng.Offset(0, 1).Value2 = "(Col " & xData.Column & ")"
End Sub
Option Explicit

Public Sub x()
    With Me
        sumColor .UsedRange, .Range("B8"), .Range("D8")
        sumColor .UsedRange, .Range("B9"), .Range("D9")
        sumColor .UsedRange, .Range("B10"), .Range("D10")
        sumColor .UsedRange, .Range("B11"), .Range("D11")
    End With
End Sub