Posts by roy__lam

    Hi Bro, I have a code below which can count number of cell based on cell background color even in merged cells:


    Function ColorBlocks(SearchRange As range, ColorRange As range, Optional Sum As Boolean = False) As Double
    Dim cell As range, blocks As range
    If Sum Then
    Set blocks = SearchRange(1).MergeArea(1) ' prime union method (which requires >1 value)
    For Each cell In SearchRange
    If cell.Interior.Color = ColorRange.Interior.Color Then Set blocks = Union(blocks, cell.MergeArea(1))
    Next
    If SearchRange(1).Interior.Color <> ColorRange.Interior.Color Then
    ColorBlocks = WorksheetFunction.Sum(blocks) - SearchRange(1).MergeArea(1).Value
    Else
    ColorBlocks = WorksheetFunction.Sum(blocks)
    End If
    Else
    Set blocks = SearchRange(1).MergeArea(1) ' prime union method (which requires >1 value)
    For Each cell In SearchRange
    If cell.Interior.Color = ColorRange.Interior.Color Then Set blocks = Union(blocks, cell.MergeArea(1))
    Next
    ColorBlocks = blocks.Count + (SearchRange(1).Interior.Color <> ColorRange.Interior.Color)
    End If
    End Function



    then I modify the code to let it counting colored cell AND matching cell value as follows:



    Function ColorBlocks(SearchRange As range, ColorRange As range, Optional Sum As Boolean = False) As Double
    Dim cell As range, blocks As range
    If Sum Then
    Set blocks = SearchRange(1).MergeArea(1) ' prime union method (which requires >1 value)
    For Each cell In SearchRange
    If cell.Interior.Color = ColorRange.Interior.Color And cell.Value = ColorRange.Value Then Set blocks = Union(blocks, cell.MergeArea(1))
    Next
    If SearchRange(1).Interior.Color <> ColorRange.Interior.Color Then
    ColorBlocks = WorksheetFunction.Sum(blocks) - SearchRange(1).MergeArea(1).Value
    Else
    ColorBlocks = WorksheetFunction.Sum(blocks)
    End If
    Else
    Set blocks = SearchRange(1).MergeArea(1) ' prime union method (which requires >1 value)
    For Each cell In SearchRange
    If cell.Interior.Color = ColorRange.Interior.Color And cell.Value = ColorRange.Value Then Set blocks = Union(blocks, cell.MergeArea(1))
    Next
    ColorBlocks = blocks.Count + (SearchRange(1).Interior.Color <> ColorRange.Interior.Color)
    End If
    End Function


    But the retured result was 1 more than actual, so please help to fix it.