Если бы вместо строки
while sum <> 0
было бы более строгое условие
while sum > 0
то зависания не было бы (но не уверен, что ответ всегда был бы правильным), а так
sum
может стать отрицательной из-за того, что сразу после ввода она является строкой и, вероятно, в условии
if item <= sum then
сравниваются строки, а не числа. Чтобы этого не происходило сразу явно преобразуйте введённое значение к целочисленному типу:
sum = CInt( InputBox("Введите желаемую сумму (до ...):") )
Но в целом можно попрощеsum = CInt(InputBox("Введите желаемую сумму (до ...):"))
conv = 1
str = ""
while conv <= sum
if sum and conv then str = conv & " " & str
conv = conv * 2
wend
MsgBox Trim(str)