본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
Visual Basic for Applications; VBA
마이크로소프트 오피스(엑셀·액세스·워드 등) 안에서 작업을 자동화하도록 넣어 둔 BASIC 계열 프로그래밍 언어

VBA 는 Visual Basic 문법을 오피스 프로그램 안에서 쓰도록 만든 매크로 언어다. 엑셀에서 매크로를 기록하면 그 동작이 VBA 코드로 저장되고, Visual Basic Editor(Alt + F11)에서 코드를 직접 쓰거나 고친다. 셀·시트·폼·컨트롤 같은 오피스의 개체(object)를 속성과 메서드로 다루고, 단추 클릭 같은 이벤트가 일어날 때 코드를 실행한다.

Sub 매출합계()          ' Sub 프로시저: 값을 돌려주지 않는다
    Range("C1").Value = Range("A1").Value + Range("B1").Value
End Sub

Function 부가세(금액)    ' Function 프로시저: 값을 돌려준다. 시트에서 =부가세(A1) 처럼 쓸 수 있다
    부가세 = 금액 * 0.1
End Function
  • ' 뒤는 주석이다
  • Public 프로시저는 모든 모듈에서, Private 프로시저는 선언된 모듈 안에서만 부를 수 있다
  • 변수는 Dim 변수 As 형식 으로 선언한다(Dim i As Integer). 선언하지 않고 쓰면 Variant 형이 된다
If 점수 >= 90 Then
    등급 = "A"
ElseIf 점수 >= 80 Then
    등급 = "B"
Else
    등급 = "C"
End If

Select Case 점수
    Case Is >= 90: 등급 = "A"
    Case 80 To 89: 등급 = "B"
    Case Else:     등급 = "C"
End Select
형식 언제 끝나나 조건 검사
For i = 1 To 10 Step 1 ... Next i 카운터가 끝값을 넘으면 -
For Each 셀 In Range("A1:A10") ... Next 컬렉션의 모든 요소를 돌면 -
Do While 조건 ... Loop 조건이 참인 동안 반복 먼저 검사(한 번도 안 돌 수 있다)
Do Until 조건 ... Loop 조건이 참이 될 때까지 반복(거짓인 동안) 먼저 검사
Do ... Loop While 조건 / Loop Until 조건 위와 같다 나중에 검사(최소 한 번은 실행)
Sub 예제()
    Test = 0
    Do Until Test > 10
        Test = Test + 1
    Loop
    Range("A1").Value = Test
End Sub
  • Test 가 0, 1, 2, … 10 일 때는 Test > 10 이 거짓이라 계속 1 을 더한다
  • Test 가 11 이 되는 순간 조건이 참이 되어 반복을 끝내므로 [A1] 에는 11 이 들어간다. 10 에서 멈추지 않는다
  • Do While Test < 10 으로 바꾸면 10 에서 끝난다. 1부터 10까지 더하는 식이었다면 55 다
  • Range("A1").Value = 10 - 셀에 값 넣기. Range("A1:C3") 처럼 범위도 된다
  • Cells(2, 3) - 2행 3열, 곧 [C2]
  • ActiveCell, Selection, Worksheets("Sheet1"), ActiveSheet
  • Range("A1").Formula = "=SUM(B1:B10)" - 수식 넣기
  • MsgBox "완료" - 메시지 상자, InputBox("이름?") - 입력 상자

액세스 폼과 컨트롤

편집 원본 편집

액세스에서는 폼·보고서의 컨트롤 이벤트에 이벤트 프로시저를 붙인다.

Private Sub cmd숨기기_Click()
    Me![DateDue].Visible = False
End Sub
  • 이벤트 프로시저 이름은 개체이름_이벤트이름 이다. 단추를 한 번 누르면 Click, 두 번 누르면 DblClick, 폼이 열릴 때 Load·Open, 값을 고친 뒤 AfterUpdate
  • Me 는 코드가 들어 있는 폼(보고서) 자신이다
  • 느낌표 ! 는 폼에 들어 있는 컨트롤(필드)을 가리키고, 마침표 . 는 그 개체의 속성·메서드를 가리킨다. 그래서 Me![DateDue].Visible 이 맞는 꼴이고 Me.[DateDue]!Visible·Me.DateDue!Visible 은 속성 자리에 ! 를 쓴 틀린 꼴이다. 컨트롤은 Me.DateDue 처럼 마침표로도 가리킬 수 있지만, 속성은 반드시 마침표로 잇는다. 이름에 공백이 있으면 대괄호로 감싼다
  • Visible 을 False 로 두면 컨트롤이 화면에서 숨겨지고 True 면 보인다. Enabled 는 사용 가능 여부, Locked 는 편집 잠금이다
  • DoCmd.OpenForm "폼이름", DoCmd.OpenReport, DoCmd.Close 처럼 DoCmd 개체로 매크로 함수를 부른다 → 액세스 매크로
  • 컨트롤의 종류와 속성은 액세스 컨트롤, 폼 구조는 액세스 폼

VBA 는 파일을 지우거나 외부 프로그램을 부를 수 있어 매크로 바이러스로 쓰이기도 한다. 매크로가 든 엑셀 파일은 .xlsm 으로 저장하고, 신뢰할 수 있는 파일만 [콘텐츠 사용] 으로 연다 → 바이러스