I'm just a novice (and self taught).
Captions and TextBoxs contain only Strings. Math requires numbers.
Convert numerical Strings into Numbers with CLng, CDbl, CCur, and a few others. Generally, CDble will work in most cases where an Integer or "long integer" is not required.
Personally, I would add an additional step, that recorded, multiplied, and summed all Numerical values before formatting and applying those values to any String valued Controls, Probably with an array.
Something similar to
Dim SalesDetails
Const Q as Long = 2 'Makes code easier to comprehend.
Const P As Long = 1
Private Sub UserForm_Initialize()
Redim Sales Details(1 to 8, 1 to 2)
End Sub
Private Sub Qty1_Change()
Dim LngTotalValue As Variant 'Result of your one line declaration
Dim P1 as Variant
DimP2 As Double
With Me 'Me is the UserForm, in this case
If .Qty1.Text = "" Then
.Controls("TotalPrice1").Caption = ""
Else
SalesDetails(1, P) = CDble((.PurPrice1) 'Not sure of this syntax, and not going to investigate
SalesDetails(1, Q) = CDble(.Qty1)
.TotalPrice1.Caption = Format(SalesDetails(1, P) * SalesDetails(1, Q), "#,###.##")
Etc
etc
etc
Private Sub Qty2_Change()
'Use 2 vice 1 in this sub
SalesDetails(2, P) = CDble((.PurPrice2)
SalesDetails(2, Q) = CDble(.Qty2)
.TotalPrice2.Caption = Format(SalesDetails(2, P) * SalesDetails(2, Q), "#,###.##")
Etc
etc
etc
For 1 = 1 to 8
TotalValue = TotalValue + SalesDetails(i, P) * SalesDetails(i, Q)
Next