Преобразовать текстовое поле.Значение в двойную переменную

#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, я уверен, вы быстро сможете понять решение Сиддарта, продолжайте в том же духе 🙂