Excel vba if textbox1

ГЛАВНАЯ

ТРЕНИНГИ

   Быстрый старт
   Расширенный Excel
   Мастер Формул
   Прогнозирование
   Визуализация
   Макросы на VBA

КНИГИ

   Готовые решения
   Мастер Формул
   Скульптор данных

ВИДЕОУРОКИ

ПРИЕМЫ

   Бизнес-анализ
   Выпадающие списки
   Даты и время
   Диаграммы
   Диапазоны
   Дубликаты
   Защита данных
   Интернет, email
   Книги, листы
   Макросы
   Сводные таблицы
   Текст
   Форматирование
   Функции
   Всякое
PLEX

   Коротко
   Подробно
   Версии
   Вопрос-Ответ
   Скачать
   Купить

ПРОЕКТЫ

ОНЛАЙН-КУРСЫ

ФОРУМ

   Excel
   Работа
   PLEX

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


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

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

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

ИНН 7735603520


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

  • #1

Hi All,

I have been trying to figure this out for the past hour and I don’t understand what I am doing wrong. I have a userform with a textbox. This textbox is grabbing a value from an excel spreadsheet only when a cell in an excel sheet says yes. Otherwise if the cell says no I need the user to input a number. I have this code in now. The problem is that when the cell says «No», and I type into the textbox, the textbox automatically deletes what i type in…Im assuming this is because of the «». Any help would be greatly appreciated, thank you!

Private Sub TextBox1_AfterUpdate()
If Worksheets(«Sec. 8»).Range(«J15»).Value = «Yes» And Worksheets(«Sec. 8»).Range(«J16»).Value = «Yes» Then
TextBox1.Value = Worksheets(«Sec. 8»).Range(«F17»)
ElseIf Worksheets(«Sec. 8»).Range(«J15»).Value = «Yes» Then
TextBox1.Value = Worksheets(«Sec. 8»).Range(«F15»)
ElseIf Worksheets(«Sec. 8»).Range(«J16»).Value = «Yes» Then
TextBox1.Value = Worksheets(«Sec. 8»).Range(«F16»)
ElseIf Worksheets(«Sec. 8»).Range(«J15»).Value = «No» Then
TextBox1.Value = «»
ElseIf Worksheets(«Sec. 8»).Range(«J16»).Value = «No» Then
TextBox1.Value = «»
End If

Значения TextBox(UserForm) в массив и проверить совпадения

EvgenyD

Дата: Среда, 01.10.2014, 00:28 |
Сообщение № 1

Группа: Пользователи

Ранг: Участник

Сообщений: 74


Репутация:

19

±

Замечаний:
0% ±


Excel 2013

Здравствуйте, уважаемые форумчане!
Помогите, пожалуйста, решить 2 задачи:
1. Поместить в массив значения из TextBox (находятся на UserForm)
2. Проверить уникальность каждого значения массива относительно остальных

Первое пытался сделать, но выводятся только имена Текстбоксов, второе для меня пока загадка. Всего второй месяц изучаю VBA в Excel, заклинило что-то %)

 

Ответить

wild_pig

Дата: Среда, 01.10.2014, 08:52 |
Сообщение № 2

Группа: Проверенные

Ранг: Обитатель

Сообщений: 516


Репутация:

97

±

Замечаний:
0% ±


2003, 2013

Проверить уникальность каждого значения массива относительно остальных

2 текстбокса, что тут проверять? А может это упрощённый пример и текстбоксов гораздо больше?

 

Ответить

EvgenyD

Дата: Среда, 01.10.2014, 14:23 |
Сообщение № 3

Группа: Пользователи

Ранг: Участник

Сообщений: 74


Репутация:

19

±

Замечаний:
0% ±


Excel 2013

Понятное дело упрощенный yes . Иначе вопрос не имеет смысла. Я обычно так «изобретаю велосипед» чтобы не в итоговом файле, сделаю, проверю, а потом уже в общий файл прилепляю. Там форма с переменным количеством текстбоксов, тестбоксы создаются при выполнении макроса.
Может по этому никто не отвечает, т.к. не поняли что это упрощенный вариант (тогда страшно представить что обо мне подумали).

 

Ответить

wild_pig

Дата: Среда, 01.10.2014, 15:05 |
Сообщение № 4

Группа: Проверенные

Ранг: Обитатель

Сообщений: 516


Репутация:

97

±

Замечаний:
0% ±


2003, 2013

 

Ответить

EvgenyD

Дата: Среда, 01.10.2014, 16:57 |
Сообщение № 5

Группа: Пользователи

Ранг: Участник

Сообщений: 74


Репутация:

19

±

Замечаний:
0% ±


Excel 2013

wild_pig, спасибо за ссылку, я ее читал, пробовал но не получалось, а сегодня вдруг заработало. Получилось для занесения в массив значений TextBox использую
[vba]

Код

     For i = 1 To 3
     MyArray(i) = Controls(«TextBox» & i).Value
     Next i

[/vba]

Кстати, почему-то при указании UserForm1.Controls… работает не корректно, а так Controls(«TextBox» & i).Value работает.

Для выявления повторений в массиве сделал так:
[vba]

Код

  

     Z = 0
     For y = 1 To 3
     Fd = MyArray(y)
     Arr = MyArray()
     x = WorksheetFunction.Match(Fd, Arr, 0)
     If x <> y Then
     Z = Z + 1
     End If
     Next y
     MsgBox Z

[/vba]
Если Z выдает >0 то есть повторы. Для моих потребностей этого достаточно.
Имеет право на жизнь такая конструкция или как-то по другому можно, не подскажите?

 

Ответить

wild_pig

Дата: Среда, 01.10.2014, 18:04 |
Сообщение № 6

Группа: Проверенные

Ранг: Обитатель

Сообщений: 516


Репутация:

97

±

Замечаний:
0% ±


2003, 2013

Судя по коду в примере хотелось проверить заполненность полей?
[vba]

Код

Private Sub CommandButton1_Click()
     Dim tBox As Control
     For Each tBox In UserForm1.Controls
         If TypeOf tBox Is MSForms.TextBox Then
             If tBox.Value = «» Then
                 MsgBox «Не тупи, заполни поле «»» & tBox.Name & «»»»
                 tBox.SetFocus
                 Exit For
             End If
         End If
     Next
End Sub

[/vba]

 

Ответить

EvgenyD

Дата: Среда, 01.10.2014, 18:46 |
Сообщение № 7

Группа: Пользователи

Ранг: Участник

Сообщений: 74


Репутация:

19

±

Замечаний:
0% ±


Excel 2013

Да, у меня поприметивнее написано, но работает ), вот SetFocus искал, т.к. при незаполненом перескакивал на следующее, а хотелось, чтобы курсор вставал в незаполненый Textbox. Сейчас как раз доделал файл для которого выяснял ответ в данной теме. Будет понятно что я хотел сделать. Код там написан топорно, пока только так могу, буду со временем (и с опытом) «вылизывать». Первой доработкой будет замена моего кода проверки на пустоту на Ваш. Т.к. у меня для каждого TextBox своя процедура, хоть и написана циклом. Но вроде все работает как хотел.

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

К сообщению приложен файл:

8330871.xlsm
(45.3 Kb)

 

Ответить

VictorM

Дата: Среда, 12.08.2015, 20:22 |
Сообщение № 8

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 161


Репутация:

27

±

Замечаний:
0% ±


Цитата

Судя по коду в примере хотелось проверить заполненность полей?

Здравствуйте, Уважаемые!
Применил этот код из Сообщения № 6 — все отлично!
Но вот такой вопрос у меня.
Как можно игнорировать проверку заполненности некоторых полей, т.к. они необязательны к заполнению?

 

Ответить

nilem

Дата: Среда, 12.08.2015, 20:32 |
Сообщение № 9

Группа: Авторы

Ранг: Старожил

Сообщений: 1612


Репутация:

563

±

Замечаний:
0% ±


Excel 2013, 2016

VictorM, привет
можно, например, установить св-во Tag = «eee» (в окне свойств) для полей, обязательных для заполнения. И тогда так
[vba]

Код

Private Sub CommandButton1_Click()
Dim tBox As Control
For Each tBox In Me.Controls
     If TypeOf tBox Is MSForms.TextBox Then
         If tBox.Tag = «eee» Then
             If tBox.Value = «» Then
                 MsgBox «Не тупи, заполни поле «»» & tBox.Name & «»»»
                 tBox.SetFocus
                 Exit For
             End If
         End If
     End If
Next
End Sub

[/vba]


Яндекс.Деньги 4100159601573

 

Ответить

Serge_007

Дата: Среда, 12.08.2015, 20:40 |
Сообщение № 10

Группа: Админы

Ранг: Местный житель

Сообщений: 15888


Репутация:

2623

±

Замечаний:
±


Excel 2016

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

Привет, Виктор:
Более простой вариант (обязательны к заполнению только TextBox1 и TextBox2):
[vba]

Код

Private Sub CommandButton1_Click()
     If Me.TextBox1 = «» Or Me.TextBox2 = «» Then
         MsgBox «Не тупи, заполни обязательные поля!»
         TextBox1.SetFocus
         End If
End Sub

[/vba]


ЮMoney:41001419691823 | WMR:126292472390

 

Ответить

AndreTM

Дата: Среда, 12.08.2015, 20:46 |
Сообщение № 11

Группа: Друзья

Ранг: Старожил

Сообщений: 1762


Репутация:

498

±

Замечаний:
0% ±


2003 & 2010

Serge_007, вариант хоть и имеет право на существование :) но не удовлетворяет условиям задачи никак…
Первое, там динамически формируемые текстбоксы, так что и код твоей процедуры придется тоже динамически реформировать, но это ладно… Или — а зачем при незаполненном TextBox2 (и заполненном TextBox1) ставить фокус на TextBox1? :D

Она вообще осталась от макроса в посте №6

Ты от ответа не уходи — нету в том посте никаких TextBox1.SetFocus :)


Skype: andre.tm.007
Donate: Qiwi: 9517375010

Сообщение отредактировал AndreTMСреда, 12.08.2015, 21:36

 

Ответить

VictorM

Дата: Среда, 12.08.2015, 20:53 |
Сообщение № 12

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 161


Репутация:

27

±

Замечаний:
0% ±


nilem, да, код интересный, буду пробовать, спасибо.
Serge_007, такой вариант у меня был задуман с самого начала, НО проверять нужно, допустим, 15-18 текстбоксов и только 2-3 из них необязательные.
Получается, что нужно прописывать проверку всех обязательных?
муторно это.

Сообщение отредактировал VictorMСреда, 12.08.2015, 20:56

 

Ответить

Serge_007

Дата: Среда, 12.08.2015, 20:53 |
Сообщение № 13

Группа: Админы

Ранг: Местный житель

Сообщений: 15888


Репутация:

2623

±

Замечаний:
±


Excel 2016

там динамически формируемые текстбоксы

Каюсь — не читал…

Главное — а нафига при незаполненном TextBox2 ставить фокус на TextBox1?

Андрей, в чем тут «Главное«?! Убери эту строку. Ну или поменяй по-другому. Она вообще осталась от макроса в посте №6

проверять нужно, допустим, 15-18 текстбоксов и только 2-3 из них необязательные

Тогда вариант Николая предпочтительнее, конечно :)


ЮMoney:41001419691823 | WMR:126292472390

 

Ответить

VictorM

Дата: Среда, 12.08.2015, 20:57 |
Сообщение № 14

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 161


Репутация:

27

±

Замечаний:
0% ±


Тогда вариант Николая предпочтительнее, конечно

Да, вот и я решил остановиться на этом варианте.
Спасибо всем за помощь!

 

Ответить

Проверка типов данных (числовых и текстовых) (Visual Basic for Applications)

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

1. Программа для проверки «Вводятся ли положительные числовые данные?»

Private Sub TextBox1_Change()

If TextBox1.Value < 0 Then

MsgBox «Числа не должны быть отрицательными!», vbOKOnly + vbInformation, «Error»

TextBox1.SetFocus

End If

If Not IsNumeric(TextBox1.Text) And Len(TextBox1) <> 0 Then

MsgBox «Вводить необходимо числовые данные», vbOKOnly + vbInformation, «Error»

TextBox1.Value = «»

TextBox1.SetFocus

End If

End Sub

2. Программа для проверки «Вводятся ли текстовые данные?»

Private Sub TextBox3_Change()

If IsNumeric(TextBox3.Text) And Len(TextBox3) <> 0 Then

MsgBox «Вводить надо текстовые данные!», vbOKOnly + vbInformation, «Error@»

TextBox3.Value = » «

TextBox3.SetFocus

End If

End Sub

Пояснения:

SetFocus – устанавливает фокус на вызвавшем этот метод элементе управления (в данном примере на TextBox). Часто применяется в программах обработки ошибок

IsNumeric – функция проверки типов – является ли переменная числовым значением

Len – возвращает число символов строки

Like this post? Please share to your friends:
  • Excel vba if target column
  • Excel vba if sum of range
  • Excel vba if statements and
  • Excel vba if starts with
  • Excel vba if sheet visible