2012-03-09 3 views
0

У меня есть следующие строки в Excel VBA: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 
+0

Нельзя ли связать эту проблему с значениями «Null» здесь и там? Лучший способ - получить пошаговый режим и посмотреть, как выглядят ваши значения, и/или включить несколько «debug.Print» в ваш код. –

+0

Вы можете проверить значения 'ActiveCell' (его адрес),' r', 'rs2.Fields (« SoldCallsQTD »). Value' и' rs2.Fields («SalesRelatedCallsQTD»). Значение «когда вы получаете ошибку? – assylias

+0

См. Edit для значений – BrianKE

ответ

0

Я не уверен, что именно вызвало ошибку, но изменилось на следующее исправленное. Я также создал простой макрос 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 
1

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

Public Sub test() 

    Dim a As Long 
    Dim b As Long 

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

End Sub 
+0

Итак, каков оптимальный способ проверки деления на ноль? Простой If (b> 0). Достаточно ли выполнить работу? – BrianKE

+0

@BrianKE да, используйте условное 'If b = 0. Тогда a = 1 Else a = 1/b End If' – assylias

Смежные вопросы