VBA Object Libraries, Early & Late Binding (Серия VBA 34)
Вставка
- Опубліковано 3 кві 2020
- Привет. В предыдущем видео, где мы рассматривали инструмент VBA Dictionary, мы также коротко коснулись и темы библиотек объектов других программ, которые можно подключать во время работы с VBA. Тогда я сказал, что данную тему мы подробно рассмотрим в следующем видео. Именно это в сегодняшнем видео мы и сделаем.
В этом видеоуроке мы с тобой поговорим о том, как можно подключать библиотеки других программ в Excel при работе с VBA, и рассмотрим для чего это делается. Кроме того, тема библиотек объектов в VBA непосредственно связана с такими определениями как Early Binding и Late Binding. Данные две темы мы также рассмотрим в данном видеоуроке.
Так, мы ответим на вопрос, в чём заключаются преимущества Early Binding и Late Binding друг перед другом, в каких ситуациях каждый из этих подходов следует использовать и, кроме того, мы поговорим о том, как можно комбинировать использования этих обоих подходов для достижения оптимальных результатов в процессе написания кода.
Для того же, чтобы весь процесс был интересным и интерактивным, рассматривать эти темы мы будем на примере взаимодействия Excel и Outlook. Кроме того, в конце этого видео я тебе дам упражнение, с помощью которого ты сам научишься выстраивать взаимодействие между двумя программами, потренируешься в области взаимодействия нескольких процедур в VBA, а также укрепишь знания по использованию циклов (For/For Each) и условных структур (If) в VBA.
В общем поверь, в этом объемном видео ты точно найдёшь интересные и полезные для себя моменты.
Приятного просмотра! 😊
P.S.: Вот ссылка на скачивание файла для упражнения:
drive.google.com/open?id=1Uuf...
Господи, спасибо тебе за что я наконец таки нашел великолепный канал про VBA =)
Здравствуйте, Роман!
Очень рад что Вы вышли на мой канал - добро пожаловать :)
Если будут какие-либо вопросы - всегда пишите :)
С уважением и хороших Вам выходных,
Билял
@@BilyalKhassenov а я то как рад! Большое спасибо за Ваш труд.
Всегда пожалуйста 😊
Билял, Спасибо тебе огромное! Как всегда все доступно, все по полочкам разложено! Успехов тебе! Хочется ещё видео про outlook, объектная модель, пространство имён и особенно интересно работа с адресными книгами
Здравствуйте,
большое спасибо за Ваш комментарий! Рад, что мои видео полезны и помогают Вам. В дальнейшим обязательно уделю внимание интересующим Вас темам :)
С уважением и хороших Вам выходных,
Билял
Спасибо, Билял
Билял, огромное спасибо! Очень понравилось и содержание и подача материала, просто супер!
Спасибо за урок, все доходчиво и понятно. Сделал все без особых проблем, даже уже радостно становится, что получается так решать задачи) Даже себе на почту наспамил писем)
Спасибо большое за познавательные видео.
Спасибо!
Билял, спасибо за качественный материал!
Здравствуйте, Фарид!
Спасибо за Ваш комментарий 😊
С уважением и хороших Вам выходных,
Билял
Спасибо за труд!
Спасибо за полезные уроки! Может быть когда-нибудь снимите видео о том, как создать «Задачу - напоминание» в Outlooke из Excel, в файле, которого например есть таблица с 5 столбцами в которых имеется информация о сдаче экзаменов, о которой необходимо напомнить - 1. ФИО, 2. Дата, 3. Время, 4. Название напоминания, 5. Текст напоминания
Здравствуйте!
Записал в заметки - как-нибудь обязательно постараюсь снять такое видео 😊
С уважением и хорошего Вам дня,
Билял
Билял, Ваш постоянный подписчик снова с благодарностью и восхищением!!! Наиполезнейшая тема и наилучшее её обозрение! Вы умница и труженик! Безупречный доклад! Спасибо Вам! Как всегда, мой вопрос: как работать с программами, не относящимися к семейству Microsoft? Меня, например, интересует Автокад)) в совокупности с Excel (VBA)!
Здравствуйте, Евгений!
Большое спасибо за Ваш комментарий, рад, что видео было для Вас полезным 😊
На Ваш же вопрос, боюсь, к сожалению, невозможно ответить коротко. Единственное что могу сказать по взаимодействию автокада и VBA - это то, что редактор VBA по умолчанию не интегрирован в автокад, и его нужно догружать отдельным пакетом. Тем не менее это несложный процесс, и в принципе дальнейшее выстраивание взаимодействия автокада с VBA, при условии наличия знаний объектов автокада и их свойств, не должно быть проблематичным и производится по уже знакомым общим принципам работы в VBA.
Возможно, когда-нибудь я постараюсь снять видео на подобную тему, но это скорее всего будет не скоро.
Желаю Вам оставаться здоровым, Евгений, в текущей ситуации с коронавирусом!
С уважением и хорошего Вам дня,
Билял
Билял Хасенов - Excel & VBA Спасибо Билял! Будем изучать)!
@@BilyalKhassenov По-моему, VBA-редактор по умолчанию встроен в АвтоГад, по крайней мере, об это много где упоминается в интернете. За видео-уроки отдельное спасибо и жирный лайк. Ваша подача материала может служить примером для многих интернет-коучей :)
классные уроки
Спасибо за ваш труд Билял. Можете прикрепить файл для упражнений? Спасибо.
Здравствуйте, Хабиб!
Большое спасибо за Ваш комментарий - я и вправду совсем забыл загрузить файл для упражнений. Ссылку на файл в Google Drive вписал в описание к этому видео и также дублирую в этом ответе на Ваш комментарий:
drive.google.com/open?id=1UufZ0o9yMkw4iASGI2qEDck6BHhrLS3N
Если будут какие-либо вопросы - всегда пишите!
С уважением и хороших Вам выходных,
Билял
Здравствуйте.
Office 2021. Обновлено "на сейчас". Раннее подключение библиотеки Microsoft Outlook 16.0
Вопрос:
Почему при запущенном OUTLOOK на строке
Set appOutlook = New Outlook.Application
возникает ошибка Run-time error '429'?
При закрытом OUTLOOK рассылка работает, но только при отсутствии строки
NewMail.Display
внутри цикла рассылки, иначе на строке
Set NewMail = appOutlook.CreateItem(olMailItem)
вылетает ошибка
Run-time error '462'.
Если попробовать запустить OUTLOOK во время работы макроса - не получается, "... Разные версии OUTLOOK не могут работать одновременно..."
Есть подозрение, что позднее подключение может решить эту проблему.
Заранее спасибо.
Как можно скопировать готовый UserForm и вставить на эту же книгу, то есть дублировать? Спасибо.
Здравствуйте, Хабиб!
Для этого Вам надо переименовать пользовательскую форму, лучше всего в отдельной копии Вашего xlsm файла - и дописать, например, слово "_Copy" в конце названия формы. Затем щёлкаете правой кнопкой мыши -> Export File -> Сохраняете в нужной Вам папке.
И уже после этого Вы можете импортировать эту локально сохранённую форму в Ваш xlsm-файл (щелчок правой кнопкой мыши по папке Forms в VBA -> Import File). Таким образом у Вас появится копия формы.
С уважением и хорошего Вам дня,
Билял
Билял, привет! В своем решении домашнего задания ты из процедуры в процедуру передаешь переменную (rgCellChecked) типа Range, а потом в целевой процедуре оперируешь сдвигами с переданным значением, не прописывая заново путь (например, Workbooks().Worksheets().Range() ) к исходному диапазону. Я правильно понимаю, что при передаче переменной типа Range (ну и вообще переменных именно с объектами) передаются также и остальные свойства объекта, а не только явно отраженное содержимое?
Здравствуйте, Николай!
Да, Вы всё верно поняли - переменные содержат в себе всю связанную с объектом информацию, и именно этим они прекрасны и важны. Кстати, легче воспринимать объектные переменные как ссылки на реальные объекты, об этом можете подробнее узнать из следующего видео: ua-cam.com/video/PLaDtatnJjM/v-deo.html
С уважением и хороших Вам выходных,
Билял
Благодарю за отличный развернутый урок! А нет ли способа программно подключать или выключать библиотеки, через доступ к Среде VBA и управления настройками проекта? Тогда удалось бы объединить преимущства позднего и раннего связываний.
Спасибо за урок и за задачку! Решил сам, но в рамках одной процедуры. Сделал динамический массив, чтобы была возможность отправки писем автоматически при добавлении клиентов. Немного поломал голову с переносом текста на другую строку. В итоге тоже нашел vbNewLine.
Заметил одну проблему: при отправке или при закрытие письма (miNewMail.Send/ miNewMail.Close olDiscard) при повторении цикла со следующим клиентом выскакивает ошибка Run-time error '462': The remote server machine does not exist or is unavalible.
При этом, если с письмом ничего не делать (не закрывать или не отправлять), цикл работает корректно
Здраствуйте, подскажите вопрос. При запуске макросов выскакивает надпись Can t find project or library, это говорит о том что у меня не подключены библиотеки ? Пытаюсь дальше включить Tools/Peferences - выскакивают не активации библиотек а password, Это значит кто то в этих настройках поставил пароль ??
Здравствуйте Билял.
Подскажите, пожалуйста, как вставить таблицу в outlook? И как вставить файл excel в outlook?
Спасибо!
Отличный канал! Спасибо за граммотное изложение материала. А возможно ли с Эксель отправлять смс сообщение с персональной информацией?
Здравствуйте, Алексей!
Всегда пожалуйста, рад помочь! 😊
Напрямую из Excel отправлять СМС невозможно - но, возможно, есть Add-In сторонних разработчиков (скорее всего платные). В принципе, также можно было бы рассмотреть вариант с отправкой СМС через Internet Explorer с сайтов с подобными услугами.
С уважением,
Билял
Подскажите у меня нет MICROSOFT OUTLOOK 16.0 OBJECT LIBRARY. Нет в принципе не чего на Outlook/
А если я решу писать в late binding, то где искать значение констант?
Здравствуйте, Билял. Есть такая трудность в Excel. Есть массив цифр, например 1, 2, 3, 4 7, 9, 12, 13, 14, 15, 18. Мне нужно представлять их как 1-4, 7, 9, 12-15, 18. То есть все цифры которые идут по порядку должны для краткости писаться через тире, ну а те которые не по порядку должны перечисляться через запятую. Помогите, пжста, написать подобный код. Спасибо!
Здравствуйте, Сергей!
Я быстро набросал следующий вариант, работающий как вспомогательный макрос. Попробуйте его:
Sub groupNumbersInAnArray(ByRef varArrNumbersToGroup As Variant)
Dim lngCounter As Long
Dim lngCurrentGroupStart As Long
Dim lngCurrentGroupEnd As Long
Dim lngLastAddedToTheGroup As Long
Dim boolNewGroupIsToStart As Boolean
boolNewGroupIsToStart = True
Dim collGroupsDone As New Collection
lngCurrentGroupStart = varArrNumbersToGroup(1, 1) 'Group start
lngLastAddedToTheGroup = varArrNumbersToGroup(1, 1)
boolNewGroupIsToStart = False
If UBound(varArrNumbersToGroup, 1) = 1 Then
MsgBox "Всего одно значение в массиве! Для групирования значений должно быть больше значений в массиве!", vbInformation
Exit Sub
Else:
For lngCounter = 2 To UBound(varArrNumbersToGroup, 1)
If varArrNumbersToGroup(lngCounter, 1) = lngLastAddedToTheGroup + 1 Then
lngLastAddedToTheGroup = varArrNumbersToGroup(lngCounter, 1) 'Current group continues
Else: 'Closing the Group
If lngCurrentGroupStart lngLastAddedToTheGroup Then
collGroupsDone.Add lngCurrentGroupStart & "-" & lngLastAddedToTheGroup
lngCurrentGroupStart = varArrNumbersToGroup(lngCounter, 1) 'New group start
lngLastAddedToTheGroup = lngCurrentGroupStart
Else:
collGroupsDone.Add lngCurrentGroupStart
lngCurrentGroupStart = varArrNumbersToGroup(lngCounter, 1) 'New group start
lngLastAddedToTheGroup = lngCurrentGroupStart
End If
End If
'Adding the last one
If lngCounter = UBound(varArrNumbersToGroup, 1) Then
If lngCurrentGroupStart lngLastAddedToTheGroup Then
collGroupsDone.Add lngCurrentGroupStart & "-" & lngLastAddedToTheGroup
Else:
collGroupsDone.Add lngCurrentGroupStart
End If
End If
Next lngCounter
'Chaning the array
Erase varArrNumbersToGroup
ReDim varArrNumbersToGroup(1 To collGroupsDone.Count, 1 To 1)
For lngCounter = 1 To collGroupsDone.Count
varArrNumbersToGroup(lngCounter, 1) = collGroupsDone.Item(lngCounter)
Next lngCounter
End If
End Sub
Как было сказано, макрос был быстро написан. Я него немного потестировал, надеюсь учёл все нюансы. Вы потестируйте тоже его, и сообщите мне, пожалуйста, если будут какие-заметки 😊
С уважением,
Билял
2021