O Seu problema está em declarar os valores o Val não é o indicado apra operação matemáticas, veja as conversões indicadas.
Lembrando que todos textbox são tratados como texto
CCur -> Converte para Moeda Corrente ex: CCur( "153.20") ' resultado 153,2
CDbl -> Converte para Double ex: CDbl("153.20") 'Resultado 153,2
CInt -> Converte para valores inteiros ex: CInt("153.20") 'resultado 153
o ideal mesmo é você declarar variaveis para assumirem os valores dos textbox, EX:
Public Function Calcula()
Dim Total As Currency, Quant As Integer, VUnit As Currency
If Txt_Quantidade.Text <> "" Then
Quant = Txt_Quantidade.Text
VUnit = Txt_ValorUnidade.Text
Total = Quant * VUnit
Txt_subTotal.Text = Total
End If
End Function
Public Sub Soma()
Dim Total As Currency, SubTotal As Currency
If Txt_subTotal.Text <> "" And Txt_ValorTotal.Text = "" Then
Txt_ValorTotal.Text = Txt_subTotal.Text
ElseIf Txt_ValorTotal.Text <> "" Then
SubTotal = Txt_subTotal.Text
Total = Txt_ValorTotal.Text
Total = Total + SubTotal
Txt_subTotal.Text = ""
End If
Da forma descrita acima o Calculo será feito sem problemas, e o entendimento da expressão matemática torna-se mais fácil.
Repare que declarei Quant como inteiro, pois deduzo que as quantidades serão ex: 1, 2, 3, 4, ...
Se você for usar valores fracionados (ex: 1.23, 3.45, 6.57,...) você deverá declara-la como Double.
Espero ter ajudado até o momento.
Ah só para exclarecer, quando você utiliza Val ele retorna somente os primeiros valores numéricos de uma cadeia de caracteres.
exemplo:
Val("153,20") 'retorna 153
Val("289A5F78") 'retorna 289 e ignora os demais caracteres
até