Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.12.2009, 17:50   #1
warshadow
Пользователь
 
Регистрация: 12.09.2009
Сообщений: 33
По умолчанию Блок TextBox VBA

Всем доброй ночи или вечера)
Мой вопрос заключается в том, что у меня имееться поле textbox, я должен ввести в него значения, чтобы бал произведен рассчет, как сделать так,что если поле пусто, то кнопка бы не работало или же писалось что необходимо заполнить строку (textbox)
Например:
Private Sub cmdRun_Click()
Dim mmax as Integer
mmax=txtM
End Sub
Получается на форме одно поле(textbox) и 1 кнопка
Как реализовать описанное мною действие?
warshadow вне форума Ответить с цитированием
Старый 19.12.2009, 18:29   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Самый простой вариант:
Код:
Private Sub cmdRun_Click()
    If Len(Me.txtM) = 0 Then Exit Sub    ' выход, если поле пустое
    Dim mmax As Integer: mmax = txtM
End Sub
Пример файла: http://excelvba.ru/XL_Files/Sample__...__20-25-41.zip


Вариант получше:
Код:
Private Sub cmdRun_Click()
    ' а здесь проверка не требуется
    Dim mmax As Long: mmax = txtM
End Sub

Private Sub txtM_Change()
    ' при изменении в поле изменяется доступность кнопки
    Me.cmdRun.Enabled = Len(Me.txtM) > 0
End Sub

Private Sub UserForm_Initialize()
    Me.cmdRun.Enabled = False  ' блокируем кнопку при запуске формы
End Sub

Private Sub txtM_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    On Local Error Resume Next
    ' ограничение на количество введённых символов
    If KeyAscii <> 8 And Len(Me.txtM) >= 10 Then KeyAscii = 0
    ' если в поле введена не цифра, то отменяем ввод символа
    If Not IsNumeric(Chr$(KeyAscii)) Then KeyAscii = 0
End Sub
Пример файла: http://excelvba.ru/XL_Files/Sample__...__20-33-10.zip
В этом примере пользователь не сможет ввести в поле ничего, кроме цифр.

Последний раз редактировалось EducatedFool; 19.12.2009 в 18:33.
EducatedFool вне форума Ответить с цитированием
Старый 19.12.2009, 19:28   #3
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

Здравствуйте warshadow.
Предлагаю в код EducatedFool внести небольшую, непринципиальную корректировку:
Код:
Private Sub txtM_Change()
    cmdRun.Enabled = Len(txtM.Text)
End Sub
Private Sub txtM_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If KeyAscii = 8 Then
    ElseIf IsNumeric(Chr$(KeyAscii)) Then
    ElseIf KeyAscii = 44 Then
    Else
        KeyAscii = 0
    End If
End Sub
Private Sub UserForm_Initialize()
    cmdRun.Enabled = 0
End Sub
Евгений.
Teslenko_EA вне форума Ответить с цитированием
Старый 19.12.2009, 20:04   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Цитата:
Предлагаю в код EducatedFool внести небольшую, непринципиальную корректировку
Здравствуйте, Евгений.

1. Ваш код вылетит с ошибкой при вводе в текстбокс любого символа кириллицы
2. Я специально не стал добавлять в свой код возможность ввода запятой - поскольку ТС считывает значение в переменную типа Integer
Код:
Dim mmax as Integer
EducatedFool вне форума Ответить с цитированием
Старый 19.12.2009, 20:47   #5
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

Здравствуйте EducatedFool.
Вы правы, конечно код должен быть изменен:
Код:
Private Sub txtM_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If KeyAscii = 8 Then
    ElseIf IsNumeric(ChrW$(KeyAscii)) Then
    ElseIf KeyAscii = 44 Then
        If InStr(1, txtM.Text, ",") > 0 Then KeyAscii = 0
    Else
        KeyAscii = 0
    End If
End Sub
и проверку лучше выполнять так:
ElseIf KeyAscii > 47 And KeyAscii < 58 Then
Евгений.

Последний раз редактировалось Teslenko_EA; 19.12.2009 в 20:53.
Teslenko_EA вне форума Ответить с цитированием
Старый 20.12.2009, 00:23   #6
warshadow
Пользователь
 
Регистрация: 12.09.2009
Сообщений: 33
По умолчанию

Спасибо вам за ответы))
Буду пробывать и выбирать тот вариант , который на мой взгляд кажется мне лучшим)
warshadow вне форума Ответить с цитированием
Старый 20.12.2009, 00:46   #7
warshadow
Пользователь
 
Регистрация: 12.09.2009
Сообщений: 33
По умолчанию

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

Последний раз редактировалось warshadow; 20.12.2009 в 02:03.
warshadow вне форума Ответить с цитированием
Старый 20.12.2009, 17:02   #8
warshadow
Пользователь
 
Регистрация: 12.09.2009
Сообщений: 33
По умолчанию

Заранее спасибо
warshadow вне форума Ответить с цитированием
Старый 20.12.2009, 18:02   #9
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

вводить только запятую разрешает строка ElseIf KeyAscii = 44 Then..., проверку ввода запятой можно выполнять следующим образом:
Код:
Private Sub txtM_Change()
    cmdRun.Enabled = Len(txtM.Text) And InStr(1, txtM.Text, ",")
End Sub
но как указывал EducatedFool, код:
Код:
...
Dim mmax as Integer
mmax=txtM
...
не позволит Вам использовать эти "запятые", т.к. используется целочисленная переменная mmax и любое значение поля переданное в эту переменную станет целым числом.
"Защитить" от проблемы сможет например: Dim mmax as Double
Евгений.
Teslenko_EA вне форума Ответить с цитированием
Старый 20.12.2009, 18:46   #10
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Цитата:
Сообщение от Teslenko_EA Посмотреть сообщение
проверку ввода запятой можно выполнять следующим образом:
Код:
Private Sub txtM_Change()
    cmdRun.Enabled = Len(txtM.Text) And InStr(1, txtM.Text, ",")
End Sub
И опять здравствуйте, Евгений

Вынужден констатировать, что Ваш код в некторых случаях будет работать неправильно.
К примеру, после ввода в поле строки 4567,234 кнопка станет недоступной.

Почему? Всё очень просто: выполнив команду debug.Print 8 and 5, в результате получим 0
Это достаточно распространённая, хотя и неочевидная ошибка.
Правильно будет так:
Код:
Private Sub txtM_Change()
    cmdRun.Enabled = Len(txtM.Text) > 0 And InStr(1, txtM.Text, ",") > 0
End Sub
или так:

Код:
Private Sub txtM_Change()
    cmdRun.Enabled = CBool(Len(txtM.Text)) And CBool(InStr(1, txtM.Text, ","))
End Sub
EducatedFool вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
textbox NARTZISS Общие вопросы .NET 5 19.12.2009 14:21
TextBox(readonly) Chartvit Общие вопросы C/C++ 1 21.11.2009 22:36
Проблема с TextBox miatu Microsoft Office Word 3 10.09.2009 18:08
TextBox в С# Natok Помощь студентам 2 18.05.2009 17:47
TextBox Freeman Общие вопросы C/C++ 3 28.05.2008 00:56