#excel #vba
#excel #vba
Вопрос:
Этот вопрос задавался ранее, но ответы не помогли.
Я пытаюсь преобразовать textbox.value в пользовательской форме в двойную переменную, используя Cdbl. Я получаю ошибку несоответствия типов.
Я хочу преобразовать его в double, потому что я пытаюсь использовать эти значения для вычисления нескольких значений.
Я нашел код, в котором говорится, что сначала нужно проверить, являются ли значения числовыми, но я не уверен, как это реализовать. Я сохранил его ниже в качестве комментариев.
Private Sub CommandButton10_Click() 'to find the revaluation Gain or loss
Dim Revaluation_surplus As Double
Dim Revaluation_loss As Double
Dim Fair_Value As Double
Dim Carrying_Amount As Double
Revaluation_surplus = CDbl(UserForm1.TextBox9.Value)
Revaluation_loss = CDbl(UserForm1.TextBox10.Value)
Fair_Value = CDbl(UserForm1.TextBox8.Value)
Carrying_Amount = CDbl(UserForm1.TextBox7.Value)
If Fair_Value > Carrying_Amount Then
Revaluation_surplus = (Fair_Value - Carrying_Amount)
ElseIf Fair_Value < Carrying_Amount Then
Revaluation_loss = (Carrying_Amount - Fair_Value)
End If
'If IsNumeric(TextBox9.Value) Then
'Revaluation_surplus = CDbl(UserForm1.TextBox9.Value)
'Else
'Revaluation_surplus = 0
'End If
End Sub
Комментарии:
1. С каким приложением вы работаете? Excel / Access или что-то еще?
2. Привет, GWD — это Excel.
Ответ №1:
Попробуйте
CDbl(Val(UserForm1.TextBox9.Value))
Например
?CDbl(Val(" 1 . 2 ")) '~~> This will give you 1.2
?CDbl(Val(" ")) '~~> This will give you 0
Сказав это, моя рекомендация на самом деле заключалась бы в ограничении ввода в текстовое поле. Сделайте так, чтобы он принимал только числа и десятичную дробь. Таким образом, вам не нужно выполнять какие-либо проверки после ввода. Например
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Select Case KeyAscii
Case vbKey0 To vbKey9, vbKeyBack, vbKeyClear, vbKeyDelete, _
vbKeyLeft, vbKeyRight, vbKeyUp, vbKeyDown, vbKeyTab
If KeyAscii = 46 Then If InStr(1, TextBox1.Text, ".") Then KeyAscii = 0
Case Else
KeyAscii = 0
Beep
End Select
End Sub
Если текстовых полей много, вы можете использовать Control Array, чтобы все текстовые поля принимали только числа и десятичные числа.
Комментарии:
1. Спасибо, я уверен, что это лучшее решение, но для этого требуется много исследований, у меня много текстовых полей, и создание управляющего массива, безусловно, решит проблему. Однако мои ограниченные знания пока не позволят мне реализовать управляющий массив.
2. Учиться никогда не поздно 😉 Если у вас нет
CDbl(Val(UserForm1.TextBox9.Value))
Ответ №2:
Вы могли бы реализовать это следующим образом:
Private Sub CommandButton10_Click()
'to find the revaluation Gain or loss
Dim Revaluation_surplus As Double
Dim Revaluation_loss As Double
Dim Fair_Value As Double
Dim Carrying_Amount As Double
If IsNumeric(TextBox9.Value) Then
Revaluation_surplus = CDbl(TextBox9.Value)
Else
Revaluation_surplus = 0
End If
If IsNumeric(TextBox10.Value) Then
Revaluation_loss = CDbl(TextBox10.Value)
Else
Revaluation_loss = 0
End If
If IsNumeric(TextBox8.Value) Then
Fair_Value = CDbl(TextBox8.Value)
Else
Fair_Value = 0
End If
If IsNumeric(TextBox7.Value) Then
Carrying_Amount = CDbl(TextBox7.Value)
Else
Carrying_Amount = 0
End If
If Fair_Value > Carrying_Amount Then
Revaluation_surplus = (Fair_Value - Carrying_Amount)
ElseIf Fair_Value < Carrying_Amount Then
Revaluation_loss = (Carrying_Amount - Fair_Value)
End If
End Sub
С помощью этого кода я не получил никаких ошибок, независимо от ввода в текстовые поля…
В качестве примечания, вы пока ничего не делаете с вычисленными значениями. Чтобы, например, отобразить их в текстовых полях, вам нужно будет вставить что-то вроде
TextBox9.Value = Revaluation_surplus
TextBox10.Value = Revaluation_loss
после выполнения вычислений.
Кроме того, на этом этапе получение значений из TextBox9 и TextBox10 даже не требуется, поэтому ваш окончательный код может выглядеть следующим образом:
Private Sub CommandButton10_Click()
'to find the revaluation Gain or loss
Dim Revaluation_surplus As Double
Dim Revaluation_loss As Double
Dim Fair_Value As Double
Dim Carrying_Amount As Double
If IsNumeric(TextBox8.Value) Then
Fair_Value = CDbl(TextBox8.Value)
Else
Fair_Value = 0
End If
If IsNumeric(TextBox7.Value) Then
Carrying_Amount = CDbl(TextBox7.Value)
Else
Carrying_Amount = 0
End If
If Fair_Value > Carrying_Amount Then
Revaluation_surplus = (Fair_Value - Carrying_Amount)
ElseIf Fair_Value < Carrying_Amount Then
Revaluation_loss = (Carrying_Amount - Fair_Value)
End If
TextBox9.Value = Revaluation_surplus
TextBox10.Value = Revaluation_loss
End Sub
Комментарии:
1. Isnumeric не будет работать для таких случаев, как
?IsNumeric(" 0. 4 ")
, но?CDbl(Val(" 0. 4 "))
будет 🙂2. Да, я попытался сделать это как можно более понятным для op… Я бы, конечно, реализовал это по-другому.
3. Да, второе полностью решило мою проблему, и спасибо вам за это. Однако я знаю, что это не лучшее решение, поскольку это не самый быстрый код. Если бы я был лучшим программистом, я бы, конечно, выбрал первый вариант.
4. @KyriacosEvgeniou если вы некоторое время используете VBA, я уверен, вы быстро сможете понять решение Сиддарта, продолжайте в том же духе 🙂