excel vba - VBA UDF ParamArray Sequence -
i want create function sumifs, i'm having hard time figuring our how handle paramarray portion. i'm looking solution allows same range1,criteria1,range2,criteria2,...,rangen,criterian sum ifs in "sumifscontains" function. i've attached code singular case, "sumifcontains" can see starting point:
function sumifcontains(phraserange range, criteria string, sumrange range) dim element range elementcount = 0 each element in phraserange elementcount = elementcount + 1 next element dim sumarray: redim sumarray(1 3, 1 elementcount) elementcount = 0 each element in sumrange elementcount = elementcount + 1 sumarray(2, elementcount) = element next element elementcount = 0 each element in phraserange elementcount = elementcount + 1 sumarray(1, elementcount) = element if instring(cstr(element), criteria) sumarray(3, elementcount) = sumarray(2, elementcount) else sumarray(3, elementcount) = 0 end if next element sumifcontains = 0 item = 1 elementcount sumifcontains = sumifcontains + cdbl(sumarray(3, item)) next item end function before got answer last night came working option follows:
function sumifscontains(sumrange range, paramarray criteria() variant) dim element range dim ccriteria string dim phraserange range 'exit function dim phraserangearray(): redim phraserangearray(lbound(criteria()) (((ubound(criteria()) + 1) / 2) - 1)) dim criteriaarray(): redim criteriaarray(lbound(criteria()) (((ubound(criteria()) + 1) / 2) - 1)) currentpair = 0 = lbound(criteria()) ubound(criteria()) if mod 2 = 0 phraserangearray(currentpair) = criteria(i) else criteriaarray(currentpair) = criteria(i) currentpair = currentpair + 1 end if next elementcount = ubound(phraserangearray(0)) dim sumrng: redim sumrng(1 elementcount) = 1 each element in sumrange sumrng(i) = element = + 1 next element dim sumarray: redim sumarray(0 2 + ubound(phraserangearray), 1 elementcount) = 1 elementcount sumarray(1, i) = sumrng(i) rc = 2 2 + ubound(phraserangearray) if instring(cstr(phraserangearray(rc - 2)(i, 1)), cstr(criteriaarray(rc - 2))) sumarray(rc, i) = 1 else sumarray(rc, i) = 0 end if next rc sumarray(0, i) = sumarray(1, i) mult = 2 2 + ubound(phraserangearray) sumarray(0, i) = sumarray(0, i) * sumarray(mult, i) next mult next sumifscontains = 0 item = 1 elementcount sumifscontains = sumifscontains + cdbl(sumarray(0, item)) next item end function but i'm still curious how make range/criteria pair not parced out of "criteria" array later.
if understand correctly you're trying do, need iterate on paramarray step 2. add test make sure passed parameters come in pairs, grab them set of criteria , sumrange in loop:
public function pairedparamarrayie(phraserange range, paramarray values()) dim counter integer dim criteria string dim sumrange range if ubound(values) mod 2 <> 1 err.raise -1, vbnullstring, "invalid paramarray" end if counter = lbound(values) + 1 ubound(values) step 2 criteria = values(counter - 1) set sumrange = values(counter) debug.print criteria debug.print sumrange.addresslocal next counter end function 
Comments
Post a Comment