Home |
Search |
Today's Posts |
#1
![]()
Posted to microsoft.public.excel.worksheet.functions
|
|||
|
|||
![]()
Further to a post yesterday looking at Countif3d, I am now trying to use a
similar UDF for SumProduct 3d, but I keep getting the #Value! I found the macro on: http://www.dailydoseofexcel.com/arch...ned-functions/ (it has been modified a bit from the website based on a suggestion from the forum yesterday - which worked perfectly for countif3d) What am I doing wrong? Thank you in advance The formula I enter is: =SumProduct3D2(("'Blank 1:Blank 2'!A9:A10"=A45)*("'Blank 1:Blank 2'!J9:J10"="x")) The macro for the function is: Function SumProduct3D2(sRng1 As String, sRng2 As String) _ As Variant Dim vaRng1 As Variant, vaRng2 As Variant Dim rTemp As Range Dim i As Long Dim Sum As Double Dim rCell As Range Application.Volatile vaRng1 = Parse3DRange2(Application.Caller.Parent.Parent, sRng1) vaRng2 = Parse3DRange2(Application.Caller.Parent.Parent, sRng2) For i = LBound(vaRng1) To UBound(vaRng1) Sum = Sum + (vaRng1(i).Value * vaRng2(i).Value) Next i SumProduct3D2 = Sum End Function Function Parse3DRange2(wb As Workbook, _ SheetsAndRange As String) As Variant Dim sTemp As String Dim i As Long, j As Long Dim Sheet1 As String, Sheet2 As String Dim aRange() As Range Dim sRange As String Dim lFirstSht As Long, lLastSht As Long Dim rCell As Range Dim rTemp As Range On Error GoTo Parse3DRangeError sTemp = SheetsAndRange 'if it's 3d, rtemp will be nothing On Error Resume Next Set rTemp = Range(sTemp) On Error GoTo Parse3DRangeError 'if it's 3d, parse it If rTemp Is Nothing Then i = InStr(sTemp, "!") If i = 0 Then Err.Raise 9999 'next line will generate an error if range is invalid 'if it's OK, it will be converted to absolute form sRange = Range(Mid$(sTemp, i + 1)).Address sTemp = Left$(sTemp, i - 1) i = InStr(sTemp, ":") Sheet2 = Replace(Trim(Mid$(sTemp, i + 1)), "'", "") If i 0 Then Sheet1 = Replace(Trim(Left$(sTemp, i - 1)), "'", "") Else Sheet1 = Sheet2 End If 'next lines will generate errors if sheet names are invalid With wb lFirstSht = .Worksheets(Sheet1).Index lLastSht = .Worksheets(Sheet2).Index 'swap if out of order If lFirstSht lLastSht Then i = lFirstSht lFirstSht = lLastSht lLastSht = i End If 'load each cell into an array j = 0 For i = lFirstSht To lLastSht For Each rCell In .Sheets(i).Range(sRange) ReDim Preserve aRange(0 To j) Set aRange(j) = rCell j = j + 1 Next rCell Next i End With Parse3DRange2 = aRange Else 'range isn't 3d, so just load each cell into array For Each rCell In rTemp.Cells ReDim Preserve aRange(0 To j) Set aRange(j) = rCell j = j + 1 Next rCell Parse3DRange2 = aRange End If Parse3DRangeError: On Error GoTo 0 Exit Function End Function 'Parse3DRange |
Thread Tools | Search this Thread |
Display Modes | |
|
|
![]() |
||||
Thread | Forum | |||
Conditional SUMPRODUCT or SUMPRODUCT with Filters | Excel Worksheet Functions | |||
sumproduct contains | Excel Worksheet Functions | |||
SumProduct | Excel Discussion (Misc queries) | |||
sumproduct? sumif(sumproduct)? | Excel Worksheet Functions | |||
sumproduct help | Excel Worksheet Functions |