Ошибка выполнения 13. Пользовательская форма не принимает нулевые значения - PullRequest
0 голосов
/ 29 января 2020

Я пытаюсь передать значения ячеек в пользовательскую форму с именем calcform. При этом команда run выдает ошибку, если значения пусты. Помимо предоставления условных выражений каждому из значений, каковы другие возможности?

Private Sub cancalc_Click()
    With ActiveWorkbook.Worksheets("Sysbal")
        .Activate
        .Range("C1").Value = calcform.customercan.Text
        .Range("C2").Value = calcform.phonecan.Text
        .Range("C3").Value = calcform.faxcan.Text
        .Range("C4").Value = calcform.attentioncan.Text
         calcform.fromcan.Text = "-"
         calcform.phonecanme.Text = "-"
         calcform.faxcanme.Text = "-"
         .Range("L17").Value = CLng(calcform.condtempcan.Text)
         .Range("L18").Value = CLng(calcform.subcoolingcan.Text)
         .Range("L19").Value = CLng(calcform.entfluidcan.Text)
         .Range("L20").Value = CLng(calcform.btuhtdcan.Text)
         .Range("L33").Value = CLng(calcform.dischargecan.Text)
         .Range("L34").Value = CLng(calcform.suctioncan.Text)
         .Range("E9").Value = calcform.modelcan.Text
    End With

    ActiveWorkbook.RefreshAll

    With ActiveWorkbook.Worksheets("Sysbal")
        .Activate
        Application.ScreenUpdating = True
        calcform.facevelocitycan.Caption = CStr(Round(.Range("E23").Value, 0))
        calcform.relativehumiditycan.Caption = CStr(Round(.Range("E26").Value, 2))
        calcform.subcoolingareacan.Text = CStr(Round(.Range("E28").Value, 0))
        calcform.refpredropcan.Caption = CStr(Round(.Range("E31").Value, 0))
        calcform.airfrictioncan.Caption = CStr(Round(.Range("E32").Value, 0))
        calcform.subcoolcan.Caption = CStr(Round(.Range("E33").Value, 0))
        calcform.exitvelocity.Caption = CStr(Round(.Range("E34").Value, 0))
    end with
end sub

1 Ответ

0 голосов
/ 29 января 2020

Проблема в том, что если TextBox пуст, то calcform.entfluidcan.Text возвращает пустую строку "". И если вы попытаетесь преобразовать пустую строку в Long, используя CLng, произойдет ошибка.

Поэтому вам нужно сначала проверить, является ли значение в текстовом поле цифрой c:

If IsNumeric(calcform.entfluidcan.Text) Then 
    .Range("L19").Value = CLng(calcform.entfluidcan.Text)
Else
    .Range("L19").Value = 0
End If

Также в следующей строке будет ошибка

calcform.facevelocitycan.Caption = CStr(Round(.Range("E23").Value, 0))

, если значение в .Range("E23").Value не является числом. Также сначала проверьте, является ли цифра c.

If IsNumeric(.Range("E23").Value) Then 
    calcform.facevelocitycan.Caption = CStr(Round(.Range("E23").Value, 0))
Else
    calcform.facevelocitycan.Caption = "NaN"
End If

Пример использования его с функцией:

Public Function ConvertToLong(ByVal InputValue As Variant) As Long
    ConvertToLong = 0 'default if it cannot be converted

    If IsNumeric(InputValue) Then 
        ConvertToLong = CLng(InputValue)
    End If
End Function

В качестве альтернативы

Public Function ConvertToLong(ByVal InputValue As Variant) As Long
    ConvertToLong = 0 'default if it cannot be converted
    On Error Resume Next 'let it try to convert if it errors it will stay default
    ConvertToLong = CLng(InputValue)
    On Error Goto 0
End Function

и используйте это как:

.Range("L19").Value = ConvertToLong(calcform.entfluidcan.Text)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...