In early February Sujit asked a question at Chandoo.org, original post.
I require a formula stating criteria [0%-25% output will be 0, 26%-50% output will be 0.1, 51%-75% output will be 0.2, 76%-100% output will be 0.3 & 100% + output will be 0.4]
Kyle, responded with a neat Sumproduct formula
=SUMPRODUCT((B3>{0.25,0.5,0.75,1})*0.1)
I think it is so neat that it is worthy of sharing and detailing here at Formula Forensics:
So today we will pull Kyle’s answer apart to see what’s inside.
Kyle’s Formula
As usual we will work through this formula using a sample file for you to follow along. Download Here.
Kyle’s formula is a Sumproduct based formula
=SUMPRODUCT((B3>{0.25,0.5,0.75,1})*0.1)
Lets look at cell C3 as our example.
;
In C3 we see the formula: =SUMPRODUCT((B3>{0.25,0.5,0.75,1})*0.1)
Which consists of a Sumproduct function and a formula inside the sumproduct.
We know from Formula Forensics 007 that Sumproduct, Sums the Product of the Arrays, and that when there is only 1 array it simply sums the array elements.
In this case the Sumproduct only has a single array as an element
=SUMPRODUCT((B3>{0.25,0.5,0.75,1})*0.1)
and so the (B3>{0.25,0.5,0.75,1})*0.1 component must return an Array of elements for the Sumproduct to sum.
If we now look at the (B3>{0.25,0.5,0.75,1})*0.1 component.
We can see that it consists of a comparison B3>{0.25,0.5,0.75,1}
The result of the comparison is Multiplied by 0.1.
Sujit’s orginal question asked: 0%-25% output will be 0, 26%-50% output will be 0.1, 51%-75% output will be 0.2, 76%-100% output will be 0.3 & 100% + output will be 0.4
And Kyles formula is using B3>{0.25,0.5,0.75,1} to work out which category the value in B3 belongs to.
We can see this if in a blank cell say C5: we enter the following:
= B3>{0.25,0.5,0.75,1} press F9 not Enter.
Excel will respond with ={TRUE,TRUE,TRUE,FALSE}
This is showing us that the 1st, 2nd and 3rd elements in the formula: B3>{0.25,0.5,0.75,1}, are True
In our example the value in B3 is 80% which is 0.8 which is Greater than 0.25 and Greater than 0.5 and Greater than 0.75, but Not Greater than 1.0.
The next part of Kyle’s formula is (B3>{0.25,0.5,0.75,1})*0.1
In a blank cell say C7: enter the following:
= B3>{0.25,0.5,0.75,1}*0.1 press F9 not Enter.
Excel will respond with ={0.1,0.1,0.1,0}
This is showing us the result of
=(B3>{0.25,0.5,0.75,1})*0.1
={TRUE,TRUE,TRUE,FALSE} *0.1
={0.1,0.1,0.1,0}
Sumproduct now only has to add up the Array
=Sumproduct({0.1,0.1,0.1,0})
Which it does returning 0.3.
The Neat Part
The neat part of this is that Kyle has used the 0.1 Multiplier to Force the array to an array of Numbers for Sumproduct to sum.
Had Kyle used: =SUMPRODUCT((B3>{0.25,0.5,0.75,1}))*0.1
Excel would have returned an answer of 0
This is because as we saw in Formula Forensics 007, Sumproduct doesn’t know what to do with the array of True/False, they need to be converted to numerical equivalents for Sumproduct to operate on.
In a spare cell, say C9, enter: =SUMPRODUCT((B9>{0.25,0.5,0.75,1}))*0.1
Excel will respond with 0
Of course that can be fixed by using a double degative of a 1* inside the formula
In a spare cell, say C10, enter either:
=SUMPRODUCT(1*(B9>{0.25,0.5,0.75,1}))*0.1
or
=SUMPRODUCT(- -(B9>{0.25,0.5,0.75,1}))*0.1
Excel will respond with 0.3 as it should
Except that the formula is longer and now has to do 1 more multiplication.
Download
You can download a copy of the above file and follow along, Download Here.
Formula Forensics “The Series”
You can learn more about how to pull Excel Formulas apart in the following posts
We Need Your Help
I have received a few more ideas since last week and these will feature in coming weeks.
I do need more ideas though and so I need your help.
If you have a neat formula that you would like to share and explain, try putting pen to paper and draft up a Post like above or;
If you have a formula that you would like explained but don’t want to write a post also send it to Chandoo or Hui.

















6 Responses to “Make VBA String Comparisons Case In-sensitive [Quick Tip]”
Another way to test if Target.Value equal a string constant without regard to letter casing is to use the StrCmp function...
If StrComp("yes", Target.Value, vbTextCompare) = 0 Then
' Do something
End If
That's a cool way to compare. i just converted my values to strings and used the above code to compare. worked nicely
Thanks!
In case that option just needs to be used for a single comparison, you could use
If InStr(1, "yes", Target.Value, vbTextCompare) Then
'do something
End If
as well.
Nice tip, thanks! I never even thought to think there might be an easier way.
Regarding Chronology of VB in general, the Option Compare pragma appears at the very beginning of VB, way before classes and objects arrive (with VB6 - around 2000).
Today StrComp() and InStr() function offers a more local way to compare, fully object, thus more consistent with object programming (even if VB is still interpreted).
My only question here is : "what if you want to binary compare locally with re-entering functions or concurrency (with events) ?". This will lead to a real nightmare and probably a big nasty mess to debug.
By the way, congrats for you Millions/month visits 🙂
This is nice article.
I used these examples to help my understanding. Even Instr is similar to Find but it can be case sensitive and also case insensitive.
Hope the examples below help.
Public Sub CaseSensitive2()
If InStr(1, "Look in this string", "look", vbBinaryCompare) = 0 Then
MsgBox "woops, no match"
Else
MsgBox "at least one match"
End If
End Sub
Public Sub CaseSensitive()
If InStr("Look in this string", "look") = 0 Then
MsgBox "woops, no match"
Else
MsgBox "at least one match"
End If
End Sub
Public Sub NotCaseSensitive()
'doing alot of case insensitive searching and whatnot, you can put Option Compare Text
If InStr(1, "Look in this string", "look", vbTextCompare) = 0 Then
MsgBox "woops, no match"
Else
MsgBox "at least one match"
End If
End Sub