Хитрости »
24 Февраль 2012 91372 просмотров
Иногда бывает необходимо перенести что-то из Excel в другое приложение. Я возьму для примера Word. Например скопировать ячейки и вставить. Обычно мы это так и делаем — скопировали в Excel, открыли Word — вставили. Но сделать это при помощи кода чуть сложнее, хотя если разобраться никаких сложностей нет. Ниже приведен пример кода, который открывает Word, открывает в нем определенный документ, копирует данные из Excel и вставляет в открытый документ Word.
Sub OpenWord() Dim objWrdApp As Object, objWrdDoc As Object 'создаем новое приложение Word Set objWrdApp = CreateObject("Word.Application") 'Можно так же сделать приложение Word видимым. По умолчанию открывается в скрытом режиме 'objWrdApp.Visible = True 'открываем документ Word - документ "Doc1.doc" должен существовать Set objWrdDoc = objWrdApp.Documents.Open("C:Doc1.doc") 'Копируем из Excel диапазон "A1:A10" Range("A1:A10").Copy 'вставляем скопированные ячейки в Word - в начала документа objWrdDoc.Range(0).Paste 'закрываем документ Word с сохранением objWrdDoc.Close True ' False - без сохранения 'закрываем приложение Word - обязательно! objWrdApp.Quit 'очищаем переменные Word - обязательно! Set objWrdDoc = Nothing: Set objWrdApp = Nothing End Sub
Скачать пример:
Tips_Macro_OpenWord.xls (49,5 KiB, 6 261 скачиваний)
В файле-примере, приложенном к данной статье, в комментариях к коду есть несколько добавлений. Например, как вставить текст из ячеек в определенные закладки Word-а и как добавить новый документ, а не открывать уже имеющийся. Так же так есть код проверки — открыто ли приложение Word в данный момент. Порой это тоже может пригодиться, чтобы работать с запущенным приложением Word, а не создавать новое:
Sub Check_OpenWord() Dim objWrdApp As Object On Error Resume Next 'пытаемся подключится к объекту Word Set objWrdApp = GetObject(, "Word.Application") If objWrdApp Is Nothing Then 'если приложение закрыто - создаем новый экземпляр Set objWrdApp = CreateObject("Word.Application") 'делаем приложение видимым. По умолчанию открывается в скрытом режиме objWrdApp.Visible = True Else 'приложение открыто - выдаем сообщение MsgBox "Приложение Word уже открыто", vbInformation, "Check_OpenWord" End If End Sub
В принципе, активировать или вызвать(если закрыто) другое приложение Офиса можно одной строкой:
Sub Open_AnotherApp() Application.ActivateMicrosoftApp xlMicrosoftWord End Sub
но данный метод может пригодиться только в том случае, если Вам необходимо действительно лишь активировать другое приложение, но дальше обращаться к этому приложению Вы уже не сможете.
По сути, методами CreateObject и GetObject можно обратиться к любому стороннему приложению(например Internet Explorer). Куда важнее при обращении к этим объектам знать объектную модель того приложения, к которому обращаетесь. Чтобы увидеть свойства и методы объектной модели приложения, можно в редакторе VBA подключить необходимую библиотеку, объявить переменную, назначив ей тип приложения. Покажу на примере того же Word-а.
Для начала открываем меню Tools -References:
Подключаем библиотеку:
Затем объявляем переменную и присваиваем ей тип нужного приложения:
Sub OpenWord() Dim objWrdApp As Word.Application Set objWrdApp = New Word.Application objWrdApp.Visible = True End Sub
Если теперь в редакторе, внутри этой процедуры в любом месте ниже объявления переменной набрать objWrdApp и точку, то сразу после ввода точки выпадет меню, в котором будут перечислены все доступные методы и свойства этого приложения.
Так же можно нажать F2 и через поиск найти Word и просмотреть все методы и свойства данного приложения.
Метод установки ссылки на библиотеку приложения через Tools—References называют еще ранним связыванием. Подобный метод позволяет создать ссылку на приложение быстрее и, как описано выше, предоставляет разработчику доступ к визуальному отображению свойств и методов объекта. Но есть существенный минус: если в своем коде Вы установите ссылку на Word 12 Object Libbary(Word 2007), то на ПК с установленным Word 2003 получите ошибку MISSING, т.к. Word 2003 относится к библиотеке Word 11 Object Libbary. Подробнее можно прочитать в статье Ошибка — Cant find project or library.
Метод же CreateObject еще называется методом позднего связывания. Применяя его не возникнет проблем с MISSING, очень часто возникающих при раннем связывании. Поэтому я рекомендовал бы при разработке использовать раннее связывание для удобства использования свойств и методов(если Вы их не знаете), а перед распространением приложения в коде заменить все именованные константы(типа wdLine) на числовые константы(для wdLine это 5) и применить позднее связывание. Посмотреть числовое значение константы можно просто записав её в коде, начать выполнение кода через F8 и навести курсор мыши на эту константу. Всплывающая подсказка покажет числовое значение. Так же можно отобразить окно Immediate(View —Immediate Window или сочетание клавиш Ctrl+G), записать вопросительный знак и вставить эту константу и нажать Enter:
?wdLine
ниже будет выведено числовое представление этой константы.
А заменять эти константы их числовыми значениями в случае с поздним связыванием необходимо, т.к. Excel не знает их значений.
Попробую пояснить поподробнее про эти константы и почему их надо заменять какими-то числами: при подключении библиотеки Wordа(Word 12 Object Libbary) мы так же подключаем и все свойства, методы и константы, которые доступны из Wordа. И их использование напрямую становится доступно из Excel и мы можем смело написать что-то вроде wbLine и Excel поймет эту константу. При позднем же связывании мы уже не подключаем библиотеки Word(во избежание ошибок совместимости) и как следствие — методы, свойства и константы Wordа для Excel становятся чем-то неизвестным и не документированным и мы получим ошибку «Variable not defined»(если включена директива Option Explicit) при попытке назначить свойство через wdLine. Если же Option Explicit не включена — то хоть ошибки не будет, но и код будет работать неверно, т.к. для неизвестной для Excel переменной wbLine будет назначено значение 0(Empty). Поэтому и надо все константы другого приложения заменять их числовыми значениями.
Главная ошибка новичка
И хочу так же упомянуть про ошибку, которую очень часто совершают при обращении к одному приложению из другого. Допустим, необходимо скопировать из Word все данные в Excel. Часто начинающие делают это так:
Sub OpenWord() Dim objWrdApp As Object, objWrdDoc As Object 'создаем новое приложение Word Set objWrdApp = CreateObject("Word.Application") 'Можно так же сделать приложение Word видимым. По умолчанию открывается в скрытом режиме 'objWrdApp.Visible = True 'открываем документ Word - документ "Doc1.doc" должен существовать Set objWrdDoc = objWrdApp.Documents.Open("C:Doc1.doc") 'Копируем из Word все данные, обращаясь к объекту Range документа Range.Copy 'вставляем скопированное в ячейку А1 активного листа Excel ActiveSheet.Paste 'закрываем документ Word без сохранения objWrdDoc.Close False 'закрываем приложение Word objWrdApp.Quit 'очищаем переменные Word - обязательно! Set objWrdDoc = Nothing: Set objWrdApp = Nothing End Sub
На строке Range.Copy обязательно получите ошибку от VBA, указывающую, что нужен аргумент для объекта. Можно попробовать добавить этот аргумент: Range(1).Copy. Но все равно получим ошибку. Можно, конечно, указать даже ячейки: Range(«A1»).Copy. Но это приведет к тому, что скопирована будет ячейка А1 активного листа Excel.
Все дело в том, что мы хотим скопировать данные из Word-а, выполняя при этом код из Excel. А у Excel тоже есть объект Range с другими аргументами. И если не указать какому приложению, листу или документу принадлежит Range, то по умолчанию он будет отнесен к тому приложению, из которого выполняется код. Т.е. к Excel. Если совсем кратко об этом — всегда надо указывать какому приложению или объекту принадлежит используемый объект или свойство. Правильно код должен выглядеть так:
Sub OpenWord() Dim objWrdApp As Object, objWrdDoc As Object 'создаем новое приложение Word Set objWrdApp = CreateObject("Word.Application") 'Можно так же сделать приложение Word видимым. По умолчанию открывается в скрытом режиме 'objWrdApp.Visible = True 'открываем документ Word - документ "Doc1.doc" должен существовать Set objWrdDoc = objWrdApp.Documents.Open("C:Doc1.doc") 'Копируем из Word все данные, обращаясь к объекту Range документа 'при этом перед Range явно указываем откуда его брать - из документа Word -objWrdDoc("C:Doc1.doc") objWrdDoc.Range.Copy 'вставляем скопированное из Word в активную ячейку активного листа Excel ActiveSheet.Paste 'закрываем документ Word без сохранения objWrdDoc.Close False 'закрываем приложение Word objWrdApp.Quit 'очищаем переменные Word - обязательно! Set objWrdDoc = Nothing: Set objWrdApp = Nothing End Sub
Вместо Range ту же ошибку делают и с Selection(потому что Selection часто присутствует в записанных макрорекордером макросах), т.к. этот объект есть и в Excel и в Word и без явного указания приложения будет относится к приложению, в котором записано.
В приложенном файле код немного отличается от представленных выше — в нем можно посмотреть как вставить текст из ячеек в определенные(созданные заранее) закладки Word-а. Это удобно для создания бланков в Word и заполнения их через Excel
Скачать пример:
Tips_Macro_OpenWord.xls (49,5 KiB, 6 261 скачиваний)
А в архиве ниже — практически готовое решение заполнения всевозможных бланков Word из Excel. Как это работает. У нас есть таблица Excel с данными для заполнения бланков заявлений на пособия:
Обращаю внимание, что в первой строке расположены метки. Они нужны для того, чтобы код мог понять значения какого столбца в какое место шаблона Word должны попасть. А в самом шаблоне Word мы должны проставить эти самые метки:
Фигурные скобки сделаны для того, чтобы код 100% искал и заменял только метку в шаблоне, исключая при этом замену случайного текста вне скобок(ведь слово «Должность» может встречаться и само по себе).
А здесь я схематично привел то, как будут происходить замены:
Сначала программа создаст новую папку, в которую и будет сохранять создаваемые файлы(имя папки состоит из даты и времени запуска кода). Далее программа циклом пройдется по каждой строке таблицы, создаст на основании шаблона Word(«Шаблон.doc») новый файл для этой строки, заполнит этот шаблона данными на основании меток, и сохранит созданный файл под новым именем. Сам файл шаблона при этом не изменяется — все метки в нем сохраняются как были настроены до запуска кода. Конкретно в приложенном коде значение для имени нового файла берется из первого столбца «ФИО с инициалами». Но это можно изменить в коде при необходимости. Делается это в этой строке:
'считываем фамилию с инициалами
sWDDocName = .Cells(lr, 1).Value
Что еще важно: файл шаблона Word должен находиться в той же папке, что и файл с кодом. Название файла в приложенном к статье файле должно быть «Шаблон.doc». Но его так же можно изменить, не забыв изменив его в коде в этой строке:
'имя шаблона Word с основным текстом и метками Const sWDTmpl As String = "Шаблон.doc"
В общем-то, если хоть чуть-чуть разбираетесь, то поменять можно многое. А для тех, кто не разбирается достаточно будет просто создавать метки в файле Word и обозначать ими столбца в таблице Excel. Количество столбцов и строк в таблице код определяет автоматически и при изменении размеров таблицы ничего изменять не надо. Главное, чтобы метки находились в первой строке, вторая строка — заголовок(необязательно), а с третьей строки начинаются данные, которые и используются для наполнения шаблонов.
Скачать пример:
Автосоздание бланков Word из таблицы Excel.zip (37,6 KiB, 1 468 скачиваний)
Примеры работы с тем же Outlook можно посмотреть в моих статьях:
Как отправить письмо из Excel?
Сохранить вложения из Outlook в указанную папку
Статья помогла? Поделись ссылкой с друзьями!
Видеоуроки
Поиск по меткам
Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика
Содержание
- Excel tools references на русском
- Excel tools references на русском
- Microsoft Excel
- Управление Excel из других офисных программ пакета Microsoft Office
- Controlling One Microsoft Office Application from Another
- Сведения об участниках
- Поддержка и обратная связь
Всем Здравствуйте!
Столкнулся с такой проблемой, скачал макрос, при запуске появляется ошибка «Can’t find project or library»
решение как я понял кроется в Tools-References, надо отключить RefEdit
и когда я наживамаю на Tools, кнопка References не активна (нажать на нее нельзя) как это исправиться? в чем проблема?
весь инет перерыскал, ничего не нашел ((
Это потому, что макрос, выдавший ошибку, не остановлен.
Сначала нажмите кнопку СТОП (например, через меню Run — Reset),
а потом уже пробуйте нажать Tools — References
Ещё вариант — проект с макросами запаролен. (надо сначала снять пароль с проекта VBA)
спасибо, получилось
но теперь возникла другая проблема
там была папка SYSTEM с 6 файлами один из них regdll.bat
в котором содержится
@echo off
copy *.dll %SYSTEMROOT%system32
copy mscomct2.* %SYSTEMROOT%system32
%SYSTEMROOT%system32regsvr32.exe %SYSTEMROOT%system32dsofile.dll
%SYSTEMROOT%system32regsvr32.exe %SYSTEMROOT%system32MSCOMCT2.OCX
после запуска в командной строке написали что копирование прошло успешно
и теперь при запуске Exel с макросом пишет
System Error &H80040111 (-2147221231) Тебуемый класс отсутствует в ClassFactory, а потом
Out of memory
Источник
И нтеграция с другими программами — Макросы в Excel
Не стоит забывать и о возможностях интеграции VBA с другими приложениями. Монополия это конечно плохо, но в данном случае именно монопольное положение Microsoft дало нам столько возможностей по интеграции различных приложений друг в друга.
Итак, с чем и как можно интегрировать VBA?
Текстовые переменные, если они большие, можно хранить в текстовом файле. Это удобно еще и потому, что в этом случае любой человек может редактировать текст, не влезая в код, а значит и не имея возможности его сломать.
‘ объявляем о начале использования такого типа объекта
Set fso = CreateObject(«scripting.filesystemobject»)
‘ открываем нужный файл
Set tS = fso.OpenTextFile(full_name_of_txt-file, 1, True)
‘ присваиваем стринговой переменной весь текст, содержащийся в файле
‘ закрываем текстовый файл
Просмотр файлов в папке
Средствами VBA можно получить список файлов, находящихся в папке, причем не только файлов MS Office, но и всех остальных. Это бывает нужно, например, чтобы открыть все файлы и напечатать, открыть несколько стандартных файлов и агрегировать хранящуюся в них информацию или чтобы просто получить список имеющихся файлов. Для этого можно воспользоваться функцией Dir(путь, тип файла) . Функция возвращает имена файлов из папки.
При первом запуске функция выдает имя первого по порядку подходящего файла из указанной папки. Важно указывать на конце папки, иначе функция выдаст ошибку либо пустое значение. После того, как мы получили имя файла, мы можем его открыть и работать с ним. Потом нам нужно открыть следующий файл из папки. Для этого снова вызываем Dir, но без аргументов. А когда файлы закончатся, функция выдаст пустое значение — «».
Работу функции проще понять на примере.
Допустим, в папке «C:Documents and Settings» лежит три Excel-файла, и мы хотим их открыть.
Тогда наш макрос будет выглядеть так:
dr = Dir(«C:Documents and Settings», vbNormal)
Workbooks.Open(«C:Documents and Settings» & dr)
Подключение VBA к SQL может потребоваться в куче разных мест. Например у меня оно понадобилось совсем внезапно: caption полей в кубе и их key не совпадали. То есть когда я хотела проставить какие-то вещи, я имела их «человеческий» список, а в макрос мне нужно было подставлять «компьютерный». Соответствие одного с другим я и получала в базе.
Сначала запомним в переменную строку подключения, которую будем использовать потом. Её легче всего получить, настроив такое же подключение в Excel и потом просто скопировать оттуда готовую. Она будет примерно такая:
cnstr = «Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Data Source=MyServerName;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation Encryption for Data=False;Tag with column collation when possible=False;Initial Catalog=MyDatabaseName»
Set cn = New ADODB.Connection
‘ указываем, что в этом коннекте у нас будет recordset с именем rs
Set rs = New ADODB.Recordset
‘ открываем коннект с нашей строкой подключения
Затем получаем данные. Обратите внимание, что так как скрипт это всего лишь строка, вы можете подставлять туда разные переменные и др., полученные до этого в коде.
rs.Open «select * from table», cn
Пробег по строчкам recordset-а описывается достаточно странно, работать с ним неудобно. Гораздо удобнее перезаписать данные в массив VBA. Поэтому бежим по строчкам recordset-а
Do While Not rs.EOF
ReDim Preserve arr(i)
Если вам не нужно получать данные, а нужно просто выполнить код, то можно воспользоваться командой execute
StrSql = «insert into ReportByIdList(ID,Name) values(1, report)»
LotusNotes и другие Lotus-приложения.
LotusNotesявляется почтовым клиентом, однако, позволяет делать еще массу других вещей, например, он также является браузером и календарем. Можно совершать различные действия в Lotus, не выходя из Excel’я или Word’а. Скрипт достаточно труден, а подсказок в интернете не так уж и много, но иногда результат оправдывает все потраченные силы.
Начать сессию можно двумя способами.
Способ 1 . Надо поставить галочку в Tools — References на объекты Лотуса, чтоб VBA подгрузил команды и справку Lotus’а. Лучше только одну галку, а то всё будет дублироваться
Dim session As New NotesSession
Способ 2 (в дальнейшем все команды представлены для способа 2)
Dim NotesSession As Object
Dim NotesDB As Object
Dim NotesDOC As Object
Dim rrr As Object
Dim vview As Object
Set NotesSession = CreateObject(«Notes.Notessession»)
Далее нужно обозначить, в какой базе данных Лотуса мы будем работать. Можно работать в текущей базе, т.е. в последней открытой
Или обозначить базу, используя имя сервера и путь к файлу, который хранит базу
Set db = NotesSession.GetDatabase(«Server22 «, «organization.nsf»)
Такая база может быть не открыта, тогда её надо открыть (уточнить, open или openmail)
If db.IsOpen = False Then db.OPENMAIL
В базах есть разные представления данных (например, входящие письма, исходящие письма и др). Нужно выбрать, из какого представления нам нужны документы. К представлению можно обратиться по имени
Set vview = db.GetView(«($Sent)»)
А можно перебрать все имеющиеся в базе представления (здесь именно View, а не абы что, иначе не работает)
For Each View In db.Views
Далее из выбранных вьюх можно вытащить помещенные в них документы
Set rrr = vview.GetFirstDocument
Set rrr = View.GetFirstDocument
Чтобы перейти к следующему документу, пишем
Set rrr = vview.GetFirstDocument(rrr)
Set rrr = View.GetFirstDocument(rrr)
У документа есть поля. Их имена можно посмотреть, щелкнув п.к.м по документу (письму, записи о сотруднике, служебке и т.д.), открыв «свойства документа» и выбрав вторую иконку (треугольничек)
Значение тех или иных полей можно получить, например, так
Поля — это массивы. Отсюда и (0) в конце — это просто обращение к конкретному элементу массива. Каков размер этих массивов можно узнать функцией ubound. Поэтому тот же результат можно получить через присваивание массиву:
Dim doc() As String
Можно создавать новые документы (по крайней мере письма можно, остальное, возможно, зависит от наличия админских прав). Пример создания письма:
Set NotesDOC = NotesDB.CreateDocument
Call NotesDOC.ReplaceItemValue(«From», «адрес отправителя»)
.sendto = «тут адрес получателя»
.Principal = «тут адрес отправителя»
.subject = «Тема письма»
.body = «Текст письма»
Можно делать вложения файлов в письмо. Для этого после создания письма нужно определить файлы, которые будут вложены. Получим:
Set NotesDOC = NotesDB.CreateDocument
Set NotesAttachment = NotesDOC.CreateRichTextItem(«stFileName»)
Set NotesEmbedObject = NotesAttachment.EmbedObject(1454, «», stFileName, stFileName2) ‘1454 — параметр lotus (attachment)
Set NotesAttachment2 = NotesDOC.CreateRichTextItem(«stFileName2»)
Set NotesEmbedObject2 = NotesAttachment.EmbedObject(1454, «», stFileName2)
После этого идут все те же строки отправки:
Call NotesDOC.ReplaceItemValue(«From», «адрес отправителя»)
.sendto = «тут адрес получателя»
.Principal = «тут адрес отправителя»
.subject = «Тема письма»
.body = «Текст письма»
Отправлять письмо сразу нескольким получателям можно, записав адреса получателей в массив и указав этот массив в строке sendto. Например:
resipients = Split(«test1, test2, test3»)
Свойства баз Lotus
Сервер и путь к файлу базы данных можно посмотреть где-то в свойствах, а можно сначала войти в неё через
а потом вытащить её свойства:
Есть еще другие свойства, и если поставлена галочка в Tools — References на объекты Лотуса, то их можно смотреть в ObjectBrowser .
Кроме того, в параметрах Excel(Файл -> Параметры) есть некоторые настройки, связанные с Lotus, которые могут быть полезны.
Источник
Microsoft Excel
трюки • приёмы • решения
Управление Excel из других офисных программ пакета Microsoft Office
В предыдущих статьях вы видели, как Excel может управлять другими приложениями Microsoft, такими как Word и Outlook. Но одновременно с этим другие приложения также могут быть использованы для управления Excel.
Например, вы написали макрос для Word или Access, который создает таблицу Excel, заполняет ее данными, а затем сохраняет ее. Excel не обязательно должен при этом быть запущенным, а таблица не должна присутствовать на экране. Если все же Excel запущен, то появится новая книга, но этого можно избежать, используя свойство Visible вашего виртуального приложения.
Установив его в значение False, вы можете исключить появление новой книги на экране. При запуске этого типа приложения весьма интересно бывает установить свойство Visible в значение True и понаблюдать, как данные вносятся в таблицу, как будто невидимый оператор работает за вашим компьютером.
Это может произвести сильное впечатление на стороннего наблюдателя, но нажатие какой-либо клавиши на клавиатуре может привести к закрытию вашей таблицы либо другим непредсказуемым результатам. Если вы установите свойство Visible в значение False, то пользователь не сможет навредить при выполнении этой процедуры, он даже не будет знать, что она в настоящий момент выполняется.
В качестве примера я приведу создание таблицы Excel из приложения Word. VBA работает практически одинаково во всех офисных приложениях, за исключением того, что объектные модели очень сильно отличаются в различных приложениях.
Запустив Microsoft Word, вы должны ввести код в окно VBA. Окно редактора вызывается так же, как и в Excel: с помощью нажатия сочетания клавиш Alt+F1. Оно имеет такую же функциональность, как и в Excel. Когда вы управляли различными приложениями с помощью Excel, вы сначала добавляли файлы библиотек объектов. То же самое нужно сделать и в Word, поместив ссылку на файл библиотеки объектов Excel.
Вы выбирали в меню редактора Tools › References, сейчас вам нужно сделать то же самое, только выбрать в появившемся окне Excel Object Library и поставить напротив галочку, как показано на рис. 1.
Рис. 1. Подключение файла библиотеки Excel
Теперь вы сделали все, чтобы написать код, управляющий Excel. Добавьте модуль (Insert › Module), в котором наберите следующий код:
Sub Test_Excel() Dim oEapp As Excel.Application Set oEapp = CreateObject(«Excel.Application») Dim oWBook As Workbook, oWSheet As Worksheet Set oWBook = oEapp.Workbooksþ.Add Set oWSheet = oWBook.Worksheets(1) oWSheet.Range(«A1»).Value = «Ваш текст» ‘ Не забудьте изменить oWBook.SaveAs («C:TestExcel.xlxs») ‘ Вы можете выбрать собственный путь сохранения oWBook.Close oEapp.Quit Set oWSheet = Nothing Set oWBook = Nothing End Sub
Когда этот код будет запущен, будет создан файл с именем C:TestExcel.xlxs, содержащий таблицу, в ячейке А1 которой находится строка «Ваш текст». В коде создается переменная оЕарр для хранения объекта приложения Excel. Переменные oWBook и oWSheet представляют собой книгу и лист соответственно. При этом книга добавляется в коллекцию Workbooks.
Объект Worksheet — это первый лист в коллекции Worksheets (в книге он может быть единственным).
В ячейку А1 на первом листе вносится строка «Ваш текст», затем книга сохраняется как C:TestExcel.xlxs. После этого книга закрывается с помощью метода Close. Произойдет то же самое, если выбрать в меню Excel Файл › Закрыть. После этого закрывается само приложение, так же, как будто пользователь выбрал в меню Файл › Выход. И наконец, переменным Workbook и Worksheet присваивается значение Nothing, освобождается память компьютера от излишней информации.
Как уже было оговорено не один раз, важно правильно завершить работу приложения, присвоив значение Nothing всем объектам в VBA-коде. В противном случае память не будет освобождена и другие приложения не смогут к ней обратиться. Это может вызвать проблемы у пользователей, когда они выходят из вашего приложения, а оно завершается некорректно и переменные остаются в памяти, которая очень даже может понадобиться для других задач.
Источник
Controlling One Microsoft Office Application from Another
Если вы хотите запустить код в одном приложении Microsoft Office, которое работает с объектами в другом приложении, выполните следующие действия.
Выполнение кода
Задайте ссылку на библиотеку типов другого приложения в диалоговом окне Ссылки (меню Сервис ). Затем объекты, свойства и методы появятся в обозревателе объектов, а синтаксис будет проверяться во время компиляции. Вы также можете получить контекстно-зависимые справки по ним.
Объявите переменные объекта, которые будут ссылаться на объекты в другом приложении как на определенные типы. Укажите для каждого типа имя приложения, которое предоставляет объект . Например, следующая инструкция объявляет переменную, указывающую на документ Microsoft Word, и другую, которая ссылается на книгу Microsoft Excel.
Примечание Если вы хотите, чтобы код был привязан к началу, необходимо выполнить описанные выше действия.
Используйте функцию CreateObject с программными идентификаторами OLE объекта, с которым вы хотите работать в другом приложении, как показано в следующем примере. Чтобы просмотреть сеанс другого приложения, задайте для свойства Visible значение True.
Примените свойства и методы к объекту, содержамся в переменной. Например, следующая инструкция создает новый документ Word.
Завершив работу с другим приложением, используйте метод Quit , чтобы закрыть его, а затем задайте для его объектной переменной значение Nothing , чтобы освободить используемую память, как показано в следующем примере.
Пример кода, предоставляемый: Билл Jelen, MrExcel.com В следующем примере кода создается новый файл Microsoft Office Word для каждой строки данных в электронной таблице.
Пример кода, предоставляемый: Деннис Валлентин (Dennis Wallentin), VSTO & .NET & Excel . В этом примере значения ячеек из именованного диапазона W_Data, содержащего три значения, вставляются в документ Word. Значения вставляются в расположения закладки с именами td1, td2 и td3. Для выполнения этого примера необходимо иметь диапазон с именем W_Data , который содержит три значения на листе Sheet1 в книге. У вас должен быть документ Word с именемTest.docx сохранен в том же расположении, что и книга Excel, а документ Word должен содержать три закладки с именами td1, td2 и td3.
Сведения об участниках
Билл Джелен (Bill Jelen), MVP — автор больше двух десятков книг о Microsoft Excel. Он частый гость на TechTV вместе с Лео Лапорте (Leo Laporte) и ведет конференцию MrExcel.com, содержащую больше 300 000 вопросов об Excel и ответов на них.
Деннис Валлентин является автором блога VSTO & .NET & Excel, в который основное внимание уделяется решениям платформа .NET Framework для Excel и службы Excel. Деннис разрабатывает решения Excel более 20 лет и также является соавтором книги «Professional Excel Development: The Definitive Guide to Developing Applications Using Microsoft Excel, VBA, and .NET (2nd Edition)».
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Источник
analitica.jimdo.com
Интеграция с другими программами — Макросы в Excel
9-13 минут
Не стоит забывать и о возможностях интеграции VBA с другими приложениями. Монополия это конечно плохо, но в данном случае именно монопольное положение Microsoft дало нам столько возможностей по интеграции различных приложений друг в друга.
Итак, с чем и как можно интегрировать VBA?
Текстовый файл
Текстовые переменные, если они большие, можно хранить в текстовом файле. Это удобно еще и потому, что в этом случае любой человек может редактировать текст, не влезая в код, а значит и не имея возможности его сломать.
‘ объявляем о начале использования такого типа объекта
Set fso = CreateObject(«scripting.filesystemobject»)
‘ открываем нужный файл
Set tS = fso.OpenTextFile(full_name_of_txt-file, 1, True)
‘ присваиваем стринговой переменной весь текст, содержащийся в файле
msg_text = tS.ReadAll
‘ закрываем текстовый файл
tS.Close
Просмотр файлов в папке
Средствами VBA можно получить список файлов, находящихся в папке, причем не только файлов MS Office, но и всех остальных. Это бывает нужно, например, чтобы открыть все файлы и напечатать, открыть несколько стандартных файлов и агрегировать хранящуюся в них информацию или чтобы просто получить список имеющихся файлов. Для этого можно воспользоваться функцией Dir(путь, тип файла). Функция возвращает имена файлов из папки.
При первом запуске функция выдает имя первого по порядку подходящего файла из указанной папки. Важно указывать на конце папки, иначе функция выдаст ошибку либо пустое значение. После того, как мы получили имя файла, мы можем его открыть и работать с ним. Потом нам нужно открыть следующий файл из папки. Для этого снова вызываем Dir, но без аргументов. А когда файлы закончатся, функция выдаст пустое значение — «».
Работу функции проще понять на примере.
Допустим, в папке «C:Documents and Settings» лежит три Excel-файла, и мы хотим их открыть.
Тогда наш макрос будет выглядеть так:
dr = Dir(«C:Documents and Settings», vbNormal)
Do While dr <> «»
Workbooks.Open(«C:Documents and Settings» & dr)
dr = Dir()
Loop
SQL-server
Подключение VBA к SQL может потребоваться в куче разных мест. Например у меня оно понадобилось совсем внезапно: caption полей в кубе и их key не совпадали. То есть когда я хотела проставить какие-то вещи, я имела их «человеческий» список, а в макрос мне нужно было подставлять «компьютерный». Соответствие одного с другим я и получала в базе.
Итак приступим.
Сначала запомним в переменную строку подключения, которую будем использовать потом. Её легче всего получить, настроив такое же подключение в Excel и потом просто скопировать оттуда готовую. Она будет примерно такая:
cnstr = «Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Data Source=MyServerName;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=MyCompName;Use Encryption for Data=False;Tag with column collation when possible=False;Initial Catalog=MyDatabaseName»
‘ делаем коннект
Set cn = New ADODB.Connection
‘ указываем, что в этом коннекте у нас будет recordset с именем rs
Set rs = New ADODB.Recordset
‘ открываем коннект с нашей строкой подключения
cn.Open cnstr
Затем получаем данные. Обратите внимание, что так как скрипт это всего лишь строка, вы можете подставлять туда разные переменные и др., полученные до этого в коде.
rs.Open «select * from table», cn
Пробег по строчкам recordset-а описывается достаточно странно, работать с ним неудобно. Гораздо удобнее перезаписать данные в массив VBA. Поэтому бежим по строчкам recordset-а
i = 0
Do While Not rs.EOF
ReDim Preserve arr(i)
arr(i) = rs.Fields(0).Value
rs.MoveNext
i = i + 1
Loop
Если вам не нужно получать данные, а нужно просто выполнить код, то можно воспользоваться командой execute
StrSql = «insert into ReportByIdList(ID,Name) values(1, report)»
cn.Execute StrSql
LotusNotes и другие Lotus-приложения.
LotusNotesявляется почтовым клиентом, однако, позволяет делать еще массу других вещей, например, он также является браузером и календарем. Можно совершать различные действия в Lotus, не выходя из Excel’я или Word’а. Скрипт достаточно труден, а подсказок в интернете не так уж и много, но иногда результат оправдывает все потраченные силы.
Начать сессию можно двумя способами.
Способ 1. Надо поставить галочку в Tools — References на объекты Лотуса, чтоб VBA подгрузил команды и справку Lotus’а. Лучше только одну галку, а то всё будет дублироваться
Dim session As New NotesSession
session.Initialize
Способ 2 (в дальнейшем все команды представлены для способа 2)
Dim NotesSession As Object
Dim NotesDB As Object
Dim NotesDOC As Object
Dim rrr As Object
Dim vview As Object
Set NotesSession = CreateObject(«Notes.Notessession»)
Далее нужно обозначить, в какой базе данных Лотуса мы будем работать. Можно работать в текущей базе, т.е. в последней открытой
Setdb = NotesSession.CurrentDatabase
Или обозначить базу, используя имя сервера и путь к файлу, который хранит базу
Set db = NotesSession.GetDatabase(«Server22 «, «organization.nsf»)
Такая база может быть не открыта, тогда её надо открыть (уточнить, open или openmail)
If db.IsOpen = False Then db.OPENMAIL
В базах есть разные представления данных (например, входящие письма, исходящие письма и др). Нужно выбрать, из какого представления нам нужны документы. К представлению можно обратиться по имени
Set vview = db.GetView(«($Sent)»)
А можно перебрать все имеющиеся в базе представления (здесь именно View, а не абы что, иначе не работает)
For Each View In db.Views
MsgBox (View.Name)
Next
Далее из выбранных вьюх можно вытащить помещенные в них документы
Set rrr = vview.GetFirstDocument
или соответственно
Set rrr = View.GetFirstDocument
Чтобы перейти к следующему документу, пишем
Set rrr = vview.GetFirstDocument(rrr)
или
Set rrr = View.GetFirstDocument(rrr)
У документа есть поля. Их имена можно посмотреть, щелкнув п.к.м по документу (письму, записи о сотруднике, служебке и т.д.), открыв «свойства документа» и выбрав вторую иконку (треугольничек)
Значение тех или иных полей можно получить, например, так
MsgBox (rrr.GetItemValue(«Name»)(0))
MsgBox (rrr.GetItemValue(«Branch»)(0))
MsgBox (rrr.GetItemValue(«Sendto»)(0))
Поля — это массивы. Отсюда и (0) в конце — это просто обращение к конкретному элементу массива. Каков размер этих массивов можно узнать функцией ubound. Поэтому тот же результат можно получить через присваивание массиву:
Dim doc() As String
doc = rrr.GetItemValue(«$Name»)
MsgBox (doc(0))
Можно создавать новые документы (по крайней мере письма можно, остальное, возможно, зависит от наличия админских прав). Пример создания письма:
Set NotesDOC = NotesDB.CreateDocument
Call NotesDOC.ReplaceItemValue(«From», «адрес отправителя»)
With NotesDOC
.Form = «Memo»
.sendto = «тут адрес получателя»
.Principal = «тут адрес отправителя»
.subject = «Тема письма»
.body = «Текст письма»
.SAVEMESSAGEONSEND = True
.PostedDate = Now()
.Send 0
EndWith
Можно делать вложения файлов в письмо. Для этого после создания письма нужно определить файлы, которые будут вложены. Получим:
Set NotesDOC = NotesDB.CreateDocument
‘ первое вложение
Set NotesAttachment = NotesDOC.CreateRichTextItem(«stFileName»)
Set NotesEmbedObject = NotesAttachment.EmbedObject(1454, «», stFileName, stFileName2) ‘1454 — параметр lotus (attachment)
‘ второе вложение
Set NotesAttachment2 = NotesDOC.CreateRichTextItem(«stFileName2»)
Set NotesEmbedObject2 = NotesAttachment.EmbedObject(1454, «», stFileName2)
и т.д.
После этого идут все те же строки отправки:
Call NotesDOC.ReplaceItemValue(«From», «адрес отправителя»)
With NotesDOC
.Form = «Memo»
.sendto = «тут адрес получателя»
.Principal = «тут адрес отправителя»
.subject = «Тема письма»
.body = «Текст письма»
.SAVEMESSAGEONSEND = True
.PostedDate = Now()
.Send 0
EndWith
Отправлять письмо сразу нескольким получателям можно, записав адреса получателей в массив и указав этот массив в строке sendto. Например:
resipients = Split(«test1, test2, test3»)
.SendTo = resipients
или
resipients[0] = «test1»
resipients[1] = «test2»
resipients[2] = «test3»
.SendTo = resipients
Свойства баз Lotus
Сервер и путь к файлу базы данных можно посмотреть где-то в свойствах, а можно сначала войти в неё через
Setdb = NotesSession.CurrentDatabase,
а потом вытащить её свойства:
MsgBox (db.Server)
MsgBox (db.FilePath)
Есть еще другие свойства, и если поставлена галочка в Tools — References на объекты Лотуса, то их можно смотреть в ObjectBrowser.
Кроме того, в параметрах Excel(Файл -> Параметры) есть некоторые настройки, связанные с Lotus, которые могут быть полезны.
В предыдущих статьях вы видели, как Excel может управлять другими приложениями Microsoft, такими как Word и Outlook. Но одновременно с этим другие приложения также могут быть использованы для управления Excel.
Например, вы написали макрос для Word или Access, который создает таблицу Excel, заполняет ее данными, а затем сохраняет ее. Excel не обязательно должен при этом быть запущенным, а таблица не должна присутствовать на экране. Если все же Excel запущен, то появится новая книга, но этого можно избежать, используя свойство Visible вашего виртуального приложения.
Установив его в значение False, вы можете исключить появление новой книги на экране. При запуске этого типа приложения весьма интересно бывает установить свойство Visible в значение True и понаблюдать, как данные вносятся в таблицу, как будто невидимый оператор работает за вашим компьютером.
Это может произвести сильное впечатление на стороннего наблюдателя, но нажатие какой-либо клавиши на клавиатуре может привести к закрытию вашей таблицы либо другим непредсказуемым результатам. Если вы установите свойство Visible в значение False, то пользователь не сможет навредить при выполнении этой процедуры, он даже не будет знать, что она в настоящий момент выполняется.
В качестве примера я приведу создание таблицы Excel из приложения Word. VBA работает практически одинаково во всех офисных приложениях, за исключением того, что объектные модели очень сильно отличаются в различных приложениях.
Запустив Microsoft Word, вы должны ввести код в окно VBA. Окно редактора вызывается так же, как и в Excel: с помощью нажатия сочетания клавиш Alt+F1. Оно имеет такую же функциональность, как и в Excel. Когда вы управляли различными приложениями с помощью Excel, вы сначала добавляли файлы библиотек объектов. То же самое нужно сделать и в Word, поместив ссылку на файл библиотеки объектов Excel.
Вы выбирали в меню редактора Tools › References, сейчас вам нужно сделать то же самое, только выбрать в появившемся окне Excel Object Library и поставить напротив галочку, как показано на рис. 1.
Рис. 1. Подключение файла библиотеки Excel
Теперь вы сделали все, чтобы написать код, управляющий Excel. Добавьте модуль (Insert › Module), в котором наберите следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub Test_Excel() Dim oEapp As Excel.Application Set oEapp = CreateObject("Excel.Application") Dim oWBook As Workbook, oWSheet As Worksheet Set oWBook = oEapp.Workbooksþ.Add Set oWSheet = oWBook.Worksheets(1) oWSheet.Range("A1").Value = "Ваш текст" ' Не забудьте изменить oWBook.SaveAs ("C:TestExcel.xlxs") ' Вы можете выбрать собственный путь сохранения oWBook.Close oEapp.Quit Set oWSheet = Nothing Set oWBook = Nothing End Sub |
Когда этот код будет запущен, будет создан файл с именем C:TestExcel.xlxs, содержащий таблицу, в ячейке А1 которой находится строка «Ваш текст». В коде создается переменная оЕарр для хранения объекта приложения Excel. Переменные oWBook и oWSheet представляют собой книгу и лист соответственно. При этом книга добавляется в коллекцию Workbooks.
В ячейку А1 на первом листе вносится строка «Ваш текст», затем книга сохраняется как C:TestExcel.xlxs. После этого книга закрывается с помощью метода Close. Произойдет то же самое, если выбрать в меню Excel Файл › Закрыть. После этого закрывается само приложение, так же, как будто пользователь выбрал в меню Файл › Выход. И наконец, переменным Workbook и Worksheet присваивается значение Nothing, освобождается память компьютера от излишней информации.
Как уже было оговорено не один раз, важно правильно завершить работу приложения, присвоив значение Nothing всем объектам в VBA-коде. В противном случае память не будет освобождена и другие приложения не смогут к ней обратиться. Это может вызвать проблемы у пользователей, когда они выходят из вашего приложения, а оно завершается некорректно и переменные остаются в памяти, которая очень даже может понадобиться для других задач.
Имеется надстройка Excel (файл .xlam с некой пользовательской функцией). И есть обычная книга Excel с поддержкой макросов (.xlsm). В окне редактора кода подключаю к этому файлу данную надстройку через Tools->References. Надстройка появляется в дереве файлов слева, функция из этой надстройки успешно работает в в книге. Сохраняем книгу, закрываем, открываем — надстройка пропадает, пользовательская функция, очевидно, не работает.
Что не так? Смотрел в параметрах Excel, есть некие пункты про доверенные источники надстроек и т.п., но прямой связи не увидел.
Детали: Excel 2016; файл надтройки находится на сетевом диске; подключать надстройку через Разработчик->Надстройки не вариант, т.к. файлом предполагается что будет пользоваться большой круг пользователей, в том числе не специалистов (не бегать же всем показывать, как и откуда подключать надстройку); прописывать пользовательскую функцию непосредственно в книге тоже не вариант, так как планируется использовать ее в нескольких файлах, и при необходимости редактировать централизовано (отредактировал функцию в надстройке — во всех файлах где она подключена все изменилось), а так же добавлять какие-то новые функции.