[엑셀 VBA #10] Find~Findnext 문 활용해서 검색하기





이번 주제는 바로 실무에 활용할 수 있는 Find~Findnext 문입니다.

Find~Findnext 문은 엑셀 VBA에서 활용도가 정말 높은 문법입니다.


Find문은 컨트롤 F 키를 눌러서 검색하는 것과 비슷한 기능을 할 수 있습니다.

검색된 부분을 다른 셀에 집어넣거나, 검색된 부분만 따로 떼어내는 등 여러 방면으로 응용할 수 있습니다.


예제를 받고 따라와주세요.


숨겨진 시트를 숨김 해제하면 이전 내용들도 수록되어 있습니다.











이번 예제는 버튼을 누르면 'E1'셀에 있는 내용을 좌측 데이터베이스 '이름' 항목에서 검색 후, 우측 칸에 입력하는 예제입니다.


위 예제는 이름 전체가 일치해야 검색되는 예제이지만, 상황에 따라 부분검색으로 변환할 수도 있습니다.


Sub example_6()

Dim c as Range

Dim StrFirstaddr as String

Dim StrAddr as String


With Sheet7.Range("a1:a31")


    Set c = .Find(Cells(1, 5).Value, Lookat:=xlWhole)       '부분검색은 Lookat:xlPart



    If Not c Is Nothing Then                'c라는 값이 검색된다면 (c가 데이터베이스에 존재한다면)


    StrFirstaddr = c.Address            '첫 주소 설정 (무한루프 방지용)

    StrAddr = c.Address                '주소값 설정



        Do

        Range(StrAddr).Resize(, 3).Copy Cells(Rows.Count, 6).End(3)(2)        '값이 존재하는 셀 바로 아래에 복사하기

        Set c = .FindNext(c)                                '다음 c 값 찾기

        StrAddr = c.Address                                '셀 주소 설정

        Loop While Not c Is Nothing And StrAddr <> StrFirstaddr            '첫 주소와 겹치지 않을때까지 루프

 

    End If

 



End With


End Sub


정말 간단합니다.


모두 이전 엑셀 VBA 강의에서 배웠던 내용들입니다.


값을 복사하는 것 뿐만 아니라, 검색된 부분 삭제, 다른 시트로 이동 등등 여러 방면으로 응용이 가능합니다.


엑셀으로 데이터베이스의 기본적인 원리를 구현하는 것이라고 생각하면 됩니다.


사전 프로그램의 원리도 이와 비슷합니다.
























Posted by Simon K
:



[엑셀 VBA #9] 값이 있는 마지막 셀을 선택, End 속성







엑셀에서는 컨트롤 키를 사용해서 값이 있는 셀의 끝으로 이동할 수 있습니다. (컨트롤 + 방향키)


엑셀 VBA에서도 물론 가능합니다.


End 속성을 사용하면 됩니다.






Cells(8, 7).End(1).Select









Cells(3, 3).End(2).Select









자, 여기서 의문이 생기죠.

분명히 마지막 셀으로 이동한다고 했는데, 실제로 사용해보니 그렇지 않습니다.

값이 있는 셀을 선택했을 경우 공백을 만나면 멈춰버립니다.


End 속성은 선택된 셀로부터 일정 방향으로 한 칸씩 이동하면서 마지막 값을 만나면 멈춥니다.


만약 공백이 듬성듬성 있는 데이터베이스에서 진짜로 마지막에 위치한 값을 찾으려면 어떻게 해야 할까요?


답은 간단합니다. 반대로 하면 됩니다.


빈 칸을 선택 후 End 속성을 사용하면, 첫 번째 만나는 값이 있는 셀에서 멈춰버립니다.


컨트롤 + 방향키로 선택하는것과 100% 같습니다.






Rows.Count, Columns.Count 속성



Row.Count는 엑셀이 허용하는 행 개수의 최대치를 나타냅니다.


Columns.Count는 엑셀이 허용한는 열 개수의 최대치를 나타냅니다.


엑셀 2013 기준으로 최대 행 개수는 1048576개, 열 개수는 16384개입니다.


따라서 맨 끝 행, 혹은 맨 끝 열부터 셀을 한 칸씩 이동했을 때, 만나는 첫 번째 셀이 값을 지닌 마지막 셀이 되는 것입니다.







Cells(Rows.Count, 7).End(3).Select





맨 아래 셀에서 한 칸씩 올라오면서(End(3)) 만나는 첫 셀을 선택




Cells(8, Columns.Count).End(1).Select





맨 오른쪽 셀에서 한 칸씩 좌측으로 이동하면서(End(1)) 만나는 첫 셀을 선택







응용하기


그렇다면 맨 마지막 셀도 아니고, 마지막 셀의 그 다음 셀을 선택하고자 한다면 어떻게 해야할까요?


저번 시간에 배운 Offset 속성을 사용하면 됩니다.


Cells(Rows.Count, 7).End(3).Offset(1,0).Select











Posted by Simon K
:


[엑셀 VBA #8] Resize, Offset 문을 이용한 셀 범위 설정



엑셀 VBA를 사용하다 보면 특정 셀 하나가 아닌 범위를 참조해야 하는 경우가 많습니다.


이러한 경우에 쓰이는 문법이 Resize문과 Offset 문입니다.





Resize


Resize문은 셀을 잡고 드래그하는 것과 같은 효과를 줍니다.






Cells(2,1).Resize(, 2).Select


위 사진과 같은 엑셀에 위 엑셀 VBA를 실행시키면 아래와 같이 선택됩니다.




Resize 괄호 안의 첫 번째 값이 커지면 아래로, 두 번째 값이 커지면 우측으로 드래그가 됩니다.


그렇다면 음수 값(마이너스 값)을 넣는다면 어떻게 될까요?


오류가 나게 됩니다.


가끔은 선택된 셀 좌측과 상단으로 범위를 설정해야 하는 경우도 생기게 되는데, 이 경우에 필요한 것이 Offset 문입니다.





Offset


※수정사항 : Offset문을 사용할 때에는 괄호 안 우측 값을 공백으로 두면 안됩니다.

   제가 공개한 스크린샷에는 우측 값이 공백으로 되있는데, 공백의 경우 0 값을 줘야 합니다.


Offset문은 선택된 셀을 기준으로 설정한 만큼 떨어진 곳에 위치한 셀을 선택합니다.


Cells(3,8).offset(, -1).Select


위와 같은 코드를 실행시키면




위와 같이 선택됩니다.

Resize문과 달리 음수 선택이 가능합니다.





그렇다면 선택한 셀의 좌측 혹은 상단으로 블록을 잡으려면 어떻게 해야 할까요?


Offset 문에서 사용한 엑셀을 재활용하겠습니다.




Cells(3, 8).Offset(, -1).Resize(, 2).Select


위 코드를 실행시키면...




이렇게 됩니다.


먼저 Offset으로 좌측의 셀을 지정한 후, Resize로 우측 한칸을 같이 블록지정 하게 됩니다.





Resize문과 Offset문은 엑셀 VBA에서 정말 많이 사용됩니다.

추후 엑셀 VBA 강의에서 계속~ 사용될 예정이니 꼭 확실히 이해하고 넘어가 주세요.














Posted by Simon K
:


[엑셀 VBA #7] SELECT CASE 조건문 활용하기



이번 시간에는 조건이 많을 경우 사용되는 SELECT CASE 조건문에 대해 알아보겠습니다.

조건문을 처음 접하시는 분은 저번 포스팅(if~else 조건문)을 먼저 읽어 보시고 시작해주세요.


늘 그렇듯이 예제와 함께 시작하겠습니다.

숨겨진 시트에 과거 포스팅 내용들이 담겨있습니다.







이번 예제는 지난번 예제와 비슷합니다.

학생의 점수 구간 별로 등급을 매기는 엑셀 VBA입니다.


SELECT CASE 조건문의 구조는 아래와 같습니다.


Select case 변수


case n1


명령


case n2


명령2


...


End Select


즉, 변수의 값을 케이스별로 구분해서 명령을 내린다는 뜻입니다.


예제를 살펴보겠습니다.


Dim i As Byte

Dim p As Byte


For i = 3 To 17 Step 1

p = Sheet6.Cells(i,2).Value


Select Case p

Case Is >= 90

Sheet6.Cells(i, 3).Value = "A"

Case Is >= 70

Sheet6.Cells(i, 3).Value = "B"

Case Is >= 50

Sheet6.Cells(i, 3).Value = "C"

Case Is >= 30

Sheet6.Cells(i, 3).Value = "D"

Case Is < 30

Sheet6.Cells(i, 3).Value = "F"


End Select


Next i


조건이 단순한 값인 경우에는 'Case a' 처럼 쓸 수 있지만,


조건을 범위로 둘 경우, 'Case is ~~'라고 작성해야 합니다.


또 한가지 주의해야 할 점으로, Select Case 문 역시 여타 엑셀 VBA 문법처럼 위에서 아래로 내려가는 실행 구조를 갖고 있습니다.


따라서 If~Else문과 같이, 합집합의 범위가 가장 작은 조건부터 작성해야 합니다.


간단하게 오류가 나는 예를 들어보겠습니다.


Dim i As Byte

Dim p As Byte


For i = 3 To 17 Step 1

p = Sheet6.Cells(i, 2).Value


Select Case p

Case Is < 30

Sheet6.Cells(i, 3).Value = "F"

Case Is >= 30

Sheet6.Cells(i, 3).Value = "D"

Case Is >= 50

Sheet6.Cells(i, 3).Value = "C"

Case Is >= 70

Sheet6.Cells(i, 3).Value = "B"

Case Is >= 90

Sheet6.Cells(i, 3).Value = "A"


End Select


Next i


위 예제가 앞서 보여드린 예제와 다른 점은 조건의 순서가 바뀐 것입니다.


이 예제에는 30보다 크거나 같은 조건을 앞에다 위치시켰습니다.


이런 경우에는 30보다 큰 모든 값이 D로 표시되게 됩니다.


F8을 눌러서 순차적으로 실행해 보면 알 수 있겠지만, Select Case문 같은 경우, 조건에 맞는 Case를 찾게 되면 명령을 실행한 후 바로 End Select로 넘어가게 됩니다.


따라서 각 조건의 관계는 아래 그림과 같이 형성되야 합니다.

A에서 D까지의 순서로 조건을 지정해 주어야 오류를 방지할 수 있습니다.


A의 조건을 먼저 실행하고 나면 그 다음 B 조건의 실제 범위는 A를 포함하지 않는 B의 범위가 됩니다.


따라서 조건이 서로 겹치지 않게 됩니다.





엑셀 VBA에서 가장 중요하고 기초가 되는 문법이 조건문과 반복문입니다.


꼭! 이해하고 넘어가 주세요.


다음 포스팅부터는 아주 조금 난이도를 높혀서 진행하도록 하겠습니다.













Posted by Simon K
:


[엑셀 VBA #6] IF~ELSE 조건문 활용하기




엑셀 VBA의 조건문은 두 가지로 분류될 수 있습니다.

첫째는 IF~ELSE문, 둘째는 CASE 문 입니다.

이번 포스팅에서는 조건문 중 하나인 IF~ELSE문에 대해 알아보도록 하겠습니다.


이번에도 마찬가지로 예제와 함께 시작하겠습니다.

시트 숨김을 해제하시면 이전 예제들도 확인할 수 있습니다.






이번 예제는 조건에 맞는 셀에 색상을 입히는 엑셀 VBA입니다.


위 예제는 조건문과 반복문이 같이 응용된 구조입니다.


IF~ELSE 조건문은 일반적으로 아래와 같이 구성됩니다.


If 조건1 and 조건2 ... 조건n


명령


else


명령


end if


상황에 따라 여러가지 조건을 부여할 수 있습니다.

조건식은 논리연산식을 기초로 합니다.


엑셀 VBA의 IF~ELSE 조건문은 엑셀 자체의 함수와 비슷합니다.

다만 단순 연산이 아닌 명령을 실행하는 데에 엑셀 자체 기능은 한계가 있기 때문에 그런 경우에 엑셀 VBA로 사용합니다.


예제의 코드를 살펴보겠습니다.


Dim i As Byte


For i = 3 To 10 Step 1           '3번째 행부터 10번째 행까지 색을 입혀야 하기 때문에 행을 i 로 하는 반복문을 만듭니다.


If Sheet5.Cells(i, 2).Value <= 60 Then                '셀의 값이 60보다 작거나 같을 경우

Sheet5.Cells(i, 1).Interior.Color = RGB(100,100,100)                '왼쪽 셀의 색깔을 RGB(100,100,100)으로 바꿉니다.

Else                   '60보다 같거나 작은 경우, 60보다 큰 경우, 두 가지뿐이 없기 때문에 Else 이하 명령은 생략합니다.

End If


Next i








두 번째 예제는 엑셀 VBA의 IF~ELSE 문을 활용한 다중조건문입니다.

엑셀 자체의 IF 함수에 다중 조건문을 형성할 수 있는 것처럼, 엑셀 VBA의 IF~ELSE 조건문도 다중으로 구성할 수 있습니다.


Dim i As Byte


For i = 14 To 21 Step 1


    If Sheet5.Cells(i, 2).Value = 0 Then

    Sheet5.Cells(i, 1).Interior.Color = RGB(100, 10, 10)


    Else

    

        If Sheet5.Cells(i, 2).Value = 100 Then

        Sheet5.Cells(i, 1).Interior.Color = RGB(200, 200, 200)

        

        Else

            If Sheet5.Cells(i, 2).Value <= 60 Then

            Sheet5.Cells(i, 1).Interior.Color = RGB(100, 100, 100)

            Else

            End If

        End If

    

    End If

        

Next i


잘 보시면 위의 식과 순서가 바뀌어있습니다.

값이 60보다 작거나 같을 경우를 가장 아래에 놓은 이유는, 0 또한 60보다 작거나 같을 경우에 해당하기 때문입니다.

따라서 조건이 가장 작고 다른 조건과 교집합이 존재하지 않는 조건을 가장 앞에 둬야 합니다.




사실 엑셀 VBA의 IF~ELSE문은 조건이 여러개일 경우 적합하지 않습니다.

식도 길어지고 제한이 많이 있습니다.

따라서 조건이 여러개일 경우에는 CASE문을 사용하는 것이 알맞습니다.


다음 포스팅은 CASE 조건문을 사용한 다중 조건문에 대해 알아보겠습니다.








Posted by Simon K
:


[엑셀 VBA #5] FOR~NEXT 반복문 응용하기



지난번 엑셀 VBA 포스팅에선 DO~LOOP문을 이용한 반복문에 대해서 배웠습니다.

이번 포스팅은 비슷하지만 다른 FOR~NEXT 문을 이용한 반복문에 대해 배워보겠습니다.


DO~LOOP 반복문은 변수를 여러개 지정해서 다소 복잡한 반복문을 작성하기에 적합하고,

FOR~NEXT 반복문은 변수를 한개만 사용하는 반복문에 적합합니다.

보통의 경우엔, 두 반복문 모두 같은 상황에 사욜할 수 있습니다.


이번에도 예제를 통해 알아보겠습니다.

난이도가 어렵지 않은 만큼, 이번 포스팅은 비교적 짧습니다.



예제3파일과 함께 따라와주세요.

이전과 같이 시트 숨김을 해제하시면 과거 내용들도 확인하실 수 있습니다.






이번 예제는 숫자가 1부터 2배의 등비급수로 증가한다고 할 때 100번 증가했을때의 값을 구하는 엑셀 VBA입니다.


쉽게 말하면, 1, 2, 4, 8, 16, 32, 64, 128, 256 ....  이런 식으로 숫자가 증가한다고 했을 시, 100번째 숫자를 구하는 방법입니다.


FOR~NEXT 반복문은 아래와 같이 구성되어 있습니다.



FOR i = 1 to 100 Step 1



명령


NEXT i



예제를 바로 살펴보겠습니다.


Dim i As Byte

Dim a As Double            '숫자가 얼마나 커질지 모르니 DOUBLE을 선언합니다.


a = 1


FOR i = 1 To 100 Step 1            'step 뒤 숫자는 i 가 1씩 증가한다는 의미


a = a * 2


NEXT i


Sheet4.cells(3, 2).value = a            '지정 셀에 값을 출력

MsgBox "FOR~NEXT문을 이용한 결과값은" & a & "입니다."            '팝업창 생성



정말 간단합니다.


FOR과 NEXT 코드 사이에

반복될 명령을 넣어주면 됩니다.


DO~LOOP문과의 차이점을 알아보기 위해, DO~LOOP문으로 똑같은 값을 출력하는 코드를 작성해 보겠습니다.


Dim i As Byte

Dim a As Double


a = 1

i = 1


DO

a = a * 2

i = i + 1

LOOP WHILE i <= 100


Sheet4.cells(3, 3).value = a

MsgBox "DO~LOOP문을 이용한 결과값은 "& a & "입니다."








엑셀 VBA에 있어, 반복문의 응용법은 무궁무진합니다.


그만큼 사용도가 높고 꼭 이해를 하고 넘어가야 하는 코드입니다.


이후의 엑셀 VBA 포스팅은 기본적으로 반복문이 들어가게 되니 확실히 이해를 하고 넘어가세요.


다음 포스팅은 조건문에 대해 알아보도록 하겠습니다.






Posted by Simon K
:

이전 포스팅 바로가기

[엑셀 VBA #3] 변수 종류와 선언, 활용법


[엑셀 VBA #4] 변수를 이용한 DO~LOOP 반복문 응용






반복문은 엑셀 VBA의 기본중의 기본이라고 할 수 있습니다.

이번 포스팅에서는 DO~LOOP문을 사용한 반복문에 대해 알아보겠습니다.

저번 포스팅과 같이 예제2 파일을 받고 따라와 주세요.

예제속에 있는 코드를 먼저 분석해 보시고 공부하시면 이해하기 훨씬 수월합니다.

예제 파일 속에는 지난 예제들이 모두 수록되있습니다. (숨김 해제하시면 됩니다.)



예제2.xlsm





DO는 '하다', LOOP는 '반복'을 의미합니다.

DO~LOOP 반복문은 아래와 같이 구성되어 있습니다.


DO

명령1

명령2

명령3

.....

변수 = 변수 +(-) X

LOOP WHILE 조건


즉, 아래에 있는 조건에 부합할 때에, DO 아래, LOOP 위에 있는 명령을 반복 시행한다는 의미입니다.

하지만 DO~LOOP 반복문은 조건문과 비슷해 보이지만 대체할 수 없습니다.

엑셀 VBA는 기본적으로 위에서 아래로 순차적으로 명령을 수행합니다.

따라서 조건에 부합하지 않더라도, LOOP 문이 읽히기 전에는 DO 문 아래에 위치한 명령이 최소 1회는 실행되게 됩니다.


예를 들어, 아래와 같은 코드를 실행했을 경우,



Sub test()


x = 110


DO

msgbox "x는 100보다 큽니다."            'msgbox문은 화면에 팝업창을 띄우는 코드입니다.

x = x - 1

LOOP WHILE X > 100


End Sub


x의 기본값은 110이고, LOOP WHILE 뒤에 붙은 조건은 X > 100 이기때문에,

"x는 100보다 큽니다." 라는 팝업이 10번 생성됩니다.

하지만 코드가 아래와 같다면 어떨까요?


Sub text ()


x = 99


DO

msgbox "x는 100보다 큽니다."

x = x - 1

LOOP WHILE X > 100


End Sub


위 코드의 경우, x의 기본값 자체가 99이고 LOOP WHILE 뒤에 붙은 조건에 부합하지 않습니다.

하지만 코드를 실행했을 경우, 조건에 부합하지 않음에도 불구하고 팝업창이 한번 뜨게 됩니다.

따라서 DO~LOOP문은, 명령을 일단 한번 실행한 후, 조건에 맞는 경우 코드를 반복하는 문법이라고 생각하면 됩니다.


VBA 실행창에서 F8을 눌러서 순차적으로 코드를 실행해보세요.






DO~LOOP문을 이용한 반복문 이중구조


엑셀 VBA 코드를 작성하다 보면 한 개의 반복문만으로 부족한 경우가 생기게 됩니다.

이러한 경우에 DO~LOOP문 밖에 DO~LOOP문을 한번 더 사용하여, 반복문 이중구조를 구성할 수 있습니다.

예제2 속의 예제가 반복문 이중구조의 대표적인 예입니다.




예제는 위에 보이는 버튼을 누르면 우측 상자에 좌측 상자와 같이 피라미드식으로 숫자 열이 생성되는 로직입니다.


예제의 로직을 차근차근 살펴보겠습니다.




1. 변수 선언


먼저 Dim 문을 사용해 사용할 변수를 선언합니다.

255가 넘어갈 수 없는 숫자기이 때문에 메모리 용량이 가작 작은 Byte로 선언했습니다.


위 반복문을 실행하기 전에 사용해야 할 변수는 총 몇개일까요?

변수란 말 그대로 '변하는 수'입니다.

따라서 로직 속에서 변하는 수를 생각하면 쉽게 구할 수 있습니다.


1. 각 숫자가 위치해야할 행 i

2. 각 숫자가 위치해야할 열 p

3. 각 행에 들어가야할 숫자 개수 x

4. 입력되야하는 값 y

5. 반복 수 i (1번과 같은 값을 사용합니다)


Sub example_2


Dim i As Byte

Dim p As Byte

Dim x As Byte

Dim y As Byte


따라서 위와 같이 변수 선언을 합니다.





2. 기본 값 설정


반복문을 실행하기 전에 반복문이 실행되는 위치와, 출력할 첫 번째 값을 설정해야 합니다.

위의 예제 속에서 처음 값이 출력되야 하는 위치는 K2셀이고, 이를 좌표로 환산하면 (2, 11)입니다.

따라서 행값 i 는 2, 열값 p 는 11을 줍니다.

그리고 첫 행에 한 개의 숫자가 들어가기 때문에 숫자 개수값 x는 1이 되고, 첫 항에 들어가는 값이 1이기 때문에 값 y 또한 1이 됩니다.


i = 2

p = 11

x = 1

y = 1



이제 첫 항을 설정 했으니, 본격적으로 DO~LOOP 반복문을 집어넣습니다.





3. 매 행에 적정 개수의 수를 입력하는 DO~LOOP문 입력


위에 설명했듯이, 이번 예제는 DO~LOOP 이중구조를 갖고 있습니다.

따라서 DO~LOOP문 안에 또 다른 DO~LOOP문이 들어가는 구조를 형성합니다.


먼저 안쪽에 들어가는 반복문을 작성합니다.


Do

Sheet3.cells(i, p).Value = y

p = p + 1

y = y + 1

x = x + 1

Loop While x<i





4. 다음 행으로 넘어가는 DO~LOOP문 입력


위 반복문 밖에 다음 행으로 진행시키는 반복문을 작성합니다.


Do

i = i + 1        '다음 행으로 진행시키는 코드

y = 1        '출력 값 초기화 (행이 바뀌면 1부터 다시 시작해야하기 때문)

p = 11        '출력 열 위치 초기화 (첫 열부터 다시 입력해야하기 때문)

x = 1        '반복 횟수 초기화

Loop While i < 11        '10번째 행까지만 입력하도록 제한





5. 반복문 합치기


두 반복문을 합쳐줍니다.


Do


Do

Sheet3.cells(i, p).Value = y

p = p + 1

y = y + 1

x = x + 1

Loop While x < i


i = i + 1

y = 1

p = 11

x = 1

Loop while i < 11






6. 코드 완성

Sub example_2()

Dim i As Byte

Dim p As Byte

Dim x As Byte

Dim y As Byte

i = 2             

p = 11         

x = 1            

y = 1            


Do                                   

            Do                        

            Sheet3.Cells(i, p).Value = y

            p = p + 1

            y = y + 1

            x = x + 1

            Loop While x < i


i = i + 1            

y = 1                   

p = 11                

x = 1

Loop While i < 11            

End Sub











DO~LOOP 반복문은 정말 간단하지만, 이중구조로 되어있을 경우 사뭇 복잡해 보입니다.

예제 코드를 연구해 보시고, 숫자를 바꿔서 여러번 시도해 보세요.

그리고 자신만의 코드를 구상해서 반복문을 구현해 보시면 확실히 이해하실 수 있을겁니다.

궁금한 점이나 질문은 댓글로 남겨주시기 바랍니다.












Posted by Simon K
:

[엑셀 VBA #3] 변수 종류와 선언, 활용법




이번 포스팅에선 엑셀 VBA에서 사용되는 변수 종류와 선언, 활용법에 대해 알아보겠습니다.

시작에 앞서 아래 파일을 클릭해서 예제1 파일을 받고 차근차근 따라와 주세요.



예제1.xlsm


변수는 프로그래밍에서 빠질 수 없는 요소로써, 엑셀 VBA를 시작하는 단계에서 확실히 잡고 넘어가야 합니다.

변수의 종류와 성격에 대해 간략하게 표로 만들어봤습니다.






   ※파일에 엑셀 형식으로 저장되어 있습니다.




엑셀 VBA에서 변수를 선언하는 이유


위의 표에서 알 수 있듯이, 각 변수에는 할당된 메모리 용량이 있습니다.

Byte의 경우 1바이트의 용량을 할당받지만, Variant의 경우 무려 16바이트의 용량을 할당받습니다.

변수 설정을 하지 않는 경우에는 Variant 변수로 설정이 됩니다.

엑셀 VBA 프로젝트를 교실로 비유한다면, 변수는 학생들의 책상과 같습니다.

마른 학생도 있고 뚱뚱한 학생들도 있겠죠?

교실에 가장 많은 학생을 수용하려면 마른 학생에겐 작은 의자를, 뚱뚱한 학생에겐 넓은 의자를 배정해주어야 합니다.

따라서 1, 33, 45, 100 과 같이 0과 255 사이의 숫자가 변수로 예상될 때에는, 작은 의자에 해당되는 Byte 변수로 지정해 주면 되는것입니다.

즉, 메모리 활용을 효율적으로 하기 위해 변수 선언은 꼭 필요합니다.


또한, 변수간의 혼동 예방, 숫자 연산의 정확성 등등 여러 이유로 변수 선언은 엑셀 VBA 작성에 앞서서 필히 행해져야 하는 과정입니다.




엑셀 VBA 변수 선언 방법



예제1 파일에서 ALT + F11로 VBA 관리자 화면에 접근하시면 코드를 확인하실 수 있습니다.

변수 선언의 기본적인 방법은 아래와 같습니다.


Dim 변수이름 As 변수종류





각 변수가 출력하는 값의 형식


a라는 변수에 똑같이 숫자 1을 값으로 지정해 준다고 하여도, 변수 타입을 어떻게 지정해주었는지에 따라 출력되는 값이 바뀌게 됩니다.

예제1 파일에서 설정 값을 0으로 주고 각 변수 종류별 출력 값을 알아보겠습니다.







위의 예제에서 알 수 있듯이, 똑같이 '0'을 값으로 지정해 주었지만, 출력되는 값은 상이합니다.

범위를 초과하는 값을 지정할 경우 할당된 메모리 용량을 벗어나게 되고, 에러가 발생하게 됩니다.

예제를 활용하여 여러 값을 지정해 보고 출력되는 값을 알아보세요.




숫자와 관련된 변수 종류(Byte, Integer, Long, Single, Double, Currency)


숫자와 관련된 변수를 사용할 때에는, 기본적으로 각 변수 형식이 허용하는 범위만 유념하면 됩니다.

일반적으로 Integer, Double 변수가 많이 사용됩니다.





문자와 관련된 변수 String


문자를 변수로 지정하려면 String으로 변수를 선언해야 합니다.

숫자를 String으로 지정하면 숫자를 문자로 인식합니다.

a라는 변수를 String으로 선언하고 값을 1으로 지정했을 때 , a + a 라는 연산을 수행하게 되면 출력되는 값은 2가 아닌 11입니다.




논리값 변수 형식 Boolean


변수를 Boolean으로 선언하게 되면 True, False 두 가지 값만 출력하게 됩니다.

기본 값은 False이며, 0을 제외한 모든 숫자를 값으로 지정할 경우 True를 출력합니다.





날짜 및 시간 변수 형식 Date


Date 형식은 사무용 엑셀을 만들 때 가장 많이 쓰는 형식 중 하나입니다.

0부터 2958465까지의 숫자와 1900년 1월 1일부터 9999년 12월 31일까지의 날짜가 1:1 대응합니다.

따라서 날짜와 숫자간의 연산이 가능합니다.

예를 들어 1900-01-01 에 1을 더하면 1900-01-02가 됩니다.





개체변수 Object 변수


엑셀 VBA를 사용하다 보면 범위, 워크시트 등을 변수로 지정해야 하는 상황이 옵니다.

예를 들어 개체의 위치 Workbook("예제1).Worksheets("예제1").range("A1") 를 변수 a라고 지정하고 Object로 선언하게 되면,

a.value 는 workbook("예제1").worksheets("예제1").range("A1").value과 같은 값을 갖게 됩니다.

코드가 어느정도 복잡해 지면 로딩시 속도가 현저히 느려지게 되는데, Object 변수를 잘 활용하면 속도 저하를 방지할 수 있습니다.





변수 선언은 엑셀 VBA에 있어 기초가 되는 과정입니다.

단순한 숫자나 문자는 굳이 선언이 필요 없지만(자동으로 Variant로 지정되기 때문에), 적당한 변수 선언을 하는 습관을 길러야 나중에 메모리 부족으로 인한 불상사를 방지할 수 있습니다.


다음 포스팅은 본격적으로 변수를 활용하는 반복문에 대해 알아보도록 하겠습니다.

엑셀 예제1의 VBA 관리자에 반복문에 대한 힌트를 수록하였으니 확인해보세요.









Icon made by Freepik from www.flaticon.com






Posted by Simon K
:


[엑셀 VBA #2] 독학 시작하기, 엑셀 VBA의 기본



이번 포스팅에선 본격적으로 엑셀 VBA 공부에 들어가기에 앞서, 준비해야할 것들을 살펴보겠습니다.

엑셀 VBA를 사용하시려면 기본적으로 마이크로소프트 오피스 엑셀(2003, 2007, 2013, 365)이 있어야 합니다.

당연히 버전이 높아질 수록 함수와 기능도 많아집니다.


개인적으로 오피스 365를 제외한 모든 버전을 사용해봤는데 2013이 가장 깔끔하고 사용하기 편했습니다.

디자인, 기능 모두 2013 버전이 우월합니다. 구 버전을 사용하고 계시다면 업그레이드 하시길 추천합니다.

따라서 이번 엑셀 VBA 시리즈는 오피스 2013을 사용하여 진행하려고 합니다.

구 버전을 사용하셔도 무방합니다.



준비물 : 오피스 엑셀(2003 이후 버전), 인터넷




시작하기에 앞서, 엑셀 VBA를 사용하기 위한 설정이 필요합니다.



1. 엑셀을 실행하면 열리는 친숙한 창입니다.

좌측 상단의 '파일'을 클릭하겠습니다.



2. '파일'탭을 열면 열리는 창에서 가장 아래에 위치한 '옵션'을 클릭합니다.




3. 좌측 '리본 사용자 지정'을 클릭 후 동그라미 속 '개발 도구' 항을 화면과 같이 체크해주세요.




4. 좌측에 보이는 '보안 센터' 탭을 클릭 후, 우측에 있는 '보안 센터 설정'을 누릅니다.



5. 좌측에 보이는 '매크로 설정' 탭을 클릭 후, 두 번째에 있는 '모든 매크로 제외(알림 표시)를 선택 후 우측 하단의 '확인'을 누릅니다.


위 설정을 따라가시면 엑셀 VBA가 포함된 .xlsm 파일을 열어보실 수 있게 됩니다.

마지막 사진에서 알 수 있듯이 매크로를 제외하되 알림을 표시하게 설정했기 때문에,

매크로(VBA)가 포함된 파일을 열 경우 알림창이 뜨게 되고 '예'를 누르시면 매크로가 활성화됩니다.


'모든 매크로 포함'을 선택할 경우 매크로 바이러스에 노출될 수 있으니 주의하셔야 합니다.




자 이제 엑셀 VBA를 사용하기 위한 모든 준비는 끝났습니다.


바로 끝내기 아쉬우니 엑셀 VBA의 가장 기본적인 기능 하나만 체험해 보겠습니다.




1. ALT + F11 키를 누르면 위와 같은 창이 나옵니다.



2. Sheet1 항을 우클릭 한 후 '코드 보기'를 클릭하면 화면과 같이 글을 입력할 수 있는 흰색 창이 나옵니다.



3. 위와 같이 입력하고 컨트롤 + S 키로 저장해줍니다.

Sub hello_excelVBA()


Sheet1.Cells(1, 1).Value = "a"


End Sub




4. 다시 엑셀 기본 창으로 빠져나와서 상단 '개발 도구' 클릭 후 삽입 -> 양식컨트롤(버튼) 클릭해 줍니다.

'개발 도구' 탭이 없다면 본 포스팅 앞쪽에 있는 준비설정을 차근차근 다시 설정해보세요. 



5. 엑셀 시트 아무대나 드래그하면 버튼을 생성할 수 있습니다. 버튼을 생성하면 위와 같이 매크로 지정 팝업이 나타납니다.

방금 만든 매크로를 선택 후 확인을 눌러줍니다.




5. 생성된 단추를 클릭 후, 결과물을 확인해 봅니다.




지금까지 엑셀 VBA 사용 설정과 엑셀 VBA 프로그래밍의 가장 기본인 '데이터 입력' 과정을 살짝 배워보았습니다.

위 식(Sheet1.cells(1, 1).value = "a")의 변수(1, 1) 와 값 ("a")을 바꿔보며 명령어의 메커니즘을 알아보세요.

다음 포스팅은 좀 더 심화된 주제로 찾아오겠습니다.









본 포스팅에 사용된 아이콘 이미지는 www.flaticon.com의 Freepik에 의하여 제작되었습니다.

Icon made by Freepik from www.flaticon.com




Posted by Simon K
:

"엑셀 VBA, 왜 필요할까?"


           



컴퓨터가 발명된 이래, 사람의 뇌를 컴퓨터로 이식하려는 노력은 끊임없이 이어지고 있습니다.

사람의 뇌가 컴퓨터보다 못한 부분도 물론 있긴 하지만, 아직 컴퓨터가 따라오지 못하는 부분도 많이 존재합니다.

엑셀 또한 마찬가지입니다. 

엑셀 자체로도 아주 뛰어난 프로그램이긴 하지만, 엑셀은 분명한 한계를 지니고 있습니다.


엑셀의 가장 기본적인 기능을 예를 들어서 표현하자면 아래와 같습니다.

① "  '셀 A'의 값과 '셀 B'의 값을 더해서 '셀 C'에 출력하라.  "

하지만 위 명령이 이렇게 바뀐다면 어떨까요?

② "  '셀 A'의 값과 '셀 B'의 값을 더하는 행위를 100번 시행하고, 그 값을 '셀 C'에 출력하라.  "


엑셀은 1번과 같은 명령은 처리할 수 있지만, 2번과 같은 명령은 처리하지 못합니다.

이유가 무엇일까요?


사실 예제 ①의 경우에도 약간 오류가 있습니다.

엑셀은 사용자의 '명령'을 받는 프로그래밍 언어가 아닙니다.

엑셀은 내장된 함수로 구현할 수 있는 범위에서만 작동합니다.


엑셀에는 2013버전 기준으로 461개의 함수가 내장되어 있습니다.

엑셀의 각 셀은 제공되는 함수를 사용하여 다른 셀과 연계하여 연산을 진행합니다.

하지만 함수로 정의되지 않은 명령들(복잡한 다중 조건문, 반복문)등은 사용자가 직접 명령을 만들어줘야 하는데,

이 때 필요한 것이 엑셀 VBA입니다.


즉, 예제 ①의 경우는 간단하게 '+' 연산자로 연산식을 만들 수 있지만,

예제 ②의 경우는 저런 기능을 하는 함수가 없기 때문에 엑셀 자체에서는 구현할 수 없다는 것입니다.

따라서 엑셀은 사용자들이 직접 명령을 내릴 수 있게 프로그래밍 툴인 VBA(Visual Basic Advanced)를 빌려오게 됩니다.





엑셀 VBA, 어떻게 배워야 하나?


결론부터 말하자면, 엑셀 VBA는 프로그래밍 지식이 없어도 충분히 독학할 수 있습니다.

물론 전문가처럼 마스터할 수는 없지만, 자신이 필요로 하는 기능을 구현하는 정도까지는 누구나 할 수 있습니다. 

하지만 독학이 '책을 사서 혼자 공부하는 것'은 절대 아니라는것을 명심하셔야 합니다.

엑셀 VBA는 지극히 실용적인 지식입니다. '공부'라는 단어는 엑셀 VBA와 어울리지 않습니다.

직접 해보셔야 합니다. 



프로그래밍 지식이 전혀 없다면 자기 자신을 돌도 지나지 않은 아기라고 생각하세요.

아기들은 본능적으로 서서 걸으려고 시도합니다. 

자꾸 넘어져도 계속 일어나려고 애를 씁니다.

하지만 아기들은 '걷는 법'이라는 책을 사서 공부하지는 않습니다.

이상한 비유이긴 하지만, 엑셀 VBA도 똑같습니다.

어떻게 하는지 모르더라도 일단 시도해 보세요.

'자기가 필요한게 뭔지, 엑셀로 구현해야 하는 기능이 무엇인지 생각을 하고, 그 기능을 직접 알아내셔서 적용시켜 보는 그 과정'

이 과정이 엑셀 VBA를 독학하는 과정입니다.

개인적인 이야기를 하자면 저는 엑셀 VBA를 군생활 할 때 처음 접했습니다.

당시에 부대 PC 윈도우즈 OS를 대대적으로 업그레이드 하면서 일부 프로그램이 작동을 안하게 된 적이 있었지요.

주소를 검색하는 프로그램이었는데, 인트라넷으로는 외부 파일을 가져오기도 힘들고, 다른 프로그래밍 툴을 구하기도 힘들었기에

그나마 엑셀에 기본 내장되있던 엑셀 VBA를 사용해서 주소를 검색하는 엑셀 프로그램을 만들었었습니다.

프로그래밍 지식이 하나도 없었음에도 불구하고, 엑셀 VBA에 내장되어 있는 도움말만으로도 충분했습니다.

도움말으로 공부하라는 것이 아닙니다. 저는 무엇이 중요한가를 말하고 싶습니다.

자기 자신이 필요로 하는 기능을, 처음엔 당연히 허접하겠지만, 그래도 한 번 만들어 보세요.

인터넷에서 검색해보고, 다른 사람들이 올려놓은 예제를 참고하면 충분히, 충분히 만들 수 있습니다.

얼마나 많은 명령어를 외우고 있느냐가 중요한 것이 아닙니다.

인터넷에 검색하면 명령어는 1분이면 찾을 수 있습니다.

'실제로 구상하는 기능을 엑셀 VBA를 사용하여 엑셀에 응용시킬 수 있는가?'

이것이 엑셀 VBA의 관건이고, 공부해야하는 능력입니다.

단언컨데, 절대로 책에선 배울 수 없습니다. 실천만이 답입니다.

다음 포스팅은 좀 더 구체적인 독학 방법으로 찾아오겠습니다.






위 포스팅에 사용된 아이콘 이미지는 www.flaticon.com의 Freepik에 의하여 제작되었습니다

Icon made by Freepik from www.flaticon.com










 




Posted by Simon K
: