Ошибка переполнения Excel VBA - PullRequest
0 голосов
/ 09 марта 2012

У меня есть следующая строка в Excel VBA:

ActiveCell.Offset(r, 1).Value = IIf(rs2.Fields("SalesRelatedCallsQTD").Value = 0, "--", FormatPercent(rs2.Fields("SoldCallsQTD").Value / rs2.Fields("SalesRelatedCallsQTD").Value, 2))

Когда я запускаю макрос в Excel, я получаю ошибку «Ошибка выполнения 6: переполнение».

Я знаю, что есть возможность получить значение 0 в знаменателе, следовательно, использование IIf для проверки этого. Возможно ли, что Excel все еще пытается вычислить

FormatPercent(rs2.Fields("SoldCallsQTD").Value / rs2.Fields("SalesRelatedCallsQTD").Value, 2)

а выкидывает ошибку? Если так, как мне обойти это или есть что-то еще не так с этим кодом?

EDIT

Когда я добавляю часы, я получаю следующие значения:

rs2.Fields("SalesRelatedCallsQTD").Value : 0 : Variant/Long 
rs2.Fields("SoldCallsQTD").Value : 0 : Variant/Long
rs2.Fields("SoldCallsQTD").Value / rs2.Fields("SalesRelatedCallsQTD").Value : <Overflow> : Variant/Integer

Ответы [ 2 ]

1 голос
/ 09 марта 2012

3 аргумента IIf оцениваются до того, как тест фактически будет выполнен. Например, вы можете попробовать это с приведенным ниже кодом, который вернет деление на ноль. Однако ошибка, которую вы получаете, является не «делением на 0», а ошибкой «переполнения», так что это не единственная проблема.

Public Sub test()

  Dim a As Long
  Dim b As Long

  a = IIf(b = 0, 1, 1 / b)

End Sub
0 голосов
/ 09 марта 2012

Я не уверен, что именно вызвало ошибку, но изменил на следующее исправил ее. Я также создал простой макрос NotNullOrZero, поскольку проверки на> 0 было недостаточно (Null / Null не выдает ошибку, см. Рисунок). Я знаю, что NotNullOrZero очень упрощен, но я знаю, что все мои значения равны Null или Int, поэтому я не сделал его очень надежным.

   If (NotNullOrZero(rs2.Fields("EstimateCallsYTD").Value)) Then
      ActiveCell.Offset(r, 2).Value = FormatPercent(rs2.Fields("EstimateSalesYTD").Value / rs2.Fields("EstimateCallsYTD").Value, 2)
   Else
      ActiveCell.Offset(r, 1).Value = "--"
   End If


Public Function NotNullOrZero(aValue As Variant) As Boolean
    ' Returns true if the value is not null and greater than zero

    If Not IsNull(aValue) Then
       If (aValue > 0) Then
           NotNullOrZero = True
       End If
    End If

    NotNullOrZero = False

End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...