ВВЕДЕНИЕ

Теперь, когда я могу читать эти макросы и фрагменты кода на stackexchange, как мне действительно использовать VBA? Должно быть больше, чем кажется на первый взгляд. Как я могу преобразовать этот BASIC-код во что-то, что покорит мир? хочу что-то развивать!

Узнав причину, по которой мы должны снова обратиться к VBA в части 1: Введение в макросы и VBA для Script Kiddies, мы затем рассмотрели, как на самом деле читать этот загадочный язык в части 2: Язык VBA для Script Детишки». Как только у нас появится мотивация и ноу-хау, мы сможем расширить свой кругозор и написать код с использованием возможностей VBA.

Мы коснулись этого немного раньше, но Visual Basic для приложений был создан, чтобы предоставить пользователю возможность настраивать работу с приложениями Microsoft Office. Это включает в себя все, от автоматизации рутинных процедур до расширения базовых возможностей самого приложения. VBA может добавлять совершенно новые функции, взаимодействуя с документом, приложением Office или самой операционной системой.

Язык программирования VBA во многом похож на другие языки программирования, как мы видели ранее. Теперь мы рассмотрим некоторые ключевые функции, к которым вы привыкли, и способы отладки кода. А поскольку VBA — это объектно-ориентированный язык сценариев, управляемый событиями, мы обсудим, как обрабатываются события, и некоторые интересующие объекты. Наконец, мы поговорим о расширении вашего кода VBA и использовании некоторых функций приложения Office и операционной системы. После этого, Script Kiddies, у вас должны быть основные строительные блоки для разработки вашей Темной Башни VBA.

ОСНОВНЫЕ ФУНКЦИИ

Хорошо, я знаю, как создавать СОБСТВЕННЫЕ функции, но должны быть какие-то встроенные функции, которые я могу использовать. Где все мои функции strcpy, atoi и fread? Вы не можете ожидать, что Бэтмен будет бороться с преступностью без своего пояса.

Как и все языки программирования, VBA предлагает множество встроенных функций, помогающих выполнять ваши задачи. Полный список этих функций слишком велик для этого поста, но мы рассмотрим несколько общих функций. Полный список можно найти в документации Microsoft. Я знаю, я знаю, но ‹a href="https://docs.microsoft.com/en-us/office/vba/api/overview/language-reference"›документация по VBA‹/a› может быть чрезвычайно полезной. , поэтому игнорируйте свои инстинкты Script Kiddie и читайте инструкции. Вероятно, для этого есть приложение или, по крайней мере, API.

КОЛЛЕКЦИОННЫЕ МАНИПУЛЯЦИИ

Во-первых, давайте рассмотрим некоторые функции, которые помогут вам при работе с массивами или коллекциями. Эти функции помогут вам создавать, изменять и искать коллекции. У них много названий на разных языках, но их полезность будет знакома.

  • Array(arglist) — этот конструктор позволяет создавать и инициализировать массив. Мы знаем, как создать массив, просто поставив круглые скобки после имени, но перед типом, но вы можете пойти еще дальше и инициализировать массив с помощью этого конструктора.
Dim A As Varaint
A = Array(1, 2, 3)
  • Join(sourcyarray,[delimiter]) — эта функция объединяет элементы в коллекции, чтобы вернуть строку этих объединенных элементов, как операция объединения в Python. Требуется массив элементов для соединения и необязательный разделитель между соединяемыми элементами.
myCSV = Join(A, “,”)
  • Split(expression, [ delimiter, [ limit, [ compare ]]]) — эта функция разделяет строку. выражение в массив подстрок на основе разделителя, ограничения и сравнения. Разделитель используется для идентификации символа, разделяющего подстроки, и по умолчанию используется символ пробела.
B = Split(myCSV, “,”)
  • LBound(имя массива, [ размер ]) — эта функция возвращает наименьший доступный индекс для данного измерения массива. Помните, VBA не всегда начинается с индекса 0.
Dim MyArray(10 To 20)
Lower = LBound(MyArray)
‘ Lower = 10
  • UBound(arrayname, [ dimension ]) — эта функция возвращает наибольший доступный индекс для данного измерения массива.
Dim MyArray(10 To 20)
Upper = UBound(MyArray)
‘ Upperr = 20
  • Стереть arraylist — эта подпроцедура повторно инициализирует элементы массивов фиксированного размера и освобождает память, связанную с массивами динамического размера. Это похоже на удаление в C++.
  • Filter(sourcearray, match, [ include, [ compare ]]) — эта функция возвращает массив, содержащий подмножество массива строк на основе параметров соответствия, включения и сравнения. Это похоже на функции работы с подстроками во многих других языках. Совпадение — это подстрока, которую вы ищете. Включено — это логическое значение, указывающее, следует ли включать или исключать эти совпадения, а сравнение — это тип выполняемого сравнения.

КОНВЕРСИЯ

Далее давайте рассмотрим некоторые функции, которые помогут вам преобразовать один тип данных в другой. Они похожи на вашу функцию atoi или функции hexlify. И, в качестве дополнительного бонуса, большинство начинают с C для преобразования. Кроме того, помните, что вызовы функций не требуют использования круглых скобок, за исключением случаев, когда вы используете возвращаемое значение, что будет иметь место в большинстве преобразований.

  • CBool(выражение), CByte(выражение), CCur(выражение), CDate(выражение), CSng( выражение), CDbl(выражение), Cint(выражение), CLng(выражение), CLngLng(выражение), CLngPtr(выражение), CStr(выражение), CVar(выражение) — эти функции явно вызывают выражение в определенный встроенный тип данных. Выражение может быть числовым или любой строкой, и система сделает все возможное, чтобы преобразовать его в тип данных функции. Если значение, переданное в функцию, выходит за пределы диапазона для определенного типа данных или система не знает, как преобразовать аргумент в тип данных функции, то возникает ошибка.
Dim myExpression As String := “3.14”
Dim myDouble As Double := CDbl(myExpression)
  • Int(number), Fix(number) — эти функции возвращают целую часть числа. Аргументом этих функций является число с плавающей запятой двойной точности или любое допустимое числовое выражение. Отрицательные числа — это разница между двумя функциями. Int() возвращает первое отрицательное целое число, меньшее или равное аргументу, а Fix() возвращает первое отрицательное целое число, большее или равное аргументу.
Dim MyNumber As Integer
MyNumber = Int(3.14) ‘ Returns 3
MyNumber = Fix(3.14) ‘ Returns 3
MyNumber = Int(-3.14) ‘ Returns -4
MyNumber = Fix(-3.14) ‘ Returns -3
  • Hex(число), Hex$(число), Oct(число), Oct$(число) — Эти функции возвращают шестнадцатеричное или восьмеричное представление числа. Имена функций, оканчивающиеся на $, явно возвращают тип данных String, тогда как стандартное имя возвращает Variant. Если число не является целым числом, оно округляется до ближайшего целого числа.
Dim myHex As Variant := Hex(9.9) ‘ Returns A
Dim myHexString As String := Hex$(9.9) ‘ Returns “A”
  • Str(число), Str$(число) — эти функции возвращают десятичное представление числа. Опять же, версия, оканчивающаяся на $, явно возвращает тип данных String, в то время как стандарт возвращает Variant. Если число отрицательное, строка будет начинаться с «-», но если число положительное, оно будет начинаться с пробела «».
  • Val(string) — эта функция возвращает числа, содержащиеся в строке, в виде числового значения. Он объединяет числа и прекращает чтение строки, когда встречает первый символ, который не может преобразовать (он пропускает пробелы и понимает &H как шестнадцатеричный).
Dim myValue As Integer := Val(“ 1 23 4”) ‘ Returns 1234
Dim myValue As Integer := Val(“12:34pm”) ‘ Returns 12

ДАТА И ВРЕМЯ

Следующий набор общих функций, которые мы рассмотрим, будет связан с датами и временем. Как вы помните, Date — это особый тип данных, в котором для представления даты и времени используется 8-байтовое число с плавающей запятой. Дата представлена ​​числом слева от десятичной запятой, а время представлено значением справа от десятичной запятой. Вы, вероятно, не увидите отрицательное число, потому что это даты до 30 декабря 1899 года. Последнее, что нужно помнить, это то, что литералы дат заключены в числовые знаки (#), например, #14 Mar 2015#.

  • Now() — эта функция возвращает вариант, представляющий текущую дату и время в соответствии с системой. Поскольку эта функция не требует никаких аргументов, вы можете увидеть, что она вызывается без круглых скобок.
Dim myDate As Date := Now
  • Date(), Date$(), Time, Time$() — эти функции возвращают вариант, содержащий текущую дату или время, как указано. Опять же, версии, оканчивающиеся знаком доллара, будут возвращать строковое представление, тогда как стандартная версия возвращает тип Variant. И опять же, эти функции не требуют никаких аргументов — вы можете увидеть, как они вызываются без круглых скобок.
  • Год(дата), Месяц(дата), День недели(дата), День(дата), Час( date), Minute(date), Second(date) — эти функции возвращают целочисленный Variant, содержащий числовое представление определенной части дата время.
Dim myDate, myYear, myHour
myDate = #3/14/2015 9:26:53 AM#
myYear = Year(myDate) ‘Returns 2015
myHour = Hour(myDate) ‘Returns 9
  • Timer() — функция таймера возвращает число с плавающей запятой одинарной точности, представляющее количество секунд, прошедших с полуночи. В Windows это число с плавающей запятой с одинарной точностью также включает доли секунды, прошедшие с полуночи, в то время как в Mac оно округляется до ближайшей целой секунды.

ФАЙЛОВАЯ СИСТЕМА

Существует ряд встроенных функций, позволяющих получить доступ к файловой системе. Эти функции помогают при навигации по каталогам и доступе к файлам. Большинство этих функций должно быть вам знакомо, так как они похожи на другие языки программирования и интерфейсы командной строки.

  • ChDir путь, ChDrive диск —Эти функции используются для навигации по файловой системе и изменения текущего каталога или диска на указанное значение. Аргументы представляют собой строковые представления желаемого каталога и диска.
  • CurDir — эта функция возвращает Variant String, представляющий текущий путь.
  • Dir [ (шаблон, [ атрибуты ] ) ] — возвращает строку, представляющую имя файла или каталога, соответствующее указанному шаблону (и необязательным атрибутам). Функция Dir поддерживает подстановочные знаки как часть имени пути. Если есть несколько совпадений с шаблоном поиска, то Dir возвращает первое имя файла, соответствующее шаблону, а дополнительные совпадения возвращаются при каждом последующем вызове Dir без каких-либо аргументов. Когда совпадений больше нет, Dir вернет пустую строку («»).
Dim myListing As String
myListing = Dir “” ‘ Returns the first listing in the directory
Do
      MsgBox myListing
Loop While myListing <> “”
  • MkDir путь, RmDir путь —эти функции создают или удаляют каталог. Если вы попытаетесь удалить каталог, содержащий файлы, произойдет ошибка.
  • EOF (filenumber) — возвращает целое число, содержащее логическое значение True, когда достигнут конец файла.
  • LOF(filenumber)возвращает тип Long, представляющий размер открытого файла в байтах.
  • FileDateTime(pathname) — эта функция возвращает дату и время создания или последнего изменения файла.
  • FileLen(pathname) — возвращает тип Long, указывающий длину файла в байтах.
  • Открыть имя_пути Для режима Как #номер_файла — эта функция открывает файл для операций ввода и вывода. Если файл не существует, то он создается на основе режима. Требуемый номер файла используется для последующих файловых операций, как и в других файловых функциях языка программирования.
  • Close [ filenumberlist ] — эта функция закрывает указанные файлы, которые были открыты с помощью функции Open. Функция может принимать список номеров файлов для закрытия.
  • Write #filenumber, output — используется для записи данных в файл в соответствии с номером файла.
  • Ввод #filenumber, varlist — используется для чтения данных из открытого файла и присвоения данных переменным.
Dim MyString, MyNumber
Open "TESTFILE" For Input As #1     ‘ Open file for input
Do While Not EOF(1)                 ‘ Loop until end of file
    Input #1, MyString, MyNumber    ‘ Read data into two variables
    Debug.Print MyString, MyNumber  ‘ Print to the Immediate window
Loop
Close #1                            ‘ Close file.
  • FreeFile — эта функция возвращает целое число, представляющее следующий доступный номер файла для использования операторами Open.
Dim myFileNumber
myFileNumber = FreeFile
Open “Test.txt” For Output As #myFileNumber
Write #myFileNumber, “Test output”
Close #myFileNumber
  • FileCopy source, destination — эта функция копирует файл из источника в место назначения. Будет ошибка, если вы попытаетесь скопировать файл, который в данный момент открыт.
  • Killpathname — эта функция удаляет файл с диска. Функция Kill поддерживает подстановочные знаки.

НИТЬ

Как мы узнали в прошлый раз, VBA поддерживает строки как переменной, так и фиксированной длины. Строки хранятся внутри как Unicode, но будут преобразованы за кулисами при использовании с функциями ANSI. Как правило, функции, оканчивающиеся на букву B, указывают на то, что функция выполняет операции с двоичной строкой или строкой ANSI, а функции W обрабатывают строку Unicode. И, как всегда, функции, которые заканчиваются знаком доллара ($), возвращают явно типизированный тип данных String вместо типа данных Variant по умолчанию. Вот некоторые из распространенных строковых функций, которые вы, скорее всего, будете использовать:

  • Asc(string) — эта функция возвращает целое число, представляющее код символа ASCII для первой буквы в строковом аргументе.
  • Chr(charcode) — эта функция возвращает строку, содержащую символ, указанный аргументом кода символа.
  • Filter, Join, Split — эти функции были затронуты ранее при работе с коллекцией, но они позволяют вам искать, объединять и разбивать строки на подстроки.
  • Format(Expression, [ Format ]) — Format возвращает вариант или строку с символом $, содержащую выражение, отформатированное в соответствии с выражением формата.
Dim MyStr
MyStr = Format( #15:14:15#, “hh:mm am/pm” )     ‘ Returns “3:14 pm”
MyStr = Format( 3141.5926, “##,##0.00” )        ‘ Returns “3,141.59”
  • InStr([ start ], string1, string2, [ compare ]) — эта функция ищет в строке подстрока и возвращает позицию первого вхождения этой подстроки.
  • Left(строка, длина), Right(строка, длина), Mid(строка, начало, [ length ]) — эти функции возвращают подстроку с указанным количеством символов, начиная с левого, правого или среднего края строки.
  • Len(string|varname) — возвращает тип Long, соответствующий количеству символов в строке. Эту функцию можно использовать с именем переменной, чтобы вернуть количество байтов, необходимых для хранения этой переменной.
  • LCase(string), UCase(string) — эти функции изменяют регистр строки.
  • LTrim(string), RTrim(string), Trim(string) — эти функции обрезают пробелы слева, справа или с обоих концов строки. строка
  • Заменить(выражение, найти, заменить, [ начать, [ счетчик, [ сравнить ]]]) — эта функция возвращает строку, в которой одна подстрока была заменена другой подстрокой, аналогично поиску и замене.
  • StrComp(string1, string2, [ compare ]) — функция сравнивает две (2) строки и возвращает результат: 0, если они равны. , -1, если строка1 меньше строки2, и 1, если она больше.
  • StrConv(string, conversion, [ LCID ]) — преобразует строку с использованием указанного преобразования. Это может преобразовать строку в верхний, нижний или правильный регистр. Он может преобразовать строку в широкие (2-байтовые) символы или узкие (1-байтовые). Он также может конвертировать из Unicode или в Unicode. Проверьте справочник VBA для спецификаторов преобразования.
  • StrReverse(expression) — меняет порядок символов в строке на обратный.
  • Строка(число, символ), Пробел(число) — создается строка с повторяющимся символом или пробелом.

ВЗАИМОДЕЙСТВИЕ

VBA является частью управляемой пользователем среды, основанной на событиях, поэтому в дополнение к стандартным функциям VBA предлагает множество функций, помогающих взаимодействовать с пользователем и/или приложением. Некоторые из этих функций аналогичны функциям других языков программирования, а некоторые уникальны для VBA.

  • AppActivate title — эта функция активирует окно приложения. Это изменяет фокус на названное приложение, но не влияет на то, свернуто оно или развернуто.
  • Shell(pathname, [ windowstyle ]) — эта функция запускает исполняемую программу и возвращает идентификатор задачи программы в случае успеха (или 0, если нет). Необязательный аргумент стиля окна может скрыть окно или принудительно запустить его в свернутом виде.
Dim RetVal
RetVal = Shell("C:\WINDOWS\CALC.EXE", 0)  ' Start a hidden Calculator
  • CallByName (object, procname, calltype, [args()] ) — при этом метод объекта будет выполняться динамически во время выполнения с использованием имя функции.
  • Environ( { envstring | number } ) — эта функция возвращает строку, связанную с переменной среды операционной системы.
  • GetSetting(имя приложения, раздел, ключ, [ по умолчанию ]), DeleteSetting имя приложения , раздел, [ ключ ], SaveSetting название приложения, раздел, ключ, setting — эти функции используются для получения, сохранения и удаления настроек из записи приложения в реестре Windows.
  • InputBox(приглашение, [ название ], [ по умолчанию ], [ xpos ], [ ypos ], [ файл справки, контекст ]) — эта функция отображает диалоговое окно ввода для пользователя и возвращает строку, содержащую содержимое текстового поля.
  • MsgBox (приглашение, [ кнопки, ] [ заголовок, ] [ файл справки, контекст ]) — эта функция отображает диалоговое окно сообщения для пользователя и ожидает, пока пользователь нажмет кнопку. Возвращаемое значение представляет собой целое число, указывающее, какую кнопку нажал пользователь.
  • SendKeys string, [ wait ] — эта функция отправляет одно (1) или несколько нажатий клавиш в активное окно, как если бы они были набраны на клавиатуре.

ОБЪЕКТЫ

Большой! У меня есть пояс полезных функций, но как насчет моего бэтаранга и бэтгрэппла, и достаточно аналогий с Бэтменом, но для меня должны быть какие-то удобные и стильные предметы, с которыми я мог бы играть. Во всех языках есть объекты, верно?

Visual Basic для приложений действительно является объектно-ориентированным языком программирования. А для этих n00b Script Kiddies объект определяется в классе, который содержит набор переменных (известных как свойства) и функций (известных как методы). Как только вы создадите экземпляр этого класса, у вас будет объект. Вы управляете этим объектом, используя эти методы и свойства через нотацию object.method или object.property.

VBA содержит несколько встроенных типов объектов, полезных и похожих на те, что есть в других языках. В нем также есть несколько уникальных для офисной среды VBA. На самом деле приложение Office, в котором выполняется сценарий VBA, содержит иерархию объектов и является основным способом доступа к данным и выполнения задач.

СТАНДАРТНЫЕ ОБЪЕКТЫ

Стандартные объекты содержатся в самом языке и не обязательно являются частью приложения Office. Это объекты, с которыми вы будете наиболее знакомы. Некоторые из них мы уже по касательной обсудили или хотя бы некоторые функции, которые работают с этими объектами.

  • Коллекция — объект Коллекция — это просто коллекция связанных и упорядоченных элементов. Члены коллекции не обязательно должны иметь один и тот же тип данных. Как мы уже видели, управление коллекциями осуществляется с помощью методов Add, Remove и Item, и их можно использовать в циклах управления, например For Each… Next.
  • Debug — объект Debug, очевидно, используется в отладочном коде. Он имеет два (2) метода: Print и Assert. Операторы Assert и Print можно использовать с самим классом Debug, и на них не нужно ссылаться через объект Debug.
  • Debug.Print [ outputlist ] — этот метод отправляет информацию непосредственно в окно.
  • Debug.Assert booleanexpression — этот метод проверяет, верно ли условие. Если условие имеет значение False, выполнение кода прерывается и запускается отладчик.
Private Sub Test( errno as Integer )
      Debug.Assert (errno<>0)
      Debug.Print “error success, continuing”
End Sub

Примечание. Ключевое слово Stop не является частью объекта Debug, однако оператор stop приостанавливает выполнение и запускает точку останова в коде.

  • Словарь — этот объект подобен ассоциативному массиву Perl. Он может содержать данные любого типа, хранящиеся в массиве, доступ к которым можно получить с помощью уникального ключа.
Dim d
Set d = CreateObject(“Scripting.Dictionary”)
d.Add “AL”, “Alabama”   ‘AL is the unique key
d.Add “AK”, “Alaska”
  • Диск — объект Диск предоставляет доступ к свойствам диска или сетевого ресурса.
  • Err — объект Err используется для предоставления информации об ошибках времени выполнения. Он широко используется при обработке исключений. Свойства объектов Err задаются программистом или операционной системой при возникновении ошибки. Свойством по умолчанию объекта Err является число. Объект Err имеет два (2) основных метода: Raise и Clear.
  • Err.Raise номер, источник, описание, файл справки, контекст справки — этот метод выдает ошибку времени выполнения. Когда возникает ошибка, она запускает обработчик исключений, который можно настроить с помощью ключевого слова On Error. Этот оператор On Error устанавливает, куда следует перейти для обработки ошибки, например, GoTo ExceptionOccurred, и куда вернуться после обработки ошибки, например, Resume Next.
  • Err.Clear — этот метод очищает свойства объекта Err после обработки ошибки.
Private Function Divide( x As Integer, y As Integer ) As Integer
      Dim z As Integer 
On Error GoTo ExceptionHandler
      If y = 0 Then
            Err.Raise 5
      Else
            z = x / y
      End If
      ExceptionHandler:
            Debug.Print “errno: “ & Str(Err.Number)
            Debug.Print “Divide by Zero”
            Err.Clear
            z = -1
      SetAnswer:
      Divide = z
End Function
  • Файл — объект файла представляет файл на диске, а его свойства содержат информацию об этом файле. Некоторые из ключевых свойств включают в себя: атрибуты, DateCreated, DateLastAccessed, DateLastModified, Drive, Name, ParentFolder, Path, ShortName, ShortPath, Size и Type. В дополнение к этим свойствам объект File имеет несколько ключевых методов: Copy, Delete, Move и OpenAsTextStream.
  • FileSystemObject — FileSystemObject обеспечивает доступ к файловой системе компьютера. Он содержит свойства, в том числе «Диски», «Имя», «Путь», «Размер» и «Тип». Он также имеет множество методов, включая CopyFile, CopyFolder, CreateFolder, CreateTextFile, DeleteFile, DeleteFolder, FileExists, FolderExists, GetAbsolutePathName, GetFileName, MoveFile и WriteLine.
Sub CreateAfile
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set test = fs.CreateTextFile("c:\testfile.txt", True)
    test.WriteLine("This is a test.")
    test.Close
End Sub
  • Папка — объект папки обеспечивает доступ ко всем ключевым свойствам папки в файловой системе. В дополнение к некоторым свойствам этой папки, таким как атрибуты, дата создания, дата последнего изменения, имя, IsRootFolder, ParentFoder, размер и т. д., она также имеет две (2) коллекции: файлы и подпапки. Это коллекции объектов «Файл» и «Папка» соответственно, которые содержат объекты в этой папке. Помимо свойств, объект Folder имеет несколько примечательных методов, в том числе Copy, Delete, Move и AddFolders (которые могут добавить новую папку в коллекцию SubFolders).
  • TextStream — этот объект помогает обрабатывать текстовые файлы. Он обеспечивает последовательный доступ к файлу для чтения или записи. Объекты TextStream обычно создаются или открываются с помощью метода CreateTextFile объекта FileSystemObject. Объект TextStream имеет пару замечательных свойств, включая AtEndOfLine, AtEndOfStream, Column и Line. В дополнение к этим свойствам он имеет несколько методов ввода-вывода: Read, ReadAll, ReadLine, Write, WriteLine и Close.
  • UserForm — объект UserForm представляет собой окно или диалоговое окно как часть пользовательского интерфейса. Пользовательская форма имеет свойства, определяющие внешний вид окна, включая положение, размер и цвет. Кроме того, пользовательскими формами можно манипулировать с помощью методов, и они даже могут реагировать на события, как мы увидим позже.

ПРИЛОЖЕННЫЕ ОБЪЕКТЫ

Теперь, когда мы рассмотрели некоторые из более общих объектов, мы можем изучить некоторые объекты, специфичные для Office. Каждое ведущее приложение Office имеет объект приложения, например, Word, Excel и т. д. Объект приложения состоит из параметров и параметров приложения в качестве свойств объекта и методов для доступа к различным объектам, содержащимся в иерархии документа. Например, объект приложения Microsoft Word содержит ссылки на все объекты в приложении, такие как надстройки, диалоговые окна, документы, шаблоны и сам VBE (редактор Visual Basic). Аналогичным образом объект приложения Microsoft Excel содержит набор объектов надстроек, объектов диалоговых окон и объектов VBE, а также рабочих книг и рабочих листов (вместо документов).

С другой стороны, VBA использует концепцию активных объектов для ссылки на объект с фокусом, например, ActiveDocument, ActiveWindow, ActiveCell, ActiveSheet и т. д. Это позволяет использовать все последующие свойства и методы без повторного выбора объекта из коллекция предметов. Вы также можете явно сослаться на объект, используя ключевое слово With ‹object› … End With. Внутри блока с кодом вы можете не указывать имя объекта явно и просто обращаться к методам и свойствам с помощью точки (.).

With MyLabel
 .Height = 2000
 .Width = 2000
 .Caption = "This is MyLabel"
End With

Наконец, объект приложения поддерживает множество методов, но один из них, на который стоит обратить внимание, это метод Run.

  • выражение.Run (Macro, Arg1, Arg2, …) — этот метод запускает макрос вызовов функции. явно по имени.

СОБЫТИЯ

Мы рассмотрели некоторые ключевые функции и объекты, но подождите, а не больше ли? Я думал, что есть что-то в том, что VBA управляется событиями. Что это за мероприятия и как я могу их посетить?

Это правда, VBA — это язык программирования, управляемый событиями, но для посещения вам не нужно приглашение; вам просто нужен обработчик событий. События запускаются, когда пользователь взаимодействует с приложением. Это взаимодействие может инициировать само конкретное событие или инициировать цепную реакцию, которая в конечном итоге инициирует интересующее вас событие. Инициирование этих событий дает вам возможность отреагировать программно, если вы их «слушаете». Например, когда объект становится активным, т. е. пользователь щелкает окно, вызывается обработчик события Activate() объекта. Это событие может быть инициировано взаимодействием с пользователем, но также инициируется, если метод Show() объекта вызывается в коде.

VBA поставляется с предварительно определенными обработчиками событий для каждого объекта, и, в отличие от других языков программирования, вы не можете создавать собственные обработчики событий. Вы включаете обработчики событий (или предоставляете их) при объявлении переменной с помощью ключевого слова WithEvents. Этот тип объявления может быть выполнен только с объектами, поддерживающими события, такими как модули классов, пользовательские формы и документы, но не с вашими собственными пользовательскими классами, поскольку стандартные модули кода не получают события.

Dim WithEvents myWorksheet As Worksheet
‘ Now can listen for Worksheet_Activate events

Некоторые из этих событий запускаются автоматически и обычно начинаются с Auto, например, Auto_Open() и Auto_Close(). Существует отдельное событие для Document_Open, которое на самом деле срабатывает перед другими событиями автозапуска/автозапуска.

РАСШИРЕНИЕ VBA

Большой. У нас есть функции. У нас есть объекты. У нас есть события. Есть ли что-то еще, что мне нужно знать, прежде чем я начну планировать захват мира и заставить Клиппи выполнять мои приказы?

Теперь, когда у вас есть базовое понимание языка, мы можем рассмотреть настоящую разработку проекта VBA. Существует несколько типов проектов VBA, которые позволяют вам взаимодействовать с самими приложениями Office или только с документами, в которых находится макрос. Мы также должны рассмотреть возможность расширения ваших программ VBA. Мы можем воспользоваться внешними библиотеками, а также временем выполнения и динамическим выполнением кода.

ТИПЫ ПРОЕКТОВ

С помощью VBA мы можем создавать несколько различных типов проектов, включая приложения, надстройки, коллекции макросов и пользовательские функции Excel. С помощью VBE создаются различные типы проектов, но они имеют разные функции и цели.

  • Приложения — это полнофункциональные приложения, которые используют объекты и события, доступные приложениям Office.
  • Надстройки — эти проекты не имеют собственных документов, но вместо этого являются частью приложения Office и работают с текущим, ActiveDocument или ActiveWorkbook и т. д. Надстройки сохраняются в специальном расположении для загрузки вместе с Office. приложение.
  • Коллекции макросов. Эти проекты также не содержат кода, специфичного для документа, и вместо этого на них может ссылаться любой документ. Обычно это достигается путем сохранения этих коллекций макросов как части шаблона, возможно, даже обычного шаблона для Word или шаблона личной рабочей книги для Excel. Эти коллекции ссылаются на текущий документ, используя ActiveDocument.
  • Пользовательские функции Excel. Эти проекты позволяют создавать более мощные функции Excel. Код должен быть частью модуля кода и обычно является частью надстройки. Код VBA может изменить только значение ячейки, из которой он вызывается.

НАСТРОЙКА ЛЕНТЫ

Пользовательский интерфейс Office Fluent, более известный как лента, был представлен в Office 2007. Сама лента представляет собой набор параметров, написанных на RibbonX (разновидность XML). XML-настройки ленты хранятся в XML-файле, который является частью документов Office. Новые документы Office, которые заканчиваются на «x», на самом деле представляют собой просто ZIP-архив из нескольких базовых файлов и каталогов, одним из которых является customUI.xml. В частности, для Office 2010 и более поздних версий может существовать дополнительный файл customUI14.xml. Ленту можно настроить через пользовательский интерфейс с помощью инструмента Office Custom UI Editor Tool для Office, но ее также можно настроить, изменив XML напрямую. CustomUI.xml может содержать специальные кнопки для отображения на самой ленте. Эти настройки также могут включать действия, выполняемые при нажатии кнопки с использованием свойства onAction. Это действие onAction может ссылаться на функцию или подпроцедуру VBA в документе.

ВНЕШНИЕ БИБЛИОТЕКИ И ФУНКЦИИ

Мы уже обсудили многие ключевые функции, встроенные в язык VBA, которые вы захотите использовать, но VBA также может использовать функции и код из других общих библиотек, таких как DLL, OCX и TLB. Вы можете добавить ссылку на библиотеку через VBE (Инструменты->Ссылки). Это дает вам доступ к классам и функциям, содержащимся в этой библиотеке. На эти объекты и функции теперь можно ссылаться, используя объектно-ориентированную нотацию. Добавление дополнительной библиотеки через редактор позволяет выполнять раннее связывание, которое происходит во время компиляции. Эта ранняя привязка обеспечивает проверку типов, проверку синтаксиса, IntelliSense и т. д. Например, распространенной библиотекой для добавления является среда выполнения сценариев Microsoft (scrrun.dll). После добавления библиотеки сценариев классы, их свойства и методы теперь доступны.

Dim FSO As Scripting.FileSystemObject
Set FSO = New FileSystemObject ‘ Use Set when instantiating a class
If FSO.FolderExists(“C:\temp”) Then
      MsgBox “Temp exists”
End If
Set FSO = Nothing ‘ Deletes/cleans up the object

Помимо добавления ссылки на библиотеку в VBE и использования раннего связывания, вы можете использовать позднее связывание, которое устанавливает ссылку во время выполнения. Это не позволяет использовать некоторые полезные функции редактирования, но как Script Kiddie вы можете увидеть некоторые преимущества в том, чтобы не включать ссылки на ваши библиотеки во время компиляции. При использовании этого позднего связывания вы должны объявить внешние функции и их прототип. При объявлении внешних функций в Office 2010 и более поздних версиях необходимо использовать ключевое слово PtrSafe, что означает, что вы принимаете во внимание типы указателей. Если вы хотите, вы можете использовать директиву компилятора для VBA7, чтобы иметь разные объявления функций в зависимости от версии VBA (и, следовательно, Office). Объявление внешней функции должно включать имя функции, на которое вы будете ссылаться, как в коде VBA, имя библиотеки, в которой находится функция, псевдоним, который вызывается в DLL (обычно оканчивается на A или W), аргументы (обычно ByVal) и тип даты возвращаемого значения. Может быть полезно создать функции-оболочки, которые настраивают аргументы и обеспечивают некоторую проверку ошибок.

Private Declare Function RegOpenKeyEx _
  Lib "advapi32.dll" _
  Alias "RegOpenKeyExA" ( _
  ByVal hKey As Long, _
  ByVal lpSubKey As String, _
  ByVal ulOptions As Long, _
  ByVal samDesired As Long, _
  phkResult As Long _
  ) As Long

ЗАКЛЮЧЕНИЕ

Потрясающий. Я думаю, что наконец-то понял. Я получил все свои функции, объекты и события. Я даже могу вызвать API любой библиотеки Windows. Этот материал VBA является законным. Оно превратилось из «Я БЕЙСИК» в «вся ваша база принадлежит нам». Я не могу дождаться, когда выберусь туда и устрою какой-нибудь хаос.

Мы углубились в глубины языка VBA и вышли с другой стороны. Теперь у вас должно быть гораздо лучшее понимание объектно-ориентированной, управляемой событиями природы языка VBA. Этот блог основан на знаниях языка VBA, которые мы получили в предыдущем посте. Мы рассмотрели некоторые ключевые функции, которые вы захотите использовать, стандартные и специфичные для приложения объекты, основы событий, а затем рассмотрели возможности создания и расширения вашего проекта. Теперь вы сможете создавать свои собственные впечатляющие макросы старой школы, а старая школа — лучшая школа. Не забывайте: «С большой силой приходит большая ответственность». И используете ли вы эту силу во благо или присоединяетесь к темной стороне, всегда не забывайте проверять возвращаемые значения.

Первоначально опубликовано на https://www.trustedsec.com 7 мая 2020 г.