Ошибка деления на ноль vba

Пользовательское соглашение

Политика конфиденциальности

© Николай Павлов, Planetaexcel, 2006-2023
info@planetaexcel.ru


Использование любых материалов сайта допускается строго с указанием прямой ссылки на источник, упоминанием названия сайта, имени автора и неизменности исходного текста и иллюстраций.

Техническая поддержка сайта

ООО «Планета Эксел»

ИНН 7735603520


ОГРН 1147746834949
        ИП Павлов Николай Владимирович
        ИНН 633015842586
        ОГРНИП 310633031600071 

Replace all of your code: —

private sub textbox1_change()
if textbox1.value = "" then exit sub 
if textbox2.value = "" then exit sub 
textbox3.value = cdbl(textbox1.value) / cdbl(textbox2.value)
end sub 
private sub textbox2_change()
if textbox1.value = "" then exit sub
if textbox2.value = "" then exit sub
textbox3.value = cdbl(textbox1.value) / cdbl(textbox2.value)
end sub 

With this code: —

Private Sub textbox1_change()
ShowResult
End Sub
Private Sub textbox2_change()
ShowResult
End Sub
Private Sub ShowResult()
Dim Str1        As String
Dim Str2        As String
Str1 = Trim(textbox1.Value)
Str2 = Trim(textbox2.Value)
If (Str1 = "") Or (Str2 = "") Then Exit Sub
If (IsDouble(Str1) = False) Or (IsDouble(Str2) = False) Then
    textbox3.Value = "NA"
Else
    If (CDbl(Str2) = 0) Or ((CDbl(Str2) + CDbl(Str1)) = 0) Then
        textbox3.Value = "NA"
    Else
        textbox3.Value = CDbl(Str1) / CDbl(Str2)
    End If
End If
End Sub
Private Function IsDouble(ByVal StrValue As String) As Boolean
Dim DblTest As Double
On Error GoTo ErrorHandle
DblTest = CDbl(StrValue)
IsDouble = True
Exit Function
ErrorHandle:
Err.Clear
End Function

This will check for values that can’t be Double data types (i.e. a string) and bad division (i.e. error code 6 and 11).

EDIT: —
The below is walkthrough of what is happening in the above code.

The procedures textbox1_change and textbox2_change are doing the same thing so to avoid repetition of code; they both call on the one instance of that code.

Private Sub textbox1_change()
ShowResult
End Sub

Private Sub textbox2_change()
ShowResult
End Sub

After that, there is the new procedure ShowResult that holds the single instance of the code that textbox1_change and textbox2_change call upon.

Private Sub ShowResult()
Dim Str1        As String
Dim Str2        As String
Str1 = Trim(textbox1.Value)
Str2 = Trim(textbox2.Value)
If (Str1 = "") Or (Str2 = "") Then Exit Sub
If (IsDouble(Str1) = False) Or (IsDouble(Str2) = False) Then
    textbox3.Value = "NA"
Else
    If (CDbl(Str2) = 0) Or ((CDbl(Str2) + CDbl(Str1)) = 0) Then
        textbox3.Value = "NA"
    Else
        textbox3.Value = CDbl(Str1) / CDbl(Str2)
    End If
End If
End Sub

The ShowResult code does a number of checks.

First it places textbox1 into Str1 and textbox2 into Str2 and using trim on them. Trim means that leading and trailing spaces are removed. For example if the textbox1 value was » » (maybe done by copy and paste by the user) then technically it’s not empty and could cause an error.

Dim Str1        As String
Dim Str2        As String
Str1 = Trim(textbox1.Value)
Str2 = Trim(textbox2.Value)

The next check is if either value is empty then exit the procedure, much like you did before but now on a single line.

If (Str1 = "") Or (Str2 = "") Then Exit Sub

The next check calls another procedure that does a check to ensure the value could be converted to a double. for Example CDbl("Hello World!") would fail because it’s not a number to begin with. So this check gets around that potential issue, if its not a number that can be divided then output ‘NA’.

If (IsDouble(Str1) = False) Or (IsDouble(Str2) = False) Then
    textbox3.Value = "NA"

The final check is that if the second value is zero or both are zero then «NA2 is output, else the division is done and output.

If (CDbl(Str2) = 0) Or ((CDbl(Str2) + CDbl(Str1)) = 0) Then
    textbox3.Value = "NA"
Else
    textbox3.Value = CDbl(Str1) / CDbl(Str2)
End If

This is the final procedure that was called by ShowResult to check the value could be converted to a Double data type. It tried to do the conversion, if an error occurs the error is cleared and false (by default) will be returned to the caller, if there is no error then true is output.

Private Function IsDouble(ByVal StrValue As String) As Boolean
Dim DblTest As Double
On Error GoTo ErrorHandle
DblTest = CDbl(StrValue)
IsDouble = True
Exit Function
ErrorHandle:
Err.Clear
End Function

Hope this helps.

0 / 0 / 1

Регистрация: 26.06.2012

Сообщений: 30

1

Устранение ошибки деления на ноль

03.08.2012, 17:34. Показов 14095. Ответов 9


Студворк — интернет-сервис помощи студентам

Здравствуйте.!
Пишу макросы для *xls.
Все отлично работает но один маленький нюанс для того что бы всё было красивенько.
при делении на ноль в ячейке ошибка «#ДЕЛО/0» буду рад если подскажите как устранить данную ошибку, что бы была пустая ячейка или 0.
Заранее спасибо за ответы.



0



2927 / 1758 / 206

Регистрация: 28.10.2011

Сообщений: 6,539

Записей в блоге: 6

03.08.2012, 18:09

2

Оператор IF вам знаком?



0



dev.Free

Заблокирован

03.08.2012, 18:48

3

Visual Basic
1
2
3
4
IF там что-то = 0 Then
обработчик события
Exit Sub
End if



1



Модератор

Эксперт функциональных языков программированияЭксперт Python

35644 / 19537 / 4104

Регистрация: 12.02.2012

Сообщений: 32,607

Записей в блоге: 13

07.08.2012, 10:03

4

Вот простая формула: =A1/A2, но если в A2 лежит нуль, будет ошибка. А вот формула, лишенная этого недостатка: =ЕСЛИ(A2<>0;A1/A2;»-«) (Если A2=0, то выводится прочерк…)



0



0 / 0 / 0

Регистрация: 03.10.2013

Сообщений: 6

03.10.2013, 11:22

5

Catstail,

Вопрос по поводу деления на ноль.
Есть 3 ячейки: в каждой из этих ячеек могут быть следующие значения- «0», «число», «текст».
необходимо одну ячейку разделить на разность двух других, т е A1/(A2-A3), в результате должно появиться либо «число» либо «-«.



0



Catstail

Модератор

Эксперт функциональных языков программированияЭксперт Python

35644 / 19537 / 4104

Регистрация: 12.02.2012

Сообщений: 32,607

Записей в блоге: 13

03.10.2013, 11:58

6

Можно написать и формулу, но проще написать на VBA функцию листа.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Function SDIV(a1 as variant,a2 as variant,a3 as variant) As variant
   If isNumeric(a1) And isNumeric(a2) And isNumeric(a3) then
      z#=a2-a3
      if abs(z#) < 1.0E-5 then
         SDIV="-"
      else
         SDIV=a1/z#
      end if
   Else
      SDIV="-"
   End if
End Function



2



0 / 0 / 0

Регистрация: 03.10.2013

Сообщений: 6

03.10.2013, 12:05

7

За макрос спасибо, но в моем случае нужно все сделать на Excel… в этом то вся и проблема

вариант =ЕСЛИ(И(ЕЧИСЛО(A1);ЕЧИСЛО(A2);ЕЧИСЛО(A3));ЕСЛИ(И(A1<>0;A2<>0;A3<>0;(A2-A3)<>0);A1/(A2-A3);»-«))

не работает…



0



Модератор

Эксперт функциональных языков программированияЭксперт Python

35644 / 19537 / 4104

Регистрация: 12.02.2012

Сообщений: 32,607

Записей в блоге: 13

03.10.2013, 12:31

8

Цитата
Сообщение от candy1
Посмотреть сообщение

но в моем случае нужно все сделать на Excel…

— я так и сделал



0



0 / 0 / 0

Регистрация: 03.10.2013

Сообщений: 6

03.10.2013, 13:05

9

Я имел ввиду через формулу



0



Модератор

Эксперт функциональных языков программированияЭксперт Python

35644 / 19537 / 4104

Регистрация: 12.02.2012

Сообщений: 32,607

Записей в блоге: 13

03.10.2013, 15:15

10

Вот заготовка правильной формулы:

Код

=ЕСЛИ(И(ЕЧИСЛО(C2);ЕЧИСЛО(C3);ЕЧИСЛО(C4));ЕСЛИ(C2<>C3;C4/(C2-C3);"-");"-")



0



Why is 0/0 throwing Overflow error in VBA, while in .Net languages it is simply a Division by 0 error?


E.g., in C# it is a System.DivideByZeroException

static void Main()
{
    int k = 0;
    int p = 0;
    Console.WriteLine(k/p);
}

Div/0 error exists in VBA. But 0/0 gives an overflow exception, while anything else divided by 0 gives a Div/0 exception:

Public Sub TestMe()

    'Integer
    PrintAndCheck (11)      '- Division by zero error

    'Double
    PrintAndCheck (0.9)     '- Division by zero error

    'Long
    PrintAndCheck (50000)   '- Division by zero error

    'String
    PrintAndCheck ("1.1")   '- Division by zero error

    '----------------------------------------------------
    '----------------BUT---------------------------------
    '----------------------------------------------------

    'Integer
    PrintAndCheck (0)       '- Overflow?

End Sub

Public Sub PrintAndCheck(lngDivisor As Variant)

    On Error Resume Next

    Debug.Print lngDivisor / 0
    Debug.Print Err.Description & " from type -> " & VarType(lngDivisor)

    On Error GoTo 0

End Sub

That’s what you get in the immediate window:

Division by zero from type -> 2
Division by zero from type -> 5
Division by zero from type -> 3
Division by zero from type -> 8
Overflow from type -> 2

Edit: To make the whole story more interesting:

Public Sub TestMe()
    On Error Resume Next
    Debug.Print Evaluate("0/0")     'Division by 0 error (CVErr(xlErrDiv0)=2007)
    Debug.Print 0  0               'Division by 0 error
    Debug.Print Err.Description
    On Error GoTo 0
End Sub

      1. Запрет деления на ноль

Вторая ошибка, на которую реагирует
VB, это деление на ноль.
От этой реакции мы избавимся, если
запретим компьютеру делить на ноль,
записав вместо оператора

Результат.Text
= Чис1 / Чис2

такой:

If
Чис2 <> 0 Then Результат.Text = Чис1 /
Чис2 Else MsgBox («На ноль делить нельзя»)

Вот как будет выглядеть теперь процедура
деления:

Private
Sub
Кл_деления_Click(ByVal
sender As
Object, ByVal
e As
EventArgs) Handles
Кл_деления.Click

If
IsNumeric(Число1.Text) And
IsNumeric(Число2.Text) Then

Чис1 = Число1.Text

Чис2 = Число2.Text

If
Чис2 <> 0 Then Результат.Text
= Чис1 / Чис2 Else MsgBox(«На
ноль делить нельзя»)

Else

MsgBox(«Вводите
только числа»)

End
If

End
Sub

Как видите, здесь в состав многострочного
If
входит однострочный.

      1. Ставим пароль на калькулятор

Ваш калькулятор стал достаточно надежен
и удобен. Теперь его не стыдно показать
друзьям. Ну а защищаться от врагов будем
паролем.

Наша задача – сделать так, чтобы при
попытке запустить калькулятор на экране
появлялось приглашение ввести пароль,
известный только вам. При попытке ввода
неправильного пароля, программа должна
заканчивать свою работу.

Поскольку приглашение на ввод пароля
должно появляться раньше появления
калькулятора на экране, то программируем
его в процедуре Form1_Load. Предварительно
выдумаем сам пароль, например, «калям».

Private
Sub
Form1_Load(ByVal
sender As
System.Object,
ByVal e
As
System.EventArgs)
Handles
MyBase.Load

Dim
Parol As
String
‘Переменная-пароль

Parol =
InputBox(«Введите пароль»)

If
Parol <> «калям» Then
MsgBox(«Пароль неверный!»)
: End

End
Sub

Новый для вас оператор End
делает всего одну вещь – вызывает
завершение программы.

Запустите проект и проверьте, как он
работает.

То же самое можно было бы запрограммировать
короче и без использования переменной:

Private
Sub
Form1_Load(ByVal
sender As
System.Object, ByVal
e As
System.EventArgs) Handles
MyBase.Load

If
InputBox(«Введите пароль»)
<> «калям» Then
MsgBox(«Пароль неверный!»)
: End

End
Sub

Вообще, переменные нужны, если необходима
неоднократная обработка какой-то
информации: сложение чего-то, затем
сравнение этого чего-то с чем-то другим
и т.д. В нашем же случае пароль нужен
всего один раз, так что можно обойтись
и без переменной.

Вы скажете: Кто угодно перед запуском
моей программы посмотрит в ее текст и
сразу же увидит пароль. Совершенно
верно. Существует много способов сделать
пароль в тексте программы неудобочитаемым
(например, соединив его из нескольких
переменных, каждая из которых –
коротенькая строчка), но самый лучший
способ – не показывайте посторонним
текст программы, а запускайте исполняемый
файл (он находится в папке BIN вашего
проекта).

Усовершенствуем
пароль. Вы можете использовать
пароль и более тонко. Например, пусть
враг запустил ваш калькулятор. Он
запустился, враг ликует. Но недолго,
потому что видит, что кнопки сложения
и вычитания неработоспособны. Для этого
в процедуре Form1_Load предусмотрите
их деактивацию при помощи установки в
False их свойства Enabled. Для ввода
пароля вы в этом случае используете не
InputBox, а дополнительное текстовое
поле (TextBox1) и кнопку (Button1) с
текстом ОК. Введя пароль, вы щелкаете
по кнопке ОК и кнопки сложения и вычитания
становятся работоспособными.

Сделаем также так, чтобы в случае ввода
пароля в текстовое поле там для
секретности появлялись не буквы пароля,
а звездочки (как это обычно принято)
или любой другой символ. В этом случае
никто из-за вашей спины не сможет пароль
подсмотреть. Для этого достаточно в
режиме проектирования или в коде до
ввода пароля установить свойство
текстового поля PasswordChar, выбрав в
качестве его значения любой символ (в
том числе и звездочку):

Textbox1.PasswordChar
= «
Ж«

Вот нужные две процедуры:

Private
Sub
Form1_Load(ByVal
sender As
System.Object, ByVal
e As
System.EventArgs) Handles
MyBase.Load

TextBox1.PasswordChar
= «*»

Кл_сложения.Enabled
= False

Кл_вычитания.Enabled
= False

End
Sub

Private
Sub
Button1_Click(ByVal
sender As
System.Object, ByVal
e As
System.EventArgs) Handles
Button1.Click

If
TextBox1.Text = «калям»
Then

Кл_сложения.Enabled
= True

Кл_вычитания.Enabled
= True

Else

MsgBox(«Пароль
неверный!»)

End
If

End
Sub

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

Возможно, вам также будет интересно:

  • Ошибка двигателя на пежо 407
  • Ошибка деления на 0 скд
  • Ошибка двигателя на пежо 206
  • Ошибка деление на ноль паскаль
  • Ошибка двигателя на панели приора

  • Понравилась статья? Поделить с друзьями:
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии