비주얼 베이직 포 애플리케이션

**비주얼 베이직 포 애플리케이션**(Visual Basic for Applications, VBA)는 마이크로소프트의 이벤트 반응형 프로그래밍 언어인 비주얼 베이직 6의 구현과 관련된 통합 개발 환경 (IDE)이고, 이것은 대부분 마이크로소프트 오피스 응용 프로그램에 내장되었다. VBA는 개발자들이 사용자 정의 함수들을 구축하게 할 수 있고, 과정을 자동화하고 Win32와 다른 낮은-수준의 기능을 DLL들을 통해 접근한다. 또한 애플의 Mac OS X를 위한 2008 버전부터 따로 오피스 응용 프로그램에 내장되었고, 마이크로소프트 맵포인트 및 마이크로소프트 비지오와 같은 다른 마이크로소프트 응용 프로그램들뿐만 아니라 적어도 부분적으로 오토캐드, 워드퍼펙트 및 아크지스와 같은 다른 응용 프로그램들에서도 구현되었다. 그것은 이러한 워드의 워드베이직과 같은 이전 응용 프로그램에 특화된 매크로 프로그래밍 언어의 기능에서 대체하고 확장한다. VBA는 또한 ODF와 같은, 다양한 파일 포맷 가져오기 및 내보내기 필터를 생성하는 데 사용할 수 있다.

그 이름이 제시하듯이, VBA는 비주얼 베이직에서 밀접하게 관련되어 있고 비주얼 베이직 런타임을 사용하지만, 일반적으로 독립 응용 프로그램보다는 호스트 응용 프로그램 안에서만 코드를 실행할 수 있다. 이것은, 그러나, 다른 OLE 자동화 사용으로부터 단일 응용 프로그램을 제어하는 데 사용될 수 있다. 예를 들면, 이것은 엑셀 데이터에서 워드 보고서를 작성하는 데 자동으로 사용되고, 차례로 응답된 관측 감지기에서 엑셀에 의해 자동으로 수집된다. VBA IDE는  키 순서를 눌러서 오피스 문서 내에서 도달한다.

VBA는 기능적으로 풍부하고 유연하지만 윈도 API에서 콜백 함수처럼 사용되는 함수 포인터에 대한 제한된 지원과 같이, 몇 가지 중요한 제한들이 있다. 이것은 (액티브X/COM) DLL들을 사용(하지만 만들 수는 없다)하는 기능을 가지고 있고, 이후 버전은 클래스 모듈에 대한 지원을 추가한다.

## 언어
VBA로 작성된 코드는 P-코드 (포장된 코드)로 불리는 독자적인 중간 언어로 컴파일되고, 호스팅 응용 프로그램(액세스, 엑셀, 워드, 그리고 파워포인트)은 문서 스트림의 독립적인 COM 구조적 저장소 파일(예를 들어, `.doc` 또는 `.xls`)에 분리 스트림(액세스, 엑셀, 워드, 파워포인트)에 저장한다. 중간 코드는 가상 머신 (호스팅 응용 프로그램에 의해 호스팅됨)에 의해 실행된다. 이것은 많은 오래된 베이직 방언 (특히 마이크로소프트 베이직으로부터, 이것은 간접적으로 파생된다)과 유사함에도 불구하고, VBA는 마이크로소프트 비주얼 베이직을 제외한 어떤 것과도 호환되지 않고, VBA 모듈 및 클래스의 소스 코드를 직접 가져올 수 있고, 그리고 이것은 동일한 라이브러리 및 가상 머신을 공유한다. 호환성은 비주얼 베이직 버전 6으로 끝난다; VBA는 VB.NET과 호환되지 않는다. VBA는 마이크로소프트가 독점하고, COM 인터페이스로부터 분리되고, 공개 표준이 없다.

### 개체 모델
엑세스, 워드 또는 엑셀, 용어 및 언어 구조들과 같은 응용 프로그램에 대해 VBA를 사용하는 것은 응용 프로그램에 대한 상호작용이 필요하다. VBA의 이 부분은 응용 프로그램에 대한 *개체 모델*이라고 불린다. 개체 모델의 지도는 엑셀 및 워드를 위한 온라인이다. 개체 모델의 목록은 대상 응용 프로그램에서 매크로/VBA 편집기를 열고 그 다음에 "개체 브라우저" (F2)를 여는 "보기"를 이용하여 찾는다.

VBA를 사용하는 대부분의 어려움은 개체 모델 학습과 관련되어 있고, 이것은 새 사용자에게 더 적게 투명할 수 있는 모델의 창작자들에 의해 발명된 이름들을 사용한다. 개체 모델의 용어 및 구문을 배우는 한 가지 방법은 마우스와 응용 프로그램의 메뉴를 사용하여 원하는 결과를 달성하기 위해 취한 단계를 기록하는 *매크로 기록기*를 사용하는 것이다. 이것이 완료되면, 기록기에 의해 만들어진 VBA 코드는 VBA 편집기에서 보일 수 있고, VBA 자체의 이해의 소량과 함께 종종 크게 간소화 또는 일반화할 수 있다.매크로 기록기는 항상 모든 걸 기록하지 않고(특히 그래프에 대해), VBA를 채용한 일부 응용 프로그램은 전부 기록기를 제공하지 않는다. 매크로 기록기가 작동하지 않는 일부 경우에 대한 VBA 구조를 발견하는 디버깅 도구의 사용은 젤렌 및 실스테드에 의해 설명되지만, 일부 단계는 모호하게 남아있을 수 있다.

비주얼 베이직 언어의 강점과 약점의 자세한 설명은 비주얼 베이직에서 찾을 수 있다.

## 자동화

호스트 응용 프로그램과의 상호작용은 OLE 자동화를 사용한다. 일반적으로, 호스트 응용 프로그램은 자료형 라이브러리 및 VBA 프로그램이 응용 프로그램과 상호작용을 할 수 있는 방법인 API 문서를 제공한다. 이 문서는 *개체 브라우저*를 사용하여 VBA 개발 환경 내부에서 검사를 할 수 있다.

한 응용 프로그램의 OLE 자동화 인터페이스를 사용하여 작성된 VBA 프로그램은 OLE 자동화 인터페이스가 다를 수 있기 때문에, 만약 해당 응용 프로그램은 비주얼 베이직 런타임을 호스팅한다고 해도, 다른 응용 프로그램을 자동화하는 데 사용할 수 없다. 예를 들어, 마이크로소프트 워드를 자동화하여 작성한 VBA 프로그램은 그 워드 프로세서는 VBA를 호스팅하는 경우에도, 다른 워드 프로세서와 함께 사용할 수 없다.

반대로, 다중 응용 프로그램은 VBA 코드 내에서 응용 프로그램 개체 생성에 의해 하나의 호스트에서 자동화할 수 있다. 다른 라이브러리로의 참조는 방법, 개체, 기타의 어떤 것은 응용 프로그램에서 사용이 가능하도록 되기 전에 VBA 클라이언트 내에서 생성되어야 한다. 이러한 응용 프로그램 개체들은 그들이 처음 생성될 때 응용 프로그램에 OLE 연결을 생성한다. 다른 응용 프로그램으로의 명령들은 올바르게 작동하기 위한 이러한 응용 프로그램 개체를 통해 명시적으로 이루어져야 한다.

예를 들면: 마이크로소프트 엑세스에서, 사용자는 자동으로 액세스 라이브러리에 액세스할 수 있다. 엑셀, 워드 및 마이크로소프트 아웃룩 라이브러리로의 참조도 생성할 수 있다. 이것은 액세스에서 쿼리를 실행하고, 엑셀로 결과를 내보내고, 텍스트를 형식화하고, 그래서 워드에서 편지 병합 문서를 작성하고 아웃룩을 통해 자동으로 원본 쿼리의 각 구성원에게 이메일하는 쓰기 응용 프로그램을 생성하는 것을 허용한다. (이 예제에서는, 마이크로소프트 아웃룩은 강제된 5초 기다림에 대한 자동화된 프로세스를 통해 사용자가 전송되는 전자 우편을 거부, 허용, 또는 취소를 강제하는 보안 기능을 포함한다. 이것에 대한 정보는 마이크로소프트의 웹사이트에서 찾을 수 있다.)

VBA 프로그램은 메뉴 버튼, *[[매크로 (컴퓨터 과학)|매크로]]*, 키보드 단축키, 또는 응용 프로그램에서 문서의 개봉OLE/COM 이벤트로 첨부할 수 있다. 언어도 사용자형식의 형태에서 사용자 인터페이스를 제공하고, 이것은 액티브X 컨트롤 추가 기능에 대한 것을 호스팅할 수 있다.

## 보안 우려

어떠한 일반적인 프로그래밍 언어와 마찬가지로, VBA 매크로는 악의적인 의도를 가지고 만들 수 있다. VBA를 사용하여, 대부분의 보안 기능은 관리자가 아닌, 사용자의 손에 눕는다. VBA '호스트 응용 프로그램' 옵션은 사용자에게 액세스할 수 있다. VBA 매크로가 포함된 문서를 실행하는 사용자는 웹 브라우저들을 위해 그들과 같이, 소프트웨어가 사용자 환경 설정과 함께 미리 설정될 수 있다. 최종 사용자들은 만약 사람들이 그들을 포함하는 문서를 사용하지 않으면 응용 프로그램에서 실행으로부터 매크로 비활성화에 의해 공격으로부터 자신을 보호하거나, 만약 그들이 이 문서의 출처를 신뢰할 수 있는지 확인한다면 오직 VBA 코드를 실행하는 문서에 대한 권한을 부여한다. 그러나, 만약 저자가 알려져 있는 VBA 코드는 다른 어떤 것보다 더 이상 위험하지 않다.

## 명명된 변수 및 사용자 정의 함수
[섬네일|400px|왼쪽|[마이크로소프트 엑셀에서 열 변수 *x* 및 *y*의 사용이다; *y = x*x*는 수식 상자에 표시된 수식을 사용하여 계산되고, 이것은 전체 *y*-열 아래에 복사된다.]]

VBA의 일반적인 사용은 표준 사용자 인터페이스에서 놓칠 수도 있는 기능을 추가하는 것이다. VBA의 사용은 왼쪽에 보여지는 것처럼, 스프레드시트에서 *명명된 변수*를 사용하여 훨씬 쉽게 만들 수 있다. *y = x <sup>2</sup>*에 대한 수식은 포트란 또는 베이직, *이름 관리자*가 열 변수 *x*와 *y*의 정의를 보여주는 것을 닮는다.

VBA를 사용하여, 사용자는 자신의 기능과 이러한 명명된 범위를 참조하는 서브루틴을 추가할 수 있다. 오른쪽 그림에서, 함수 *sq*는 엑셀과 함께 제공되는 *비주얼 베이직* 편집기에서 생성되고, *x*와 *y*는 스프레드시트의 변수 이름이다.

### 서브루틴
섬네일|410px|엑셀의 서브루틴은 스프레드시트로부터 읽은 명명된 열 변수 ''x''의 제곱을 계산하고, 명명된 열 변수 ''y''에 그것을 기록한다.
기능 자체는 워크시트에 기록할 수 없고, 단순히 평가를 반환할 수만 있다. 그러나, 마이크로소프트 엑셀에서, 서브루틴은 스프레드시트에게 서브루틴 내에서 직접적으로 발견된 값 또는 텍스트를 쓸 수 있다. 그림은 *x*-열 (명명된 열 변수 *x*)의 각 구성원을 읽고, 이것의 제곱을 계산하고, 해당 *y*-열 (또한 명명된 열 변수이다)로 이 값을 기록하는 서브루틴에 대한 비주얼 베이직 코드를 보여주고. *y* 열은 이 값이 서브루틴에서 계산되고 단순히 작성되기 때문에 수식을 포함하지 않는다.

## 예제

이 매크로는 워드에서 현재 날짜를 입력하기 위한 단축키를 제공한다:

```vb
Sub EnterCurrentDate()
    Selection.InsertDateTime DateTimeFormat:="dd-MM-yy", InsertAsField:=False, _
         DateLanguage:=wdEnglishAUS, CalendarType:=wdCalendarWestern, _
         InsertAsFullWidth:=False
End Sub
```


VBA는 테이블 측량과 같은 데이터베이스 작업을 자동화하는 데 유용하다:

```vb
Sub LoopTableExample

    Dim db As DAO.Database
    Dim rs As DAO.Recordset

    Set db = CurrentDb
    Set rs = db.OpenRecordset("select columnA, columnB from tableA")

    Do Until rs.EOF
         MsgBox rs!columnA & " " & rs!columnB
         rs.MoveNext
    Loop

    rs.Close
    Set db = Nothing
End Sub
```


VBA는 스프레드시트의 행에서 반복되는 작업들을 자동화하는 데 유용하다. 예를 들어, 다음 코드 예제를 사용하여, 내장 반복 해결사 *GOAL SEEK*는 수동 메뉴 항목의 반복된 사용을 피하려고, 자동으로 열 배열에서 각 행으로 적용된다. 열 변수 아래에 있는 "C_M"은 몇몇 비선형 방식에서 다른 열 변수 "Target"의 가치를 결정한다. 내장 비선형 해결사 *GOAL SEEK*는 하나의 값으로 "Target"을 데려가는 "C_M"의 값을 찾으려고 호출한다. 서브루틴은 VBA 편집기 및 명령의 *모듈 삽입*을 사용하여 통합 문서에 삽입된다. 이것은 VBA 편집기에서, 또는 "핫 키" 또는 키보드 바로가기를 사용하여 직접 호출된다. 행들을 자동으로 업데이트하는 스프레드시트에 대한 값들은 스캔된다.

이것은 *서브루틴*이 스프레드시트에 대한 변수를 업데이트하는 능력을 가지고 있다는 것을 참고하는 데 유용하다; *함수들*은 하지 않는다 - 그들은 단순히 그들의 평가를 보고한다.

라인 *Option Explicit*은 서브루틴의 일부가 아니다: 그것은 *Dim*문장에서 지정되지 않은 모든 변수의 신분을 강제하는 컴파일러 옵션을 설정하고, 이것은 오타에 의한 디버깅 문제를 감지하는 것의 어려움을 피한다. 다음 코드에서 표기법 ( ' )은 주석, (_) 라인은 연속을 나타낸다. 코드는 *명명된* 변수들을 사용한다: 셀의 형태는 셀들은 사용자 선택의 이름들보다는, 특정 행 및 열 번호를 나타내는 표준 셀 지정이 할당되는 것에서 참조한다. 명명은 엑셀 "이름 관리자", 또는 *이름 삽입: 생성*을 통해 워크시트에서 이루어진다.

```vb
Option Explicit

Sub SetTarget()
'
' SetTarget 매크로
'
   Dim J As Integer
   Dim Size As Integer
'
' 스프레드시트에서, 배열 "C_M"은 명명된 열 변수이고
' 그 구성원은 J로 설정한 행 인덱스를 사용한다
' 내장 함수 COUNT는 배열 "C_M"의 크기를 결정한다
'
   Size = Range("C_M").Cells.Count
'
' 배열의 모든 구성원의 초기 값을 설정한다
' C_M부터 1E-06; J = 행 인덱스
'
       For J = 1 To Size
           Range("C_M").Cells(J) = 0.000001
       Next J
'
' "Target"은 차원 "Size"의 스프레드시트에서
' 또다른 명명된 배열이다; 배열 "C_M"처럼 같은 크기이다
'
' 각 행은 각 "Target"은 항목에 따라 달라진다
' 해당 행에서 "C_M"의 값에 따른 지정된 방법은,
' 예를 들어, 이와 같은 함수에 의한 것이다: Target = C_M*C_M
'
' GOAL SEEK는 엑셀에서 내장 반복 해결사이다
'
' 각 "Target" 구성원을 연합하도록 설정하려고 GOAL SEEK를 호출한다: 예를 들어,
' J = 행 인덱스를 취하여, 행 J에서 셀 "C_M"은
' 행 J에서 "Target"은 하나일 때까지 GOAL SEEK에 의해 변경된다
'
' 구문 ("for-next" 세부사항과는 별도이다)은 매크로 녹음기와 함께 발견된다;
' 밑줄 "_"은 줄 연속이다
'
       For J = 1 To Size
           Range("Target").Cells(J).GoalSeek Goal := 1, _
             ChangingCell := Range("C_M").Cells(J)
       Next J
End Sub
```


VBA 아래의 예제는 셀 범위에서 *배열*을 얻는 데 사용되고, *배열*을 조작하고, 다른 범위에서 다시 값을 설정한다. 이것은 직접 셀 값 하나하나를 설정하는 것보다 몇 배나 빠르게 작동한다.

```vb
Sub CalculateSquares(rinput As Range, routput As Range)
   '변수 구체사항들
    Dim values() As Variant
    Dim i As Integer, N As Integer

    '계산하는 행들을 센다
    N = rinput.Rows.Count

    '입력 범위로부터 배열한 값들을 설정한다
    '배열의 예상 형태는 (1 to N, 1 to 1)이다
    values = rinput.Value

    '행들 및 설정 값들을 반복한다
    For i = 1 To N
        values(i, 1) = values(i, 1) ^ 2
    Next i

    '내보내기는 출력 범위의 값 속성을 설정하여
    '스프레드시트로 다시 평가한다.
    routput.Value = values

End Sub
```


VBA는 마이크로소프트 엑셀 통합 문서에서 사용하기 위해 사용자 정의 함수 (UDF)를 작성하는 데 사용할 수 있다:

```vb
Public Function BusinessDayPrior(dt As Date) As Date

    Select Case Weekday(dt, vbMonday)
        Case 1
            BusinessDayPrior = dt - 3      '월요일은 금요일이 된다
        Case 7
            BusinessDayPrior = dt - 2      '일요일은 금요일이 된다
        Case Else
            BusinessDayPrior = dt - 1      '모든 다른 날짜는 이전 날짜가 된다
    End Select
End Function
```


외부 응용 프로그램 개체 (사용자는 이전에 응용 프로그램에서 참조하는 응용 프로그램의 라이브러리가 있어야 한다)를 추가하는 방법의 예제:

```vb
Public Sub Example()
    Dim XLApp As Excel.Application
    Dim WDApp As Word.Application

    Set XLApp = CreateObject("Excel.Application")
    Set WDApp = CreateObject("Word.Application")

    ' ...너의 코드가 여기있다...

    XLApp.Quit
    WDApp.Quit

    Set XLApp = Nothing
    Set WDApp = Nothing
End Sub
```


### 응용 프로그램을 위한 비주얼 스튜디오 도구 (VSTA)

비주얼 스튜디오 2005의 출시와 함께, 마이크로소프트는 응용 프로그램을 위한 비주얼 스튜디오 도구 (VSTA)를 발표했다. VBA과 유사한 방식으로, 독립 소프트웨어 공급업체는 그들의 응용 프로그램 안에서 사용자 지정 설비를 갖춘 그들의 최종 사용자를 제공하기 위해 라이센싱 VSTA에 대해 문의하려고 그들의 vstainfo 이메일 주소를 통해 마이크로소프트에 연락할 것이다. 그러나, VSTA는 닷넷 프레임 워크를 상대할 프로그래밍을 위해 비주얼 스튜디오 2005 또는 비주얼 스튜디오 2008 개발 환경을 사용한다.

VSTA는 특히 InfoPath 양식에 사용자 정의 프로그램 코드를 추가하기 위해 오피스 2007에 처음 포함되었다.

## 같이 보기
* 마이크로소프트 비주얼 베이직
* 오피스를 위한 비주얼 스튜디오 도구
* 응용 프로그램을 위한 비주얼 스튜디오 도구
* 마이크로소프트 비주얼 스튜디오
* 마이크로소프트 비주얼 베이직 닷넷
* 마이크로소프트 엑셀
* 마이크로소프트 워드
* 마이크로소프트 프론트페이지
* 마이크로소프트 엑세스
* 마이크로소프트 파워포인트

## 참조


## 외부 링크
* MS 액세스 VBA 예제 
* 주로 마이크로소프트 엑셀을 위한 VBA 프라이머 
* 마이크로소프트 엑셀 VBA 제작 전문 사이트

분류:베이직 예제 코드가 있는 문서
분류:베이직 프로그래밍 언어 계열
분류:마이크로소프트 오피스
분류:1993년 개발된 프로그래밍 언어
분류:매크로 프로그래밍 언어
분류:마이크로소프트의 프로그래밍 언어