Val() всегда! преобразует строку в число. Если в строке не число, то получим 0.
Но есть некоторые особенности преобразования строки к числам с десятичным разделителем. Например,
I) системный разделить - запятая
системный разделитель в строке:
val("0,4") = 0
CDbl("0,4") =0,4
несистемный разделитель в строке:
val("0.4") = 0,4
CDbl("0.4") => Type mismatch
II) системный разделить - точка
системный разделитель в строке:
val("0.4") = 0.4
CDbl("0.4") = 0.4
несистемный разделитель в строке:
val("0,4") = 0
CDbl("0,4") =0.4
Удивительные результаты ))) т.е. по-любому нужно извращаться. Определить разделитель, и в зависимости от этого действовать!
Т.о. в конкретно приведенном вами примере нужно знать, что там вводится и как вводится.
Так например, если при системном разделителе 'запятая' ввести 0.4 и использовать CDbl(), то возникнет ошибка.
А если при любом сист. разделителе ввести 0,4 и использовать Val(), то получим некорректный результат.