Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на Basic / VBA


РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты в разделе

Megaloman
Статус: Академик
Рейтинг: 95
∙ повысить рейтинг »
Sergey V. Gornostaev
Статус: Специалист
Рейтинг: 63
∙ повысить рейтинг »
mklokov
Статус: 6-й класс
Рейтинг: 18
∙ повысить рейтинг »

∙ Basic

Номер выпуска:1125
Дата выхода:26.02.2018, 23:45
Администратор рассылки:Андреенков Владимир (Академик)
Подписчиков / экспертов:14 / 12
Вопросов / ответов:3 / 13

Консультация # 120717: Добрый день! Помогите решить проблему. Написал простенькую программку на VB6, типо калькулятор - в текстовое поле вводим цыфры, нажимаем кнопочку и все считает. Проблема: если вдруг вводят не цыфры, а буквы тутже вылетает ошибка и программка закрывается. Я понимаю проблема в обработке различных типов данных. Подскажите как избежать ошибки....
Консультация # 143532: здравствуйте! Вычислите сумму всех отрицательных элементов,стоящих на нечетных местах...
Консультация # 107216: Приветствую господа. Подскажите, плиз как решить проблему? В ячеке стоит время 7:09:08 считываю его в переменную Tim2 = Range(В1).Value Распечатываю переменную Tim2 MsgBox (Tim2) И вместо врени наблюдаю вот это 0,298 ..

Консультация # 120717:

Добрый день! Помогите решить проблему. Написал простенькую программку на VB6, типо калькулятор - в текстовое поле вводим цыфры, нажимаем кнопочку и все считает. Проблема: если вдруг вводят не цыфры, а буквы тутже вылетает ошибка и программка закрывается. Я понимаю проблема в обработке различных типов данных. Подскажите как избежать ошибки.

Дата отправки: 29.01.2008, 17:32
Вопрос задал: CLov233
Всего ответов: 7
Страница онлайн-консультации »


Консультирует AlexanderZh:

Здравствуйте, CLov233!
Очевидно нужно проверять вводимые данные smile
Метод проверки зависит от того, как организуется ввод. Можно проверять каждый символ в событии "нажание кнопки" и если он не соответствует критерию (не является цифрой, точкой или математическим знаком) то запрещать его ввод.
Можно проверять значение поля на "правильность" уже после ввода всего числа. Или встроить такую проверку перед выполненинем математических действий.
Очень жалко, что вы не привели кода программы...

Консультировал: AlexanderZh
Дата отправки: 29.01.2008, 17:48
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Максим Sly:

Здравствуйте, CLov233!
попробуйте воспользоваться процедурой обработки нажатия клавиши, приведенной ниже...
должно помочь.. этот код позволяет нажимать клавиши с цифрами, и клавиши для удаления этих цифр т.е. Back Spase или Delete...
если же нажата какая либо другая клавиша, то она игнорируется.

Приложение:

Консультировал: Максим Sly
Дата отправки: 29.01.2008, 17:49
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует KunkTator:

Здравствуйте, CLov233!
Если свойство CauseValidate у Text1 существует (в Вашей версии VB) и установленно в TRUE, то
Private Sub Text1_Validate(Cancel As Boolean)
If Not IsNumeric(Text1.Text) Then
MsgBox "Please enter numbers only.", vbInformation
\'можно протереть
Text1.Text = ""
Cancel = True
End If
End Sub

Консультировал: KunkTator
Дата отправки: 29.01.2008, 18:58
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Тесленко Евгений Алексеевич:

Здравствуйте, CLov233!
В дополнение к сказанному AlexanderZh и Максим Sly.
значение поля на "правильность" проверяется проверяется примерно так:
If Not IsNumeric(Text1.Text) Then Exit Sub
А при проверке ввода при нажантии клавиши, необходимо проверять код разделителя целой и дробной части. запятая или точка, код 44 или 46, в зависимости от национальной настройки. Иначе математические операции с нецелыми числами будут невозможны.
Евгений.

Консультировал: Тесленко Евгений Алексеевич
Дата отправки: 29.01.2008, 19:19
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует DrakoN:

Здравствуйте, CLov233!
дополним ответ последнего експерта)

код проверки считалки

Try
здесь считаем
Catch ex as Exception
MsgBox("введены невреные данные")
end try
код проверки числа

после нажатия кнопки любого действия
try
Cdbl(TextBox.Text)
catch ex as Exception
MsgBox("плохие данные")
end try

И именно дабл так как Операции IsNumeric запретят вводить запятую и прочие мат знаки вообщем плохая это затея

Консультировал: DrakoN
Дата отправки: 29.01.2008, 23:17
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует HookEst:

Здравствуйте, CLov233!
Ответов много, добавлю свой.
Вариантов решения несколько.
Можно просто наплевать на то, что ввел пользователь, а перед использованием, значение поля "прогнать" через Val (не забывая, что Val принимает только (.) как разделитель):

Private Sub Command1_Click()
MsgBox Val(Replace(Text1, ",", "."))
End Sub

Можно просто информировать об ошибке и все.
Эти варианты не очень уважительно относятся к пользователю.

Есть неплохой, очень эффективный вариант, вообще запретить фокус ввода для поля, а весь ввод обрабатывать в обработчиках формы(KeyPreview=True), так сделано в калькуляторе Windows(calc.exe).
что-нибудь вроде:

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Dim t As String
Dim dec As String
t = Val(Text1)
dec = IIf(Right(Text1, 1) = ".", ".", "")
Select Case KeyCode
Case vbKey0 To vbKey9
t = t & dec & Chr(KeyCode)
Case vbKeyNumpad0 To vbKeyNumpad9
t = t & dec & Chr(KeyCode - 48)
Case vbKeyDelete
t = ""
Case vbKeyBack
If dec = "." Then
dec = ""
Else
t = Left(t, Len(t) - 1)
End If
End Select
Text1 = Val(t)

If KeyCode = vbKeyDecimal Then If dec = "" Then Text1 = Val(t) & "."
End Sub

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

Варианты попроще, те что уже озвучили, это проверять ввод в обработчиках поля.

OnKeyPress - очень удобный, простой, но не учитывает то, что из буфера обмена, значени можно вставлять не только нажимая Ctrl+V, а например с помощью мыши. В таком случае, данный вариант не сработает.

OnValidate - также удобный для нас, но проверка ввода происходит только в момент потери фокуса поля, что не очень удобно для пользователя.

OnChange - этот вариант еще не озвучили, но мне он нравится больше всего:

Private Sub Text1_Change()
Static OldVal As String
Dim ss As Long
Dim sl As Long
If Trim(Text1) = "" Then OldVal = "": Text1 = "": Exit Sub
If Not IsNumeric(Text1) Then
With Text1
ss = .SelStart
sl = .SelLength
.Text = OldVal
.SelStart = ss - 1
.SelLength = sl
End With
Else
OldVal = Text1
End If
End Sub

просто, удобно, не зависит от способа изменения данных, мне нравится.

Все эти способы можно комбинировать.
Вообщем, что хотел - сказал.
Успехов.

Консультировал: HookEst
Дата отправки: 30.01.2008, 06:56
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Черников Игорь Владимирович:

Здравствуйте, CLov233!
Private Sub Text1_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case 8, 44, 46, 48 To 57 \'При вводе десятичных цифр (48-57) Вам понадобится точка (46) или запятая (44) - ненужное уберите
Case 13 \'Код клавиши Enter
\' здесь можно вставить код вычисления
Case Else
KeyAscii = 0
End Select
End Sub

Консультировал: Черников Игорь Владимирович
Дата отправки: 30.01.2008, 17:58
Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 143532:

здравствуйте! Вычислите сумму всех отрицательных элементов,стоящих на нечетных местах

Дата отправки: 10.09.2008, 08:04
Вопрос задал: Андреев Павел Александрович
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Furfurol:

Здравствуйте, Андреев Павел Александрович!


for i=1 to n step 2
if A(i) < 0 then S=S+A(i),
next

Консультировал: Furfurol
Дата отправки: 10.09.2008, 10:13
Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 107216:

Приветствую господа.
Подскажите, плиз как решить проблему?

В ячеке стоит время 7:09:08 считываю его в переменную
Tim2 = Range(В1).Value
Распечатываю переменную Tim2
MsgBox (Tim2)
И вместо врени наблюдаю вот это 0,298

Дата отправки: 29.10.2007, 11:11
Вопрос задал: Gat0r
Всего ответов: 5
Страница онлайн-консультации »


Консультирует Genyaa:

Здравствуйте, Gat0r!

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

Чтобы увидеть значение времени в привычном нашем глазу виде, нужно форматировать это значение под формат времени:

MsgBox Format(Tim2,"hh:mm:ss")

Консультировал: Genyaa
Дата отправки: 29.10.2007, 12:18
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Alexander N. Monastyrsky:

Здравствуйте, Gat0r!
Надо определить переменную как:
Dim Tim2 As Date
и все получится.

Консультировал: Alexander N. Monastyrsky
Дата отправки: 29.10.2007, 12:20
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Iris:

Здравствуйте, Gat0r!
Объявите переменную как Дата:

Dim Tim2 As Date

Консультировал: Iris
Дата отправки: 29.10.2007, 12:47
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Черников Игорь Владимирович:

Здравствуйте, Gat0r!
Нужно объявить переменную как Дата, тогда всё будет нормально, даже если ячейка имеет другой формат.
Dim Tim2 As Date
Tim2 = Worksheets("Лист1").Range("A1").Value
MsgBox (Tim2)
Вот только если неправильно ввести данные, то может возникнуть ошибка, тогда нужно проверять возможно ли эти данные преобразовать в дату или включить обработчик ошибок:
Dim Tim2 As Date
On Error GoTo ErrorHandler
Tim2 = Worksheets("Лист1").Range("A1").Value
MsgBox (Tim2)
Exit Sub
ErrorHandler:
MsgBox ("Ошибка")

Консультировал: Черников Игорь Владимирович
Дата отправки: 29.10.2007, 16:56
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Тесленко Евгений Алексеевич:

Здравствуйте, Gat0r!
Предлагаю вариант без преобразования:
\' Tim2 = Range(В1).Text

Евгений.

Консультировал: Тесленко Евгений Алексеевич
Дата отправки: 30.10.2007, 17:40
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


В избранное