Пользовательское соглашение
Политика конфиденциальности
© Николай Павлов, 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
Здравствуйте.!
0 |
|
2927 / 1758 / 206 Регистрация: 28.10.2011 Сообщений: 6,539 Записей в блоге: 6 |
|
|
03.08.2012, 18:09 |
2 |
|
Оператор IF вам знаком?
0 |
|
Заблокирован |
||||
|
03.08.2012, 18:48 |
3 |
|||
1 |
|
Модератор 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, Вопрос по поводу деления на ноль.
0 |
|
Catstail Модератор 35644 / 19537 / 4104 Регистрация: 12.02.2012 Сообщений: 32,607 Записей в блоге: 13 |
||||
|
03.10.2013, 11:58 |
6 |
|||
|
Можно написать и формулу, но проще написать на VBA функцию листа.
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 |
|
Модератор 35644 / 19537 / 4104 Регистрация: 12.02.2012 Сообщений: 32,607 Записей в блоге: 13 |
|
|
03.10.2013, 12:31 |
8 |
|
но в моем случае нужно все сделать на Excel… — я так и сделал
0 |
|
0 / 0 / 0 Регистрация: 03.10.2013 Сообщений: 6 |
|
|
03.10.2013, 13:05 |
9 |
|
Я имел ввиду через формулу
0 |
|
Модератор 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
-
Запрет деления на ноль
Вторая ошибка, на которую реагирует
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
входит однострочный.
-
Ставим пароль на калькулятор
Ваш калькулятор стал достаточно надежен
и удобен. Теперь его не стыдно показать
друзьям. Ну а защищаться от врагов будем
паролем.
Наша задача – сделать так, чтобы при
попытке запустить калькулятор на экране
появлялось приглашение ввести пароль,
известный только вам. При попытке ввода
неправильного пароля, программа должна
заканчивать свою работу.
Поскольку приглашение на ввод пароля
должно появляться раньше появления
калькулятора на экране, то программируем
его в процедуре 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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #

