꽃미남 프로그래머 김포프가 창립한 탑 프로그래머 양성 교육 기관 POCU 아카데미 오픈!
절찬리에 수강생 모집 중!
프로그래밍 언어 입문서가 아닌 프로그래밍 기초 개념 입문서
문과생, 비전공자를 위한 프로그래밍 입문책입니다.
jobGuid 꽃미남 프로그래머 "Pope Kim"님의 이론이나 수학에 치우치지 않고 실무에 곧바로 쓸 수 있는 실용적인 셰이더 프로그래밍 입문서 #겁나친절 jobGuid "1판의내용"에 "새로바뀐북미게임업계분위기"와 "비자관련정보", "1판을 기반으로 북미취업에 성공하신 분들의 생생한 경험담"을 담았습니다.
Posted by 월하

안녕하세요. 달땡(월하) 입니다.


우와..... 진짜 오랜만이네요. 반성 하겠습니다. ㅋ


아~주 오래전


실무에서 쓰이는 엑셀 함수. 실전 사용법 - 엑셀 입문자용


이라는 포스팅을 한 적이 있는데

당시 결론이 "다들 vba 배우세요. vba가 짱이에요." 였죠.

그래서 VBA를 가져 왔습니다.


[죄송합니다. 이 짤방 한 번 써보고 싶었어요]




Sub test()

Dim i As Integer

i = 0

Do While i < 30

    i = i + 1
    
    If i Mod 15 = 0 Then
        Cells(i, 1).value = "반반 무마니"
        
    ElseIf i Mod 5 = 0 Then
        Cells(i, 1).value = "양념"
        
    ElseIf i Mod 3 = 0 Then
        Cells(i, 1).value = "후라이드"
        
    Else
        Cells(i, 1).value = i
        
    End If

Loop


End Sub

이게 뭐냐 하면 

  • 1부터 30까지의 숫자를 순서대로 출력 한다.
  • 단, 해당 숫자가 3의 배수일 경우 "후라이드"를 출력 한다.
  • 단, 해당 숫자가 5의 배수일 경우 "양념"을 출력 한다.
  • 단, 해당 숫자가 15의 배수일 경우 "반반 무마니"를 출력 한다.


즉, 아래와 같은걸 출력 하는거죠




근데 이걸 왜 하느냐?? 


특정 값까지의 결과를 출력하되, 조건에 따른 값의 변화를 줄 수 있다는게 중요 합니다.


간단하게 예를 들어



 

 플레이어 A

 플레이어 B

 체력

 1000 

 1000 

 공격력

 2

 10 


일때 둘이 싸우면 누가 이기는....




어.... 음.... 당연히.... B가 이기겠죠.


그렇다면 다시...



 

 플레이어 A

 플레이어 B 

 체력

 1000 

 1000 

 공격력

 2 

 10 

 치명타 확률

 10 % 

 5 % 

 치명타 배율

 200 % 

 10 % 

 체력 회복

 초당 1

 없음

 회피 확률

 10% 

  5%


이럴 경우 누가 이길지 계산을 엑셀로 하면.... 좀..... 많이.... 갑갑... 하죠.

일단 이건 나중에 알아보고 위에 vba 코드 부터 뜯어 보겠습니다.

그 전에 한번 실행이나 시켜 볼까요?

  1. 엑셀을 실행 시키고
  2. Alt + F11 을 누른 후
  3. 모듈 추가


그럼 텅 빈창이 나오는데 위의 코드를 복사하여 붙여 넣고 


F5 를 눌러 봅시다.


예쁘게 잘 나오죠? 안나오면 안되는데 ㄷㄷㄷ


그럼 잘 나온다고 치고 코드를 뜯어 보겠습니다




Sub test()

End Sub


vba 는 위와 같이 Sub ~~()로 시작 해서 End Sub로 종료 됩니다.



Dim i As Integer

i = 0


저기서 i 는 변수(변하는 수?!) 라고 하는데 vba에서 사용 하기 위해서 선언을 해줘야 합니다.


이 변수가 어떤 녀석인지, 정수인지 실수인지 알아야 하는거죠.


DIm 변수 As 정수(혹은 실수)


이렇게 쓰면 되는데 


정수 = Integer

실수 = double


로 쓰면 됩니다.


그리고 i = 0 이라는게 있는데 이건 i 의 초기 값을 설정 해 주는 부분 입니다.

말 그대로 i 의 값은 정수 중 0으로 설정 한다는 말이죠.




Do While i < 30

Loop



옙. 저게 VBA의 핵심 중 하나인 반복문 입니다.


Do While 조건 ~ Loop


이면 조건을 만족 하는 동안 아래의 내용을 계속 반복해라! 가 되는 겁니다. 아래 내용은 어디까지?  Loop 앞까지!


즉, 위 예제에서는

    i = i + 1
    
    If i Mod 15 = 0 Then
        Cells(i, 1).value = "반반 무마니"
        
    ElseIf i Mod 5 = 0 Then
        Cells(i, 1).value = "양념"
        
    ElseIf i Mod 3 = 0 Then
        Cells(i, 1).value = "후라이드"
        
    Else
        Cells(i, 1).value = i
        
    End If



요걸 계속 반복 하는 겁니다.


여기서 가장 중요한 부분은 


i = i + 1


요 부분 입니다.


제일 처음에  i = 0 으로 설정 했었죠.


그게 저 반복문 안에 들어가면 i = i + 1 의 수식을 계속 반복 하는겁니다.


언제까지? i 값이 30이 될 때 까지.


왜?  Do while i < 30 으로 반복문을 돌렸으니깐요.


다시 반복문을 살펴 봅시다.


i = i + 1 이 되었으니 i 의 값은 1이 되었습니다.


그리고 



If "조건 1" Then
    "값 1"
ElseIf "조건 2" Then
    "값 2"
Else
    "값 3"
End If



가 나왔는데 기존 엑셀의 if 함수를 반복 하는것과 같습니다.


즉, "조건 1"을 만족하면 "값 1"을,

"조건 2"를 만족하면 "값 2"를

그것도 아니면 "값 3"을 사용 하는 겁니다.


그럼 여기서 조건이 무엇이냐?


i Mod 15 = 0
i Mod 5 = 0
i Mod 3 = 0


요 세가지인데 각기 다음과 같습니다.


i / 15 한 값의 나머지가 0

i / 5 한 값의 나머지가 0

i / 3 한 값의 나머지가 0


즉, i / 15 의 나머지가 0이면 "반반 무마니"를

i / 5 의 나머지가 0이면 "양념"을

i / 3 의 나머지가 0이면 "후라이드"를 출력 하라는거죠.


어디에?


Cells(i, 1).value


즉, i 행 1열에 찍어 주라는 이야기죠.


여기서 value는 말 그대로 값을 의미합니다.


그러니 


 Cells(i, 1).value = "반반 무마니"
의 경우 i행, 1열의 값(value) = "반반 무마니" 가 되는 거죠.



이렇게 해서 최종적으로


i는 1 ~ 30까지 적되 

3의 배수는 "후라이드"

5의 배수는 "양념"

15의 배수는 "반반 무마니"가 되고 각 내용은

i행 1열에 출력이 되는 형태


가 완성이 됩니다!!

다음에 계속. 아마도.....

댓글을 달아 주세요

  1. Favicon of https://ing-eo.tistory.com 천신의리 2015.03.14 14:20 신고  댓글주소  수정/삭제  댓글쓰기

    우어.. 엑셀도 어려운데 VBA를 배워야 하는군요.
    A와 B중 누가 이길지 흥미롭습니다.
    2년이나 지난 지금에도 포스팅 올려주셔서 너무나 감사드립니다.
    천천히 보면서 공부할게요.

  2. Favicon of https://ing-eo.tistory.com 천신의리 2015.03.16 09:46 신고  댓글주소  수정/삭제  댓글쓰기

    VBA가 비주얼 베이직 언어를 쓰는군요. (애초에 VB가 visual basic 약자라니; )
    학교 다닐 때 잠깐 배웠는데 요긴하게 써먹었습니다.

    쉽게 강의해주셔서 정말 빠르게 적응했네요.

  3. 길고양이 2015.03.16 11:02  댓글주소  수정/삭제  댓글쓰기

    VBA가 짱이죠. 엑셀만 잘해도 일이 무척 편한데 VBA까지 더하면 못하는게 없습니다. ㅋㅋ
    DLL도 가져올수있으니 winapi까지 로드하면 천하무적!

  4. 닥터 2015.03.27 03:04  댓글주소  수정/삭제  댓글쓰기

    진로 상담좀 봐주시면 감사하겠습니다.
    맨 밑에 글 의대 관련입니다.
    http://kblog.popekim.com/2012/04/blog-post.html

  5. 송진아 2015.04.07 21:55  댓글주소  수정/삭제  댓글쓰기

    ㅋㅋㅋ 재밌게 포스팅하셨네요 잘봤습니다.

  6. 송진아 2015.04.07 21:55  댓글주소  수정/삭제  댓글쓰기

    ㅋㅋㅋ 재밌게 포스팅하셨네요 잘봤습니다.