정말 오랜만에..... 올리는 사다리타기 만들기 2편입니다.


벌써 반년이 지났네요.. 허미.. ^^;


각설하고, 시작할게요~!



이 포스팅의 제목은 '엑셀 메크로를 사용해 사다리타기 만들기' 이지만..


사실 컴퓨터 언어를 코딩하는데 에 있어 필요한 로직 구상법에 대해 알아보는 포스팅에 가깝습니다.


예전에도 언급한 적이 있는 것 같지만, 엑셀 vba와 같은 정말 기초적인 언어도 여타 언어들과 별반 다르지 않습니다.


로직을 구상하고, 로직을 현실화 시키는 수단인 것은 엑셀 vba나 java나 매한가지입니다.



파일을 받고, 실행시킨 후 따라와주세요~!

지난 게시글에 있는 사다리타기 파일에서 조금 수정되었습니다.


----


1. 그림을 그려보자


먼저 1차원적인 접근부터 시작합니다.


사다리타기에 필요한 요소가 무엇이 있는지, 머리속으로 그림을 그려봅시다.


① 몇 명의 인원이 참여하는지 선택하는 버튼

② 시작 버튼

③ 사다리 위쪽, 참여자 이름이 들어가야 할 공간

④ 사다리 그 자체

⑤ 사다리 아래쪽, 사다리 선택 결과가 들어가야 할 공간




제가 그린 그림은 위와 같습니다.


정답은 없습니다.






2. 기능을 구상하자


사다리타기를 구현하는 데에 필요한 기능을 만들어야 합니다.


쉬운 것부터 차례대로 진행해보겠습니다.


① 1인용 ~7인용 버튼을 누르면 각각 버튼 내용에 맞게 사다리 세로 짝대기가 그려진다. (기존에 있던 내용은 사라진다)

② 시작 버튼을 누르면 랜덤하게 가로 짝대기 (사다리 손으로 잡고 올라가는 부분) 이 그려지며

③ 사다리에 색깔이 입혀지며 자동으로 내려간다.

④ 마지막 결과를 팝업창에 출력한다.


물론 정답은 없습니다.


사다리 만드는 버튼과 사다리 실행 버튼을 따로 만들어도 문제 없고, 결과를 팝업창에 출력하는 대신 아래쪽 칸에 출력시키는 방법도 있습니다.






3. 로직을 구성하자


구상한 기능에 필요한 로직을 구성해야 합니다.


이게 무엇이냐 함은..


컴퓨터도 사람과 비슷합니다.


생각함에 있어 순서가 필요합니다.


자, 사다리타기를 종이에다 대충 그려보고, 손가락으로 짚으며 사다리타기를 진행해보세요.


이때 머리 속에서 이루어지는 사고의 과정을 컴퓨터에게도 동일하게 알려줘야 합니다.


⑴ 사다리를 만들 때 

 

※먼저 세로줄을 인원 수에 맞게 만든다. 


 ① 첫 번째 세로 줄과 두 번째 세로 줄 사이 상단 어딘가에 첫 번째 가로줄을 그린다. 

 ② 우측 칸으로 이동해서 가로줄을 그린다.

 ③ ② 반복

 조건: 가로줄 두개가 연결되어있으면 안된다. (사진 아래쪽 가로줄은 잘못된 예시)

 ④ 우측 끝까지 이동한 경우 한칸 아래로 이동, 및 좌측 첫째 칸을 선택

 ⑤ ③④ 반복

 ⑤ 사다리 세로줄이 더 내려갈 곳이 없을 때 사다리 만들기를 중단한다. (단, 맨 아래칸은 가로줄 생성이 되면 안된다.)

 조건 : 사다리 가로줄은 랜덤으로 듬성듬성 생성해야 한다.

상단: 두 가로줄이 엇갈려있다 OK

하단: 두 가로줄이 연결되있다 NO


위의 로직을 잘 따라갔다면..

 



이렇게 사다리가 완성됩니다.






4. 코딩


이제 코딩이 시작됩니다.


3번에서 구상한 로직들을, 컴퓨터가 알아먹는 말으로 바꿔줘야 합니다.


아래 예시에서는 이해를 위해 변수 선언은 하지 않겠습니다.


※세로줄 만들기


Public Int_PQuantity As Integer '<- Int_PQunantity (플레이하는 인원 수) 변수를 Public으로 선언합니다. 다른 함수에서도 해당 변수를 사용할 수 있습니다.




Sub p_1()

Range("C14:O46").Interior.ColorIndex = xlNone

Range("C15:C46").Interior.Color = black

MsgBox "혼자서는 할 수 없습니다."

End Sub

Sub p_2()

Range("C14:O46").Interior.ColorIndex = xlNone

Range("C15:C46").Interior.Color = black

Range("E15:E46").Interior.Color = black

Int_PQuantity = 2

End Sub

Sub p_3()

Range("C14:O46").Interior.ColorIndex = xlNone

Range("C15:C46").Interior.Color = black

Range("E15:E46").Interior.Color = black

Range("G15:G46").Interior.Color = black

Int_PQuantity = 3

End Sub

Sub p_4()

Range("C14:O46").Interior.ColorIndex = xlNone

Range("C15:C46").Interior.Color = black

Range("E15:E46").Interior.Color = black

Range("G15:G46").Interior.Color = black

Range("I15:I46").Interior.Color = black

Int_PQuantity = 4

End Sub

Sub p_5()

Range("C14:O46").Interior.ColorIndex = xlNone

Range("C15:C46").Interior.Color = black

Range("E15:E46").Interior.Color = black

Range("G15:G46").Interior.Color = black

Range("I15:I46").Interior.Color = black

Range("K15:K46").Interior.Color = black

Int_PQuantity = 5

End Sub

Sub p_6()

Range("C14:O46").Interior.ColorIndex = xlNone

Range("C15:C46").Interior.Color = black

Range("E15:E46").Interior.Color = black

Range("G15:G46").Interior.Color = black

Range("I15:I46").Interior.Color = black

Range("K15:K46").Interior.Color = black

Range("M15:M46").Interior.Color = black

Int_PQuantity = 6

End Sub

Sub p_7()

Range("C14:O46").Interior.ColorIndex = xlNone

Range("C15:C46").Interior.Color = black

Range("E15:E46").Interior.Color = black

Range("G15:G46").Interior.Color = black

Range("I15:I46").Interior.Color = black

Range("K15:K46").Interior.Color = black

Range("M15:M46").Interior.Color = black

Range("O15:O46").Interior.Color = black

Int_PQuantity = 7

End Sub




p_1 ~ p_7 은 1인용~ 7인용 버튼에 해당되는 코드입니다.

Range("x:x").Interior.Color 를 이용해 쉽게 세로줄을 구현할 수 있습니다.

결과는 아래와 같습니다.




 ① 첫 번째 세로 줄과 두 번째 세로 줄 사이 상단 어딘가에 첫 번째 가로줄을 그린다. 

 ② 우측 칸으로 이동해서 가로줄을 그린다.

 ③ ② 반복

 조건: 가로줄 두개가 연결되어있으면 안된다. 

 ④ 우측 끝까지 이동한 경우 한칸 아래로 이동, 및 좌측 첫째 칸을 선택

 ⑤ ③④ 반복

 ⑤ 사다리 세로줄이 더 내려갈 곳이 없을 때 사다리 만들기를 중단한다. (단, 맨 아래칸은 가로줄 생성이 되면 안된다.)

 조건 : 사다리 가로줄은 랜덤으로 듬성듬성 생성해야 한다.



p = 16  

q = 4



Do


    '


    '사다리 가로 선 개수를 조절하기 위한 변수 lotto를 만듭니다. 

    lotto = Int(Rnd * 10) + 1

    

    


    If lotto < 6 Then         'ⓐ


    '여기서 lotto < 6 이 의미하는 것은, 50%의 확률로 가로선이 그어진다는 것입니다. (가로줄 듬성듬성 생성)

    '숫자값을 바꿔서 어떠한 변화가 나타나는지 확인해보세요.


        '바로 위 셀의 색깔이 검정색이 아니라면 (위 아래 가로줄이 겹쳐서 생기는 것을 방지)

        If Not Sheet1.Cells(p, q).Offset(-1, 0).Interior.Color = black Then        'ⓑ

            '좌측 두 번째 셀의 색깔이 검정색이 아니라면 (한 라인에 여러 개 선이 생기는 것을 방지)

            If Not Sheet1.Cells(p, q).Offset(0, -2).Interior.Color = black Then

                '우측 두 번째 셀의 색깔이 검정색이 아니라면 (한 라인에 여러 개 선이 생기는 것을 방지)

                If Not Sheet1.Cells(p, q).Offset(0, 2).Interior.Color = black Then

                    '바로 아래 셀의 색깔이 검정색이 아니라면 (위 아래 가로줄이 겹쳐서 생기는 것을 방지)

                    If Not Sheet1.Cells(p, q).Offset(1, 0).Interior.Color = black Then

                        '해당 셀의 색깔을 검정색으로 바꾼다 (가로선을 생성)

                        Sheet1.Cells(p, q).Interior.Color = black

                    End If

                End If

            End If

         End If

    

    

    End If

    q = q + 2  

    

    If q > Int_PQuantity * 2 Then  'ⓒ

    p = p + 1 'ⓓ

    q = 4 'ⓔ

    End If


 

Loop While p < 46 'ⓓ


lotto=Int(Rnd * 10) + 1 를 통해 lotto의 값을 랜덤하게 추출했습니다.

      아래 볼드체로 작성된 부분은 lotto 값이 6보다 작을 때에만 실행됩니다.

      lotto의 값은 1~10 사이의 숫자가 랜덤으로 지정됩니다.

      따라서, lotto<6은 50% 확률을 의미합니다.


가장 중요한 로직입니다.

3 가지 조건 (좌측에 이미 가로줄이 생성됨, 우측에 이미 가로줄이 생성됨, 바로 위에 이미 가로줄이 생성됨, 바로 아래에 이미 가로줄이 생성됨) 을 피해 가로줄을 생성하는 로직입니다. 일종의 필터와 같은 역할을 하죠.

위 로직을 거치지 않고 랜덤하게 가로줄을 만들었을 경우, 아래와 같이 엉망으로 만들어집니다.





보시다시피 가로줄이 상하좌우 가리지 않고 겹쳐있습니다.


필터를 거치게 되면 아래와 같이 생성됩니다.


아주 이상적인 모양으로 사다리타기가 생성된 모습입니다.


cells(p,q) 에서 p와 q는 각각 선택된 셀의 행값, 열값을 뜻합니다.


p를 1씩 증가시키고, 사다리의 우측 끝에 다다르면,

q를 2씩 증가시켜서 바로 아래 가장 좌측 셀으로 이동합니다.



위 과정이 반복됩니다.




초록색 테두리로 선택된 칸을 cells(p,q)라고 할 때, 위 그림과 같은 순서로 이동합니다.


(p,q) 로직 실행

(p,q+2) 로직 실행

...

맨 오른쪽에 닿으면

(p+1,q) 로직 실행

(p+1,q+2) 로직 실행

... 반복


즉,


①셀이 우측으로 한칸씩 이동하며 50% 확률로 검정색 가로줄을 그리는 로직을 실행시키며,

②로직을 통해 가로줄이 생성되면 안되는 부분에 가로줄이 생성되는 것을 막고,

③맨 오른쪽 칸에 다다르면, 바로 아래 행으로 이동해서 ①부터 다시 시작하는 것입니다.


 If q > Int_PQuantity * 2 Then 


해당 조건문은 셀이 우측 끝에 도달했는지를 확인하는 조건문입니다.


첫 번째 셀(검정색 좁은 셀부터 시작)의 열값을 1이라고 할 때,

가로줄이 들어가야 할 마지막 우측 셀은, 3명 기준으로 4, 4명 기준 6, 5명 기준 8이 됩니다.(인원 수*2 - 2)

따라서 열값 (인원 수*2 - 2)를 넘어갈 때에는 우측으로 더 이상 이동하지 않고, 하단 좌측 끝으로 이동하게 됩니다.


제가 만든 엑셀에서 q는 3부터 시작하기 때문에,

사실 정확한 수식은  If q - 2 > Int_PQuantity * 2 - 2 Then  입니다.

양쪽의 -2 는 생략되었습니다.



행값(p)에 1을 더해 하단의 셀을 선택합니다.


열값(q)를 4로 초기화 하여 좌측 셀부터 시작한다.





이상은 사다리타기 만들기의 첫 번째 과정인 사다리 만들기에 대한 해설이었습니다.


사실, 해설이란게 필요한지는 잘 모르겠습니다.


제 블로그를 정주행하셨다면, 내장되어있는 코드만 조금 연구해보시면 어떻게 사다리가 만들어지는지 충분히 이해하실 수 있으리라 생각합니다.


사용된 문법은 지극히 기초적입니다.


반복문, 조건문이 다입니다.


반복문과 조건문 만으로 정말 다양한 기능을 만들어낼 수 있습니다.


다음 편에서는 자동으로 사다리를 타고 내려오는 기능에 대한 설명을 담아보겠습니다.


Posted by Simon K
:

정말 오랜만에 올리는 포스팅이네요.

 

 시작하기 전에 먼저 코딩의 개념에 관해 짚고 넘어가겠습니다.

컴퓨터인간이 사는 나라가 있다고 가정해봅시다. 컴퓨터인간이 사용하는 언어는 컴퓨터 언어입니다. 컴퓨터 언어는 무엇일까요?

 바로 2진법 숫자입니다. 컴퓨터는 0101100101010.... 이런 방식으로 소통을 하죠.

하지만 사람은 이 숫자의 나열을 이해할 수 없습니다. 컴퓨터인간이 쓰는 언어를 해석하기 위해 여러 회사에서 번역기를 출시하게되죠.

 이 번역기의 종류는 다양합니다. 가장 널리 알려지고 보급된 번역기는 C 입니다.

하지만 사람들은 더욱 간단하고 강력한 번역기를 원하게 됩니다. 예를 들어 '뻐카충' 이라고 입력하면 컴퓨터는 알아서 '버스카드 충전'이라고 이해하는 것 처럼요.

 이게 실현된다면 언어의 효율성은 더 올라가게 되겠죠. 6글자 입력하던걸 3글자만 입력해도 되니까 말이죠.

따라서 회사마다 비슷하지만 다른 방식으로 자신들의 번역기가 이해할 수 있는 줄임말을 만들어내고 간단한 문법들을 만들기 시작합니다.

 SQL JAVA C++ 파이썬 등등이 탄생합니다.

 

 

 각각 번역기마다 특성이 다르고 사용처도 달랐죠. 사람들은 적절한 상황에 필요한 번역기를 사용하게 됩니다.

자연스럽게 낡은 번역기는 도태되고 최신형 번역기가 시장을 장악하게 됩니다. 미래에도 똑같은 일이 벌어질 것이구요.

 자, 그렇다면, 컴퓨터인간과 소통을 잘 하는 사람은 어떤 사람일까요?

① 컴퓨터 언어 번역기 안에 있는 자료를 모두 달달 외운 사람.

② 컴퓨터 언어 번역기의 종류와 구동 방식을 잘 이해하며, 각각의 사용 범위와 번역기의 구동 원리를 이해한 사람.


정답은 2번입니다.

 


 위 비유에서 알 수 있듯이, 프로그래밍 언어를 달달 외우고 있다고 해서 프로그램을 뚝딱 만들어내지 못합니다.

프로그래밍 언어를 '코딩' 이라는 행동을 통해 컴퓨터가 이해할 수 있게 연결할 수 있는 능력이 필요한 것입니다.

사람들은 '나 먹는다 사과' 라고 하면 다 알아들을 수 있지만, 컴퓨터는 '나는 사과를 먹는다' 라고 하지 않는 이상 정확히 이해를 하지 못합니다. (문법이 점점 간략해지고 있기는 합니다)

따라서 프로그래밍 언어가 작동하는 원리와 구조를 아는 것이 중요한 것입니다.

제 첫번째 게시글(http://simon-k.tistory.com/1)에 이미 적어놨지만, 자기 자신을 갓 태어난 아기라고 생각하고 공부를 시작해야 합니다.

 

 아기는 책을 읽을 줄 모릅니다. 단지 이것저것 만져보고 먹어보고 가끔씩 자빠져서 다치기도 하면서 세상을 배우죠.

 코딩 공부도 마찬가지입니다. 코딩은 '말하기'와 비슷합니다. 책만으로는 절대 배울 수 없습니다.

물론 기본적인 프로그래밍 언어 코드는 알고있어야 합니다. 하지만 확실한것은, 서점에서 책 한권을 사서 페이지 1부터 끝까지 볼 필요는 없다는 것입니다.

 프로그래밍 언어의 로직을 이해하려 노력하세요.

 

사다리타기.xlsm <-클릭해서 다운로드하세요.

 

 

 제가 업로드한 사다리타기 엑셀을 열어서 실행해보세요. 실행해보고 도대체 어떤 방식으로 사다리타기를 구현해냈는지 생각해보세요.

 그 구현 방법을 이해하는 것이 중요합니다.


 "아! 사다리타기를 만들 때 이렇게 이렇게 하면 사다리를 랜덤하게 만들어낼 수 있고, 저렇게 저렇게 하면 사다리를 타고 내려가는 모양을 구현해 낼 수 있겠구나!"


위와 같은 생각을 할 수 있도록 학습 방향을 잡아야 합니다.

로직에 대한 이해만 있다면 공부하지 않은 코드는 구글링을 통해 쉽게 알 수 있기 때문입니다.

 

다음 강의에서는 제가 올린 사다리타기 파일의 구체적인 작동 원리에 대해 알아보겠습니다.


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
: