TextBox & CommandButton VBA - Передача значений - UserForms (10)
HTML-код
- Опубликовано: 13 сен 2024
- Ссылка на скачивание файла в версии из этого видео: drive.google.c...
Привет! Давай продолжим изучение пользовательских форм в VBA. В рамках нашей серии практических видео по созданию формы с нуля мы сегодня разработаем собственные алгоритм передачи данных из пользовательской формы в Data Table, умной таблицы, принцип работы которой мы рассмотрели в предыдущем видео.
В этом видео мы добавим на разрабатываемую пользовательскую форсу элементы управления следующих двух типов - TextBox и CommandButton, пропишем им стандартизированные тэги и разработаем базирующийся на цикле For Each принцип проработки отдельных элементов управления.
Приятного просмотра! 😊
Билял, очень красиво и элегантно! Возьму на вооружение. Спасибо!!!
Здравствуйте, Дмитрий!
Большое спасибо за Ваш комментарий, очень рад, что видео Вам понравилось 😊
С уважением и хорошего Вам дня,
Билял
Как раз в мою тему !
Занимаюсь арендой авто .Фирма маленькая еще поэтому пока все записи на бумаге . Но тут недавно увидел в интернете видео на английском система бронирования для отелей в эксель .Меня очень заинтересовало и после этого начал вникать в эксель . По английский понимаю и говорю но не на столько .к тому же он рассказывает очень быстро и без подробностей . Интернет мне в помощь - Начал рыться на русских сайтах и форумах не чего похожего нет . На одном из форумов направили можно так сказать на путь и показали несколько возможностей эксель по моей теме и мол "а дальше сам "но и на этом спасибо ! Начал искать как видео по Usreform нашел вас. Стал смотреть весь плэйлист ,но вы превзошли все мои ожидания ! я же говорю на русских ресурсах не чего похожего нет НИ по отелям НИ по аренде авто .
Еще бы создали видео "как данный с формы заказа внести в диаграмму "
Было бы СУПЕР !
Респект !
подписываюсь
Спасибо за труд!
Здравствуйте, Александр!
Рад стараться! И спасибо за Ваш комментарий! 😊
С уважением,
Билял
Спасибо, Вам, Билял, за все Ваши ролики! Все круто - быстро, где можно "прокрутить"; помедленней, где нужно повнимательней посмотреть; плюс в отличие от подавляющего большинства авторов обучающих роликов у Вас еще и с английским проблем нет, а то слушаешь некоторых, аж выключить хочется )) ...Хотя слово "wrap" все-таки произносится как "рэп", а не "роп" (в каком-то предыдущем ролике) :)... Так держать!
Здравствуйте!
Большое спасибо за Ваш комментарий и за заметку касательно произношения слова Wrap - взял себе на заметку 😉 Очень жаль правда, что в загруженных видео этого уже никак не изменить. Но да ладно!
В остальном же, очень рад, что Вы попали на мой канал - приятного просмотра! 😊
С уважением и хороших Вам выходных,
Билял
Супер! Билял, мастерское исполнение и объяснение! Осваиваю VBA благодаря Вам.
Спасибо Билял!
Здравствуйте, Сергій!
Всегда пожалуйста! 😊
С уважением и хорошего Вам дня,
Билял
Интересно, но добавления данных надо упростить. Конечно хорошо сделать динамический, но сложно для новичков, а также для визуального восприятия. Думаю это обоснованно когда на форме очень много элементов (поля для ввода). Также знаю, что много элементов на форме не рекомендуется.
Желательно при проверке подсказывать через MsgBox какие поля необходимо обязательно заполнять и передать фокус.
С другой стороны один раз написал код и забыл, возьму на заметку. Буду усовершенствовать с учётом выше сказанного, но только при проверке. Добавления данных предпочитаю без заморочками по примеру ниже.
Огромное спасибо за труд!
Пример:
'Добавить в конец
Public Sub AddListRowEnd(strNameListObj As String, strRowData1 As String, strRowData2 As String, strRowData3 As String)
Dim ListObj As ListObject
Dim ListRow As ListRow
Set ListObj = wsSettings.ListObjects(strNameListObj)
Set ListRow = ListObj.ListRows.Add(AlwaysInsert:=True)
With ListRow
.Range(1) = strRowData1
.Range(2) = strRowData2
.Range(3) = strRowData3
End With
End Sub
Место strRowData можно передать одноуровнненый массив данных ...
Здравствуйте, Севак!
Всегда пожалуйста и большое спасибо за Ваш комментарий и альтернативный вариант кода 😊
С уважением и хорошего Вам дня,
Билял
Согласен слишком заморочено для новичков, мне просто нужно добавить чертову строку из 6 значений, а я 20 минут слушаю как циклы внесения проверяют циклы проверки и про сплит....:(
@@lemuriecnoname согласен, но можно было сперва простейший вариант показать а потом накручивать проверку данных
@@lemuriecnoname спасибо кэп, а то я думал его под дулом автомата заставили именно так сделать.
Спасибо за урок. Круто объясняешь
Спасибо!
Как вариант, способ присвоения созданной строки, переменной, в одной строке:
Dim lo As ListObject
Set lo = ActiveSheet.ListObjects("Таблица1")
Dim row As ListRow
Здравствуйте!
В чём может быть ошибка
Код повторил как у вас в уроке, но при добавлении записи ошибку показывает в строке (специально сравнил код с фала из следующего урока)
Intersect(rgNewOrderLine, listobjOrderList.ListColumns(strTagArray(0)).DataBodyRange) = objControlChecked.Value
Пишет subscript out of range. и строка подчёркивается жёлтым
Здравствуйте!
Subscript out of Range обычно говорит о том, что нет указываемого столбца в умной таблице - то есть, скажем, Вы обращаетесь к listobjTest.ListColumns(“Проверка1”).DataBodyRange, а в таблице нет столбца, который называется “Проверка1”.
Посоветовал бы проверить в этом направлении 😊
С уважением,
Билял
Была подобная ошибка, исправил, сделав заголовки таблицы и теги заглавными в кириллице
м-да... не для новичков. есть моменты совсем не понятные...запускаю просмотр 4 раз))
Привет! Билял очень позновательные видео я почти все пересмотрел.
У меня вопрос в пользовательской форме комбобокс не вставляет значение в ячейку проверял несколько раз на ошибки все отлично. может ли проблема в экселе или в области ячеек 🤔
Спасибо за такие видео! Вопрос только возник: как сделать или что изменить, чтобы данные вписывались в таблицу на другом листе в этой же книге. В основную таблицу все вписывает и все работает, а во вспомогательной таблицы на другом листе создаются только строки, а данные не вписываются(если таблицу перенести на этот же лист, то через махинации будет тоже записываться, но не хочет записывать данные именно на другом листе книги)
П.с. значение переменной, относящиеся к данной книге и листу менял, все работает, просто значения не вписываются
Очень жду продолжения!
Здравствуйте!
Для этого Вам придётся поправить сам алгоритм внесения значений таким образом, чтобы он распознавал, в какую именно таблицу (основную или вспомогательную) нужно вносить значения. Подобное указание можно вписывать в тэги элементов управления формы, например:
ИмяЛиста_ИмяDataTable_ИмяСтолбца_ EmptyNotAllowed/EmptyAllowed
И, следовательно, поправить алгоритм пришлось бы так, чтобы он использовал данные из тэга и соответственно записывал значения.
С уважением и хороших Вам выходных,
Билял
P.S. Пример расширения структуры тэгов элементов управления представлен в следующем видео этого плейлиста 😊
Очень подробно, но сложно для восприятия.
Если бы мы изучали алфавит: А, Б, В, Г, Д и т.д., то выглядело бы это примерно так:
Вот буква «А» с нее начинаются такие слова как: Арбуз, Автобус, Антресоль. Но может она стоять еще и на втором и третьем месте: Аарон, Анатолий. Также их может быть и по нескольку в слове. Например Ананас, Анатомия.
В принципе, буква А не обязательно должна быть на первом месте, хотя является наиболее употребимой буквой в русском алфавите.
Если рассматривать использование буквы а в частях речи, то ее значение….. ну и так далее.
Пока дойдешь хотя бы до буквы Д, уже и забудешь с чего начинал.
Подробности важны, но они должны быть к месту, а не лишней информацией в контексте изучаемой темы.
У меня стояла простая задача: создать с помощью vba диалоговое окно с единственным текстовым полем, в которое вписывалось бы значение, добавляемое в таблицу.
Убил уже 3 дня, но так еще и не смог реализовать свою задачу.
Зато узнал про циклы.
Спасибо! Очень доходчиво! Вопрос: как в TextBox на форме вставить текущую дату по умолчанию? Спасибо
Здравствуйте!
Спасибо за Ваш комментарий!
Поскольку текущая дата динамична и изменяется изо дня в день, я бы вписывал её на Вашем месте в текстбокс при инициализации формы, например вот так:
Private Sub UserForm_Initialize()
Me.TextBox1.Value = Application.WorksheetFunction.Text(Date, "DD.MM.YYYY")
End Sub
С уважением и хороших Вам выходных,
Билял
P.S. Функцию Text я применил для отображения даты в формате "ДД.ММ.ГГГГ", иначе дата будет вписываться в американском формате
Bill K. - Excel & VBA, спасибо!
Билял, приветствую. Про подписи автоматически исчезающие в текст боксах ты не рассказывал в итоге в других видео или я что то пропустил ?
Доброго дня ! напишите пож ... будет продолжение.... форму мы не доделали... 13 урок прошёл
Здравствуйте, Анатолий! Продолжение будет, правда пока не могу сказать, когда именно, так как сейчас делаю упор на новые плейлисты.
С уважением,
Билял
Билял, подскажи пожалуйста, как сделать событие следующего характера. При вводе в текст бокс значения ( В моем случае цифры) , эта цифра в он лайн отображается в заданной ячейке на листе. То есть ввел я 1, тут же в ячейке а1 появилась 1, продолжаю вводить, 2, (12 число уже получилось) в ячейке отобразилось 12 итд. Без кнопки запись или провести.
Сто раз пересмотрела ролик, ошибки не вижу, но почему то из моей польз формы заполняются всего 2 столбца, в чем дело не знаю.
сначала была ошибка в строке set, поменял listobjects с orderlist на 1 после ошибка в строке intersect, вот с ней не знаю что делать
буду рад если кто-то поможет
Доброго времени суток! Очень полезные и обучающие видео по VBA у вас! Спасибо большое)
Скажите пожалуйста у вас можно взять несколько платных уроков,
не могу закончить свой проект по VBA. Очень нужна помощь в написании кода VBA.
Заранее Благодарю!
Билял, здравствуйте! Подскажите, как можно доработать предложенный Вами код проверки заполненных TextBox только на одной странице MultiPage в UserForm?
Не добавляется строка(((
"method add of object listrows failed"
Я конечно скорее всего ошибаюсь. Но такое ощущение, что функционал такой таблицы такой же как и в случае, если делать это самым простым способом, как было показано в начале видео.
У меня вопрос. Я делаю игру крестики нолики, и чтобы для каждой кнопки не писать в каждом Private sub CommandButton1_Click1()
CommandButton1.Text="X" или "O"(через if..else)
я хотел уменьшить код/сделать отдельную программу, которая работала бы для всех 9 кнопок сразу, т.е. нажимая на любую кнопку выполнялась команда выбора "X" или "O"
Нашёл как это работает в C#там (не знаю ли поможет это объяснить проблему)
Private void CommandButton1_Click1( object sender, EventArgs e)
И потом каждый клик на кнопку заполняли таким образом
Button senderB= (Button) sender а потом уже просто определяли Х или О ставить
, но в vba никак не могу нагуглить как сделать нечто подобное, ничего толкового не выдает, можете подсказать как это сделать ?Буду премного благодарен
Здравствуйте, Андрей!
По этой ссылке можете скачать пример, с одним из возможных вариантов решения Вашей задачи:
drive.google.com/file/d/1pe6eqHt6IQ-4X6i_w-h5El_Bu0XbTYdN/view?usp=sharing
В нём я добавил два опшнбаттона, которые указывают, какой игрок (Х или О) ходит следующим. Нажатие каждой из кнопок посылает во вспомогательную процедуру putXorO своё название. Эта процедура сперва проверяет с помощью опшнбаттонов, какой игрок ходит следующим. Если это Х, то соответствующий символ вписывается в переменную strSignToPut. В противном случае «О».
После этого при помощи Me.Controls в коммандбаттон, по которому было произведено нажатие, вписывается символ из переменной.
Посмотрите файл и потестируйте его. Надеюсь, предложенный вариант сможет Вам помочь! 😊
С уважением и хороших Вам выходных,
Билял
@@BilyalKhassenov Огромное спасибо! т.к. надо было уже сдавать, сделал все в лоб, меня интересует один вопрос, я тоже пытался сделать через ByVal, но не получалось. Так вот почему, когда мы вызываем функцию через Call, то в скобочках указываем("CommandButton33"), а там куда эта переменная уходит в скобочках стоит(ByVal strCommandButtonName уже), я почему-то думал, что та переменная, которую мы "отправляем" и должна приниматься, т.е. Call putXorO("CommandButton33"), Sub putXorO(ByVal CommandButton33 As String), я правильно понимаю, что при вызове можно отправить значение, а там где оно принимается можно просто задать сразу переменную, т.е. будет так strCommandButtonName="CaommandButton33". Момент c Me.Controls прям открывает глаза, все думал над тем как сделать, чтобы каждый раз при выборе Х или О выбиралась правильно нужное имя кнопки, теперь понял. Еще раз спасибо!Кстати игру сделать такую, чтобы можно было играть против компьютера, правда логика его ходов рандомная, т.к. более сложная не требовалась да и неохота было делать :)
К первому моему сообщению. И в обратном направлении. В конкретной ячейке появилось значение, оно отображается на листбокс 2 уже. В двух словах зачем мне это.
В лист бокс1 ввод В значение, оно автоматом записывается в ячейку, в соседнюю ячейку по критерию из а1 подтягиваются значение из таблицы и возвращается в листбокс 2. Почему так, потому что мне проще работать с листами, чем с формами.
Заранее спасибо. Ты и так очень сильно помог.
Здравствуйте, Алексей!
Всегда пожалуйста, рад что помог! 😊
В Вашей задаче придётся воспользоваться событийной процедурой Change нужного текстбокса. То есть в нём будут отслеживаться все изменения и сразу же вноситься в нужную ячейку. Вероятнее всего придётся поиграть с модальностью формы.
С уважением,
Билял
@@BilyalKhassenov спасибо. С уважением.
Ох не получается ... уперся!!! не пойму что день потерял!!
Доброго времени суток, Билял. Помогите разрешить мой ступор. Я только начинаю заниматься VBA.
Не получается передать значение глобальной переменной в форму.
В VBAProject в папке Forms созданы две формы UserForm1 и UserForm2. В них пользователь вводит некоторые данные, которые затем будут помещены в таблицу по определенным столбцам в заданной ранее строке N. Переменная N объявлена как глобальная и помещена в начало программы. Значение ей присваивается в вызываемой подпрограмме Cell
пример:
Public N As Integer
___________________________________ ___________________________________ ______________
Public Sub First() 'модуль2
Call Cell 'модуль4, в нем N получает значение из Input
UserForm1.Show 'форма в которой используется переменная N но приходит сюда как равная ноль
, хотя значение её из Input не ноль
UserForm2.Show 'cюда N также входит как 0
End Sub
Что надо прописать еще , чтобы формы увидели значение N
Всем привет. А у меня выдает ошибку на строчке (Set listobjOrderList = ThisWorkbook.Worksheets("Исполнительная по электрике").ListObjects("OrderList"))
run-time error 9 subscript out of range
очень очень замороченно, в начале же начал просто писать, подскажи пожалуйста как просто добавлять в последнюю строку значение из формы без этих всех тегов и циклов
Вылетает ошибка, что проверяемый объект не может иметь свойство value. Интересно, где ошибка на самом деле :) Upd: Акела промахнулся и подписал тэги к labelам а не к textboxам :) а код абсолютно верный!
А с вами можно както связатсья ?
2021
3 РАЗА НАБИРАЛ...НЕ РАБОТАЕТ...простите
я случайно наткнулся на это видео и уже 2 день пытаюсь повторить код, он идентичный с тем что даеться в уроке, но по итогу выдет ошибку 9 (out of range) в чем причина пока не разобрался. Вердикт код не работет спустя 3 года я думаю что причина такова.
Intersect(rgNewOrderLine, listobjOrderList.ListColumns(strTagArray(0)).DataBodyRange) = objControlChecked.Value
когда начинаешь проверять через дебаг эта страка дется ошибку 9
решил скачать сам файл разработчика и такая же ошибка.
Intersect функцию напиши с большой буквы))) За два ня можно было профиксить ошибку и исправить
Спасибо!