Explanation
This formula uses two expressions in a single array inside the SUMPRODUCT function.
The first expression tests every holiday date to see if it's greater than or equal to the start date in F5:
(B4:B12>=F5)
This returns an array of TRUE/FALSE values like this:
{FALSE;FALSE;FALSE;FALSE;TRUE;TRUE;TRUE;TRUE;TRUE}
The second expression tests every holiday date to see if it's less than or equal to the end date in F6:
(B4:B12<=F6)
which returns an array of TRUE/FALSE values like this:
{TRUE;TRUE;TRUE;TRUE;TRUE;TRUE;TRUE;TRUE;FALSE}
The multiplication of these two arrays automatically coerces the TRUE/FALSE values to ones and zeros, resulting in arrays that look like this:
=SUMPRODUCT(({0;0;0;0;1;1;1;1;1})*({1;1;1;1;1;1;1;1;0}))
After multiplication, we have just one array like this:
=SUMPRODUCT({0;0;0;0;1;1;1;1;0})
Finally, SUMPRODUCT sums the items in the array and returns 4.
Holidays on weekdays only
To count holidays that occur on weekdays only (Mon-Fri), you can extend the formula like this:
=SUMPRODUCT((rng>=F5)*(rng<=F6)*(WEEKDAY(rng,2)<6))
where rng is a range containing holiday dates.