Using a UDF within SUMPRODUCT
Gary,
Charles makes the UDF work, but there is still a bug in it, and an
unnecessary lbound of the 2nd dimension.
This addresses both points
Function prime(r As Range) As Variant
pm = Array(1, 2, 3, 5, 7, 11, 13, 17, 19, 23)
Dim v() As Variant
ReDim v(1 To r.Count, 1 To 1)
j = 1
For Each rr In r
x = rr.Value
v(j, 1) = 0
For i = 1 To 10
If x = pm(i - 1) Then
v(j, 1) = 1
End If
Next
j = j + 1
Next
prime = v
End Function
Also, as the array is returning 0 and 1 already, you don't need
=SUMPRODUCT(--(prime(A1:A24)=1))
you can just use
=SUMPRODUCT((prime(A1:A24)=1))
and finally, here is a prime routine you can use, and a mod to your routine
to use it
Function prime(r As Range) As Variant
Dim v() As Variant
ReDim v(1 To r.Count, 1 To 1)
j = 1
For Each rr In r
v(j, 1) = -CLng(IsPrime(rr.Value))
j = j + 1
Next
prime = v
End Function
'-----------------------------------------------------------*------
Function IsPrime(num As Long) As Boolean
'-----------------------------------------------------------*------
Dim i As Long
IsPrime = True
If num = 2 Then
IsPrime = True
ElseIf num Mod 2 = 0 Then
IsPrime = False
Else
For i = 3 To num ^ 0.5 Step 2
If num Mod i = 0 Then
IsPrime = False
End If
Next i
End If
End Function
--
__________________________________
HTH
Bob
"Gary''s Student" wrote in message
...
Thanks you Charles.
I did not realize that the UDF needs to return a 2-D array for SUMPRODUCT
compatibility.
Your modification works just fine!!
--
Gary''s Student - gsnu2007xx
"Charles Williams" wrote:
You need to make v 2 dimensional (ranges are always 2D)
something like this
Option Base 1
Function prime(r As Range) As Variant
pm = Array(1, 2, 3, 5, 7, 11, 13, 17, 19, 23)
Dim v() As Variant
ReDim v(1 To r.Count, 1)
j = 1
For Each rr In r
x = rr.Value
v(j, 1) = 0
For i = 1 To 10
If x = pm(i) Then
v(j, 1) = 1
End If
Next
j = j + 1
Next
prime = v
End Function
regards
Charles
"Gary''s Student" wrote in
message
...
I am trying to use a UDF within a SUMPRODUCT formula, but am having a
problem
getting the UDF to correctly return an array. Simplified data in A1
thru
B24:
23 1
14 2
16 2
9 1
21 2
10 2
20 1
17 3
13 1
15 1
22 3
8 3
2 1
19 1
3 1
1 2
4 2
11 3
6 2
18 2
5 3
7 2
12 1
24 3
I need to count the number of rows in which the value in column A is
prime
and the value in column B is 3. The values in column A are always 25
or
less. My sad attempt at a UDF is:
Function prime(r As Range) As Variant
pm = Array(1, 2, 3, 5, 7, 11, 13, 17, 19, 23)
Dim v() As Variant
ReDim v(1 To r.Count)
j = 1
For Each rr In r
x = rr.Value
v(j) = 0
For i = 0 To 9
If x = pm(i) Then
v(j) = 1
End If
Next
j = j + 1
Next
prime = v
End Function
The function should return a 1 if the argument is prime, otherwise 0.
The function works for single items like:
=prime(A1)
The function also works within SUMPRODUCT like:
=SUMPRODUCT(--(prime(A1:A24)=1))
The function, however, returns #VALUE!
for:
=SUMPRODUCT(--(prime(A1:A24)=1),--(B1:B24=3))
(I usually get this if the sumproduct inputs are of different lengths)
This is not urgent since I can use a helper column until I can get
sumproduct to work.
Thanks in advance for any help.
--
Gary''s Student - gsnu200797
|