Question

I wish to categorize my transactions in a way where I can alter the categories on the fly. I think it's easier explained by showing what I have.

I have the following tables

Transactions

  • A: Date
  • C: Name
  • D: Amount

Fast Food List:

  • L: Name (partial name since going to be doing string search)

I wish to sum the transaction amount based on multiple criteria, such as date and category. Here's a formula that works:

=SUMIFS(D:D,A:A,"*03/2013*",C:C,"*"&L3&"*")

There's one fundamental problem: it only supports ONE item from the Fast Food List. Is there any way I can simply do a text stringth search across the entire Fast Food names? ""&L3&"" to ""&L:L&"" or something?


Here are some things I've tried.

1) Modify the SUMIFS criteria ""&L3&"" with a boolean UDF. The issue I run into here is that I can't figure out how to pass the current Row being looped by SUMIF into the function.

Public Function checkRange(Check As String, R As Range) As Boolean

For Each MyCell In R
   If InStr(Check, MyCell.Value) > 0 Then
        checkRange = True
    End If
Next MyCell

End Function

If I could send Check to this function, well I would be set.

2) Replace the sum_range of the SUMIFS with a UDF that returns the range of rows

Public Function pruneRange(Prune_range As Range, Criteria_range As Range) As Range
Dim Out_R As Range
Dim Str As String

ActiveWorkbook.Sheets("Vancity Trans").Activate
' Loop through the prune_range to make sure it belongs
For Each Cell In Prune_range

    ' loop through criteria to see if it matches current Cell
    For Each MyCell In Criteria_range
        If InStr(Cell.Value, MyCell.Value) > 0 Then
            ' Now append cell to Out_r and exit this foreach
               ' Str = Str & Cell.Address() & ","
               Str = Str & "D" & Cell.Row() & ","
            Exit For
        End If
    Next MyCell
Next Cell

' remove last comma form str
Str = Left(Str, Len(Str) - 1)

' use str to set the range
Set Out_R = Range(Str)

' MsgBox (Str)

Set pruneRange = Out_R

End Function

This works for a regular SUM loop, but for some reason it returns #Value when I try using it in a SUMIF or SUMIFS. Another issue is that even in the SUM loop if use C:C instead of C1:CX where X is however many rows, it crashes excel or takes forever to loop through. I'm guessing it's because excel doesn't know when to stop in a UDF unless I somehow tell it to?

Was it helpful?

Solution

Try this formula

=SUMPRODUCT(SUMIFS(D:D,A:A,"*03/2013*",C:C,"*"&L3:L30&"*"))

By using a range (L3:L30) for the final criterion the SUMIFS formula will generate an "array" (of 28 values - one for each value in L3:L30) ...and SUMPRODUCT is used to sum that array and get the result you want

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top