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

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


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

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

Megaloman
Статус: Академик
Рейтинг: 100
∙ повысить рейтинг »
solowey
Статус: 10-й класс
Рейтинг: 100
∙ повысить рейтинг »
Асмик Гаряка
Статус: Советник
Рейтинг: 37
∙ повысить рейтинг »

∙ Basic

Номер выпуска:1127
Дата выхода:28.05.2018, 00:45
Администратор рассылки:Андреенков Владимир (Академик)
Подписчиков / экспертов:15 / 13
Вопросов / ответов:3 / 10

Консультация # 143041: Доброго дня! smile Кто-то сможет подсказать в чем дело? Есть xls-файл, в котором некоторые ячейки, которые должны быть Number преобразованы как текст(2-й столбец в приложении). Необходимо это исправить с помощью специальной вставки. Вот 2 макроса, которые по-...
Консультация # 120717: Добрый день! Помогите решить проблему. Написал простенькую программку на VB6, типо калькулятор - в текстовое поле вводим цыфры, нажимаем кнопочку и все считает. Проблема: если вдруг вводят не цыфры, а буквы тутже вылетает ошибка и программка закрывается. Я понимаю проблема в обработке различных типов данных. Подскажите как избежать ошибки....
Консультация # 34016: Здорово. Я вот написал программу - Делилку. Программа хорошо делит, но при сборке файлов возникает ошибка. Я уверен весь код в порядке. Но нет, ошбка на лицо. Помогите справиться с ней:...

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

Доброго дня! smile
Кто-то сможет подсказать в чем дело?
Есть xls-файл, в котором некоторые ячейки, которые должны быть Number преобразованы как текст(2-й столбец в приложении). Необходимо это исправить с помощью специальной вставки. Вот 2 макроса, которые по-сути выполняют одно и тоже……но к нужному результату не приводят(вручную все получается)…файл с которым нужно работать в приложении

Sub preobrazovat()

Dim MyDataObj As New DataObject
MyDataObj.SetText 1#
MyDataObj.PutInClipboard
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlMultiply, _
SkipBlanks:=False, Transpose:=False

End Sub

Sub preobrazovat_2()
Dim kusok As Range
Set kusok = Selection
' Последняя не пустая строка
iList = ActiveSheet.Index
iRow = Worksheets(iList).UsedRange.Row + Worksheets(iList).UsedRange.Row s.Count - 1
ActiveCell.Offset(1, 5).Select
ActiveCell.FormulaR1C1 = "1"
ActiveCell.Select
Selection.NumberFormat = "0.00"
Selection.Copy
' активизируем Range
kusok.Activate

Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlMultiply, _
SkipBlanks:=False, Transpose:=False

End Sub

Дата отправки: 04.09.2008, 11:17
Вопрос задал: Iris
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Игорь Елизаров:

Здравствуйте, Iris!
взял ваши процедуры и данные - вроде все получается.
но наверное это не очень корректно, было бы лучше, если бы Вы приложили фрагмент таблички EXCEL в виде файла.
просто при вставке могли произойти какие-то перекодировки и все стало работать.
процедура Preobrazovat_2 преобразует из текста в цифру или выделенный фрагмент или активну ячейку.
Но другой момент.. Из Вашего письма следует, что часть записей была в текстовом виде, а часть - в цифровом.
Почему это произошло ?
посмотрите, чем отличатся эти записи.
может дело в региональных настройках (разделение целой и дробной части ) ?
мне кажется, здесь надо покопаться..

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


С уважением, Игорь

Консультировал: Игорь Елизаров
Дата отправки: 04.09.2008, 12:43
Рейтинг ответа:

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

Консультация # 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 одобряю!

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

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

Дата отправки: 24.01.2006, 22:45
Вопрос задал: DimonFX
Всего ответов: 2
Страница онлайн-консультации »


Консультирует PsySex (Профессионал):

Здравствуйте, DimonFX!
Как я понимаю, у тебя на форме есть FileListBox с именем File1 и ты еще объявляешь переменную Dim File1 As Variant поэтому у тебя идут косяки:-))))) Измени имя переменной или имя объекта и всё заработает. Вообще-то я не понял зачем ты объявлял Dim File1 As Variant, если её дальше в коде вообще нет. Убери тогда вообще эту строку.

Консультировал: PsySex (Профессионал)
Дата отправки: 25.01.2006, 09:09
Рейтинг ответа:

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


Консультирует Залетин Виталий Викторович:

Здравствуйте, DimonFX!
Проверьте имена: File1 - точно FileListBox во всех случаях? Впишите Option Explicit и все имена объявляйте явно - это избавляет от многих ошибок.

Попробуйте в этом коде:
File1.Path = dirWithFiles \' Ошибка в этом месте
dirWithFiles = dirWithFiles & "\"
строки поменять местами.

Консультировал: Залетин Виталий Викторович
Дата отправки: 28.01.2006, 15:08
Рейтинг ответа:

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


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

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

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


В избранное