]]> ]]>

Visual Basic for Applications

Реализация языка программирования Basic

Visual Basic for Applications (VBA, Visual Basic для приложений) — немного упрощённая реализация языка программирования Visual Basic, встроенная в линейку продуктов Microsoft Office (включая версии для Mac OS), а также во многие другие программные пакеты, в том числе AutoCAD, WordPerfect и ESRI ArcGIS. VBA покрывает и расширяет функциональность ранее использовавшихся специализированных макро-языков, таких, как WordBasic. VBA может использоваться для управления приложением (меню, панели инструментов, формы пользователя, диалоговые окна и т.д.), а также для создания, импорта и экспорта различных форматов файлов.

VBA является интерпретируемым языком. Как следует из названия, VBA близок к Visual Basic, но может выполняться лишь в рамках приложения, в которое он встроен. Кроме того, он может использоваться для управления одним приложением из другого при помощи OLE Automation (например, таким образом можно создать документ Word на основе данных из Excel).

VBA функционально богат и чрезвычайно гибок, но имеет ряд ограничений, включая ограниченную поддержку указателей на функции (используются в Windows API). Имеется возможность использовать (но не создавать) библиотеки DLL.

Язык

VBA — транслируемый язык. Это означает, что его команды сначала преобразуются к исполняемой форме. Контейнеры VBA (Access, Excel, Word) могут сохранять странслированную программу в скрытой форме в исходном документе (чтобы избежать перекомпиляции при каждом выполнении программы). Исполнение кода происходит в виртуальной машине (как в Java), что зачастую ошибочно называют интерпретацией. Несмотря на его схожесть со многими старыми диалектами BASIC (особенно Microsoft BASIC), VBA не совместим с ними, кроме Microsoft Visual Basic до версии 6, и не совместим с VB.NET.

Использование VBA с приложениями (Access, Excel, Word) предполагает соответствующую терминологию и языковые конструкции — так называемую «объектную модель приложения».

Проблемы безопасности

Широкое распространение Visual Basic for Applications в сочетании с изначально недостаточным вниманием к вопросам безопасности привело к широкому распространению макровирусов.

Как и программы на любом языке программирования, макросы VBA могут быть созданы с злым умыслом. Для защиты были введены опции приложения — пользователь по своему усмотрению может исполнять макросы VBA или отказаться от их использования.

Будущее Visual Basic for Applications

В будущем Microsoft планирует заменить VBA на Visual Studio Tools for Applications (VSTA) — инструментарий расширения функциональности приложений, основанный на Microsoft .NET.

VBA в MS Office 2003
VBA в MS Office 2003

Примеры:

Hello, World!:

Пример для версий VBA 6.3, VBA 6.5

Этот код создает макрос под названием “Hello”, выполнение которого выводит окно с сообщением “Hello, World!” и единственной кнопкой “OK”.

Sub Hello()
    MsgBox ("Hello, World!")
End Sub

Факториал:

Пример для версий VBA 6.3, VBA 6.5

Факториал вычисляется итеративно; значения накапливаются в строковой переменной и затем выводятся в одном окне. & — оператор конкатенации, CStr преобразует число в строку (несмотря на то, что факториал хранится как число с плавающей точкой, выводится он без дробной части), Chr возвращает символ с заданным ASCII-кодом.

Sub Factorial()
    Dim f As Double
    Dim res As String
    f = 1
    For i = 0 To 16
        res = res & CStr(i) & "! = " & CStr(f) & Chr(10)
        f = f * (i + 1)
    Next i
    MsgBox (res)
End Sub

Числа Фибоначчи:

Пример для версий VBA 6.3, VBA 6.5

Используется рекурсивное вычисление чисел Фибоначчи. Отметим, что в этом случае тип счетчика цикла i приходятся объявлять в явном виде, иначе он принимает тип Variant и не может быть передан в функцию вместо типа Integer.

Public Function Fibonacci(N As Integer) As Integer
  If N < 2 Then
    Fibonacci = N
  Else
    Fibonacci = Fibonacci(N - 1) + Fibonacci(N - 2)
  End If
End Function

Sub Fib()
  Dim res As String
  Dim i As Integer
  For i = 1 To 16
    res = res & CStr(Fibonacci(i)) & ", "
  Next i
  MsgBox (res & "...")
End Sub

CamelCase:

Пример для версий VBA 6.3, VBA 6.5
Sub CamelCase()
  Dim Text As String
  Text = LCase(Application.InputBox("Enter Text"))
  For i = 1 To Len(Text) Step 1
    If InStr("abcdefghijklmnopqrstuvwxyz", Mid(Text, i, 1)) = 0 Then
      Text = Replace(Text, Mid(Text, i, 1), " ")
    End If
  Next i
  MsgBox (Replace(StrConv(Text, vbProperCase), " ", ""))
End Sub

Квадратное уравнение:

Пример для версий VBA 6.3, VBA 6.5
Function GetInt(Name As String) As Integer
  Dim Coef As String
  Coef = Application.InputBox("Enter Coefficient " & Name)
  GetInt = CInt(Coef)
End Function

Sub Quadratic()
  Dim A As Integer, B As Integer, C As Integer, D As Integer
  A = GetInt("A")
  If A = 0 Then
    MsgBox ("Not a quadratic equation.")
    Exit Sub
  End If
  B = GetInt("B")
  C = GetInt("C")
  D = B * B - 4 * A * C
  Dim p1 As Double, p2 As Double
  p1 = -B / 2# / A
  p2 = Sqr(Abs(D)) / 2# / A
  If D = 0 Then
    MsgBox ("x = " & CStr(p1))
  Else
    If D > 0 Then
      MsgBox ("x1 = " & CStr(p1 + p2) & Chr(10) & "x2 = " & CStr(p1 - p2))
    Else
      MsgBox ("x1 = (" & CStr(p1) & ", " & CStr(p2) & ")" & Chr(10) & "x2 = (" & CStr(p1) & ", " & CStr(-p2) & ")")
    End If
  End If
End Sub

Комментарии

]]>

blog comments powered by Disqus

]]>

Работа программистам