티스토리 뷰

VBA

[Excel][VBA] VBA 프로그래밍 다지기

어린왕자1234 2021. 11. 21. 11:16

VBA 언어의 구성 요소와 문법

※ 명령문 한줄에 입력 시 : (콜론) 이용

   For i = 1 to 100 : Total = Total + i : Next i

 

■ 주석

   ( ' )작은 따옴표 이용

   용도 : 설명을 달고자 할 때 / 코드 테스트에서 주석처리하여 코드 실행 해제 할 때

   ※ "문자열안의 작은 따옴표"  : 큰따옴표 안의 작은따옴표는 문자열의 일부분으로 본다.

      Txt = "Can't find."

 

■ 변수

    ※  변수 작명 원칙

         -  대소문자를 구분하지 않는다. 

            : 변수 선언 시 이름이 이후 코딩 때 바로 적용됨 (대소문자를 구분하는 것처럼 보임)

              쉽게 알아 볼 수 있도록 대소문자를 혼합하여 작명한다.

              Dim DataEntry as Currency

        - 첫글자는 영문자(한글)로 시작하고 숫자, _(언더바) 조합 가능

        - 특수문자는 사용 불가

        - 공백, .(마침표) 사용 불가

   ※  Dim i, j, k as Integer 선언하면 k만 Integer자료형이되고 나머지는 모두 Variant자료형이다.

        ▶변수 적용 범위

           지역변수(Dim) : 현 프로시저 내

           모듈수준변수(Dim | Private)  : 현 모듈 내

           전역변수(Public) : 프로젝트 내  , 표준 모듈에서만 선언 가능

           정적변수(Static) : 프로시저가 종료해도 값 유지

           ## 모든 변수는 프로시저 내에서 End명령을 사용하면 재설정된다.

                ActiveSheet.PageSetup.Orientation = xlLandscape    ' 2

 

■ 개체 변수

   범위, 워크시트 등을 참조하는 변수 선언 가능

   객체 변수가 개체를 참조하려면 Set 키워드 사용

   [이점] .(dot)의 숫자가 줄어 들어 처리 속도가 빨라지며, 코드가 간결해진다.

            => With ~ End With 도 같은 기능

   Dim MyRange as Range

   Set MyRange = ActiveSheet.Range("A1:E10")

 

■ 상수

    Const Rate as Double = 2.43

    Public Const Rate as Double = 2.43   ' 전역 상수

    ※ 내장 상수 : VBA에 이미 선언된 상수 - 상수명, 값을 바로 사용 가능

 

■ 자료형

- 워크시트에서 수식계산은 Double 자료형 사용

- 정수 계산에는 integer자료형 사용하라

- 워크시트의 행을 다룰 때는 long자료형 사용하라

- 지료형을 지정하지 않고 코드 작성하면 Variant 자료형으로 처리된다.

- 변수 선언시 자료형 지정 습관을 들이는게 중요(에러처리에 더 유용/ 처리속도 더 빨라짐)

      Optin Explicit      : 도구>옵션>편집기>[변수선언요구] 체크

- 문자열 + 문자열  = 문자열 & 문자열     : "123" + "123" => "123123"

 

■ 사용자 정의 자료형

   [Public | Private] Type ~ End Type문 이용

   모듈의 첫번째 프로시저 앞에 선언 

Type CustomerInfo
    Company As String
    Contact As String
    RegionCode As Long
    Sales As Double
End Type
    
Sub 고객정보()
    Dim Customer As CustomerInfo
    Dim Customer2 As CustomerInfo
    With Customer
        .Company = "LG"
        .Contact = "010-111-1111"
        .RegionCode = "1234"
        .Sales = "50000000"
    End With
    
    Debug.Print (Customer.Company)
    Debug.Print (Customer.Sales)
    
    Customer2 = Customer

End Sub

 

▶ Data Type 확인 함수 : TypeName(변수명)

Sub VariantDemo3() 

   MyVar = True
   MsgBox TypeName(MyVar) 
   MyVar = MyVar * 100 
   MsgBox TypeName(MyVar) 
   MyVar = MyVar / 4  
   MsgBox TypeName(MyVar) 
   MyVar ="Answer:" & MyVar 
   MsgBox TypeName(MyVar) 

End Sub

 

 Type conversion functions
o    CBool(expression)
o    CByte(expression)
o    CCur(expression)
o    CDate(expression)
o    CDbl(expression)
o    CDec(expression)
o    CInt(expression)
o    CLng(expression)
o    CLngLng(expression) (Valid on 64-bit platforms only.)
o    CLngPtr(expression)
o    CSng(expression)
o    CStr(expression)
o    CVar(expression)

 

■ 문자열 변수

    Dim Name As String * 20     ' 고정길이 문자열  (20자로 한정한 경우)

    Dim Address As String         ' 가변길이 문자열

 

■ 날짜 처리

#month/day/year# 

Const FirstDay as Date = #1/1/2021#

ActiveSheet.Range("A1") = Date      ' 금일 날짜

ActiveSheet.Range("A1") = DateSerial(2021,1,1)   ' 엑셀 Date함수 기능

 

■ 연산자

https://docs.microsoft.com/ko-kr/office/vba/language/reference/user-interface-help/eqv-operator

산술연산자 : + - * /   ^(거듭제곱)   &(문자열 연결)   \(나누기 몫)   Mod(나누기 나머지)

                 + : 문자열 연결 연산자로도 사용됨  ( result = "강아지" + "꼬리" )

비교연산자 : =(같다)   <>(다르다)   >(크다)   <작다)   >=(크거나같다)   <= (작거나같다)

논리연산자 : Not   And   Or   Xor(다르면 True)   Eqv(Equivalence, 동일하면 True)   

                 Imp(  implication     A: 1 B: 0 일때만 False)

Function Test(연산자)
Dim arr As Variant
Dim r, j

arr = Array(False, True)

Debug.Print ("-----------------")

Select Case LCase(연산자)
    Case "and"
        For Each r In arr
            For Each j In arr
            Debug.Print r And j
         Next j, r
    Case "or"
        For Each r In arr
            For Each j In arr
            Debug.Print r Or j
         Next j, r
    Case "xor"
        For Each r In arr
            For Each j In arr
            Debug.Print r Xor j
         Next j, r
    Case "not"
        For Each r In arr
            Debug.Print Not r
         Next r
    Case "eqv"
        For Each r In arr
            For Each j In arr
            Debug.Print r Eqv j
         Next j, r
    Case "imp"
        For Each r In arr
            For Each j In arr
            Debug.Print r Imp j
         Next j, r
End Select

End Function
Sub aaa()
    Test ("not")
End Sub