[혈변강의 엑셀VBA] 4강: 유저폼에 데이터 불러오기 by storm

4강: 유저폼에 데이터 불러오기


이번 강좌에서는 일정한 데이터 테이블의 값들을 유저폼에 불러오는 방법에 대해서 알아보도록 한다. 그전에 지난 3강의 말미에서 냈던 문제의 정답부터 짚고 넘어가자. 정답 코드는 다음과 같다.
----------------------------------------------------------
Private Sub btnClose_Click()
Unload Me
End Sub
----------------------------------------------------------
/* 참고로 위 코드에서 btnClose는 [닫기] 버튼의 '이름' 속성이다. 이름은 굳이 저것과 같지 않아도 되고 단지 유저폼을 닫는 용도로 만든 명령단추의 이름 속성과 일치하기만 하면 된다. 예를 들어 [닫기] 버튼의 이름을 btnQuit 로 만들었다면 Private Sub btnQuit_Click() 으로 하면 된다. 또한 Unload Me 대신에 Unload UserForm1 이라고 해도 상관 없다. 물론 Unload 뒤에 나오는 UserForm1은 실제 여러분이 만든 유저폼의 이름 속성과 같아야 한다. 유저폼을 처음 생성하면 기본 이름이 UserForm1 이기 때문에 이것을 변경하지 않았다면 그대로 UserForm1 로 쓰면 된다. */


간단한 DB툴을 디벼 보자!
이번 강좌에서는 아주 간단한, 정말 간단한 데이터베이스(DB)를 하나 놓고 그것을 관리하는 툴을 VBA의 유저폼을 이용해서 만들어보도록 한다. 우선은 아래 링크를 클릭해서 예제파일을 다운 받아서 열어보라.
■ 예제파일 다운로드: ItemDB_Sample.zip

예제 파일을 열면 index 시트와 itemDB 시트가 있을 것이다. 여기서 index 시트에 버튼(명령 단추)를 하나 만들어 그것을 클릭하면 아이템 DB를 관리하는 유저폼을 띄우는 코드를 넣어보도록 한다.

우선 여러분이 해야 할 일은 Alt + F11 키를 눌러 비주얼 베이직 편집기(앞으로는 VBE라고 줄여서 쓴다)를 연다. 그다음 VBE의 상단 메뉴에서 [삽입] 메뉴를 선택한 다음 사용자 정의 폼, 즉 유저폼을 하나 만든다. 그리고 아래 그림과 같이 도구 상자에서 [목록 상자]를 유저폼 위로 드래그한 다음 크기를 적당히 조절한다. 그리고 도구상자에서 명령 단추를 드래그해서 유저폼의 목록상자 오른쪽에 놓고 명령단추의 Caption 속성을 '아이템 로드'로 변경한다.
//목록상자의 이름 속성은 lstName 정도로 해주자. lst는 목록상자라는 뜻의 ListBox를 줄여서 쓴 것이다.
//명령단추의 이름 속성은 btnLoad 정도로 한다.

자 그러면, [아이템 로드] 버튼(btnLoad)를 클릭 했을 때 목록상자(lstName)에 itemDB 시트의 아이템 이름들이 나열되도록 하려면 어떻게 해야 할까? 일단, 목록상자에 목록을 채워넣는 방법은 두 가지가 있다. 하나는 AddItem 메소드(method)를 이용해서 목록(item)을 하나하나 지정해서 넣는 방법이고, 다른 하나는 목록상자의 RowSource 속성을 이용해서 목록으로 넣을 셀 범위를 지정하는 방법이다.

우선 AddItem 메소드를 사용하는 방법에 대해서 알아보자. 유저폼에서 [아이템 로드] 버튼을 더블클릭 해서 코드 편집화면으로 전환한 다음 다음과 같이 입력해보자.
------------------------------------------------------------------------------------------------
Private Sub btnLoad_Click()
lstName.AddItem Worksheets("itemDB").Range("B2")
End Sub
------------------------------------------------------------------------------------------------
//주의 위 코드에서 AddItem과 Worksheets("itemDB") 사이에 띄어쓰기를 해야 한다.

이렇게 입력한 다음, 단축키 F5를 눌러 유저폼을 실행해서 버튼을 클릭해 보면 '윈드포스'라는 아이템 이름이 목록상자에 나타날 것이다. 하지만 이런 방식으로는 수십, 수백개가 넘는 항목(item)을 일일이 다 집어넣으려면 코드 노가다가 되기 십상이다. 물론 아래와 같은 코드를 통해서 간단하게(?) 표현할 수도 있기는 하다.
------------------------------------------------------------------------------------------------
Private Sub btnLoad_Click()

Worksheets("itemDB").Activate
lstName.Clear

Dim i As Long
Dim Rows As Long
Rows = Application.CountA(Range("A:A"))

For i = 2 To Rows
lstName.AddItem Worksheets("itemDB").Cells(i, 2)
Next i

End Sub

------------------------------------------------------------------------------------------------

하지만 RowSource 속성을 이용하면 이보다 훨씬 더 간단하게 코드를 작성할 수 있다. 다음 코드를 살펴보자.

------------------------------------------------------------------------------------------------
Private Sub btnLoad_Click()

Worksheets("itemDB").Activate

Dim Rows As Long
Rows = Application.CountA(Range("A:A"))

lstName.RowSource = "itemDB!B2:B" & Rows

End Sub

------------------------------------------------------------------------------------------------
만약 코드를 제대로 작성했다면 아래 그림과 같이 유저폼에서 아이템 리스트를 볼 수 있어야 한다.


//아래를 클릭하면 코드 설명이 이어진다.


그러면 이제 코드의 각 구문을 자세히 살펴보도록 하자.

Worksheets("itemDB").Activate
itemDB 시트를 활성화(activate)시키는 동작을 한다. 보통 엑셀 파일에는 2개 이상의 시트가 있게 마련인데, 특정 시트의 셀 값을 참조하는 프로시저의 경우, 어떤 시트를 활성화시킬 것인지 지정해주지 않으면 자칫 엉뚱한 시트에서 데이터를 불러오거나 기록할 수 있으므로 주의해야 한다. 가장 안전한 방법은 위 코드와 같이 프로시저의 초반에 시트를 명확히 지정해주는 것이다.


Dim Rows As Long
Rows라는 이름의 지역변수를 정수형으로 선언하는 구문이다. 이 변수는 itemDB시트에서 데이터가 들어있는 행의 개수가 몇 개인지 그 수를 저장하기 위한 용도로 쓰인다. VBA에서 지역변수를 선언할 때에는 이와 같이 Dim 변수명 As 데이터타입과 같은 식으로 선언한다. 실제 코드에서 변수명은 한글로도 쓸 수 있지만 필자는 한글 변수명을 선호하지 않는다. 물론 따...딱히 영어로 짓고 싶어서 그런건 아니라능!

  • VBA에서 사용하는 정수형 데이터타입
    Byte: 0 ~ 255 사이의 정수 (저장용량: 1 바이트)
    Integer: -32768 ~ 32767 사이의 정수 (저장용량 2 바이트)
    Long: -2,147,483,648 ~ 2,147,483,647 사이의 정수 (저장용량 4 바이트)

VBA에서 사용하는 정수형태의 데이터타입은 위와 같다. 주의해야 할 점은, 변수의 데이터타입이 허용하는 범위를 넘어서는 데이터가 입력되는 일이 없도록 데이터타입을 잘 선택해야 한다는 점이다. 예를 들어, 지금과 같은 코드에서 Rows 변수를 Integer 형태로 선언하면, 최대 32767까지만 데이터를 담을 수 있기 때문에, 만약 DB에 들어있는 행의 개수가 32768 이상이 되면 오류가 나버린다.
//이런 경우를 '오버플로우(overflow)' 현상이라고 한다. 데이터의 양이 메모리를 넘쳐흐른다는 뜻으로 이해하면 된다.

본 강좌에서 Rows 변수를 Integer가 아닌 Long 형으로 선언한 이유는 일반적으로 DB의 경우(실제 서비스하는 MMORPG와 같은 게임) 행의 개수가 32767개를 넘어가는 일이 많기 때문이다. Long 형의 변수는 양수로 21억 4748만 3647까지의 정수를 저장할 수 있기 때문에 어지간한 크기의 정수를 다 커버할 수 있다.

[Check Point!] 지역변수와 전역변수
위 코드에서 변수 Rows지역변수(local variable)로 선언되었다. VBA에서 지역변수는 그 변수가 선언된 개체나 모듈에서만 접근할 수 있다. 프로그래밍 지식이 없으면 이 말을 이해하기가 좀 어려울텐데, 쉽게 설명하자면, 지금 선언된 지역변수 Rows의 경우에는 UserForm1 이라는 이름의 유저폼에서만 접근할 수 있다고 생각하면 된다. 반면에 어느 개체나 모듈에서 접근할 수 있게 변수를 만들고 싶다면 Dim 이 아닌 Public을 사용해서 변수를 전역변수로 선언하면 되는데, 이에 대해서는 이후 강좌에서 설명하도록 한다.
//VBA의 변수에 대한 더 자세한 설명은 http://cafe.naver.com/xpath.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=72 를 참고하기 바란다.


Rows = Application.CountA(Range("A:A"))
이 구문은 itemDB에서 데이터가 들어있는 행의 개수를 구해서 그 개수를 Rows라는 변수에 저장한다. CountA는 엑셀 함수로, 지정한 범위내에서 비어있지 않은 셀의 개수를 구하는 함수이다. Range("A:A")A열 전체를 뜻하므로, CountA(Range("A:A"))란 A열 전체에서 비어있지 않은 셀의 개수를 반환한다. 예제상의 DB에서는 A1 셀부터 A14 셀까지 총 14개의 셀에 데이터가 기록되어 있으므로 CountA 함수가 14라는 값을 반환할 것이다.

그리고 CountA 앞에 붙는 Application은 VBA 코드에서 엑셀 자체 함수를 사용할 때 앞에 붙이는 '표시' 같은 개념으로 생각하면 된다. 원래는 Application.WorksheetFunction 이라고 쓰지만, Application 만 쓰거나 WorksheetFunction만 써도 프로그램은 동작한다. 예를 들어 VBA 코드에서 VLOOKUP 함수를 사용하려면 Application.VLOOKUP() 으로 쓰거나 WorksheetFunction.VLOOKUP() 과 같은 식으로 코드를 작성해야 한다.


lstName.RowSource = "itemDB!B2:B" & Rows
아마도 이 코드가 여러분들이 가장 이해하기 어려운 코드일 것 같다. 하지만 한 번 이해하면 참 다양하게 써먹을 수 있는 속성이 바로 RowSource이기도 하다. 이 구문은 lstName 이라는 컨트롤(목록상자)의 RowSource 속성에 itemDB 시트의 B2 셀부터 B(Rows의 값)셀 까지의 범위를 지정하는 것이다. itemDB!B2:B 까지만 큰 따옴표(")로 둘러싸여 있는 이유는 이 부분이 문자열(string) 값이기 때문이며, 뒤에 붙는 & Rows 에서 &는 앞의 문자열과 뒤의 문자열을 연결하는, 즉 공백없이 붙이기 위한 부호이다. 그리고 Rows는 앞서 선언했던 변수의 이름으로 여기서는 비어있지 않은 셀의 개수인 정수값 14가 들어있다. 즉 "itemDB!B2:B" & Rows는 "itemDB!B2:B14" 인 셈이다.
//여기서 시트이름 뒤에 느낌표(!)가 꼭 붙어야 하는 점에 주의하라. 만약 시트 이름이 sheet2 라면 sheet2! 라고 써야 한다.

아니 그러면 뭐하러 복잡하게 이렇게 하느냐? 그냥 처음부터 코드에 lstName.RowSource = "itemDB!B2:B14" 라고 해버리면 되지 않냐? 라고 반문하는 사람도 있을 것이다. 물론 데이터베이스에 자료가 딱 14행까지만 들어있고 더 이상 새로 추가되지 않는다면 그렇게 해도 된다. 그러나 DB라는 것은 항상 시간이 흐르면(게임이 업데이트 될 수록) 데이터가 계속 추가되기 마련이다. 따라서 다소 복잡해보이는 코드지만, 이렇게 코드를 짜두면 DB에 얼마든지 새로운 데이터가 추가되어도 알아서 몇 개의 데이터가 있는지 계산해서 자동으로 목록에 넣어주기 때문에 작업이 편리하고 정확해진다. 그리고 이것이 여러분이 VBA를 공부해야 하는 이유이기도 하다.

참고로 이 구문은 아래 그림과 같은 기능을 하는 셈이다. 목록상자의 RowSource 속성은 속성값으로 문자열을 받으며, 속성값에는 유효한 셀 범위가 지정되어야만 한다.
자 이렇게 해서, DB로부터 아이템의 이름들을 목록상자에 불러오는 것까지 해보았다. 이어서 다음 강좌에서는 목록상자에서 특정한 하나의 아이템 이름을 클릭했을 때 그 아이템의 등급, 타입, 가격 정보들이 유저폼에 나타나게 하는 기능들을 구현해보도록 하자. [주의!] 당분간은 본 강좌에서 제공한 예제파일과 강좌에서 설명한 코드들을 그대로 유지하면서 새로운 코드를 추가해 나갈 것이므로 지금 여러분이 작업한 파일을 잘 보관해두기 바란다.

End Sub

//To be continued



핑백

덧글

  • 사악한앙마 2010/08/18 13:43 # 답글

    안녕하세요 스톰님 vba 강의 즐겨 보는 사람입니다.
    ■ 예제파일 다운로드: ItemDB_Sample.xlsm 를 열어봐도 엑셀 파일은 없는데 어떡게 해야 될지..
    항상 즐겁게 강의는 보고 있습니다
  • storm 2010/08/18 13:49 #

    헐! 파일 다시 올렸으니 다시 받아보세요 :)
  • 저승토끼 2010/08/18 23:45 # 삭제 답글

    새롭네요...
    예전에 vb 공부할 때는 개체명 다음에 "."붙이면 속성 리스트가 쭉 나오고 해서 더 쉬웠는데
    여기서는 "."이후로 속성 리스트가 보이지 않는 것도 있다보니
    작성하면서 "내가 틀리게 적었나?" 싶어서.. 그게 좀 햇갈리네요
  • storm 2010/08/19 09:10 #

    지금도 대부분 나오지 않나요? 거의 나오는 것 같던데...
  • blue 2010/08/19 12:36 # 삭제 답글

    다음 강의 기대하겠습니다.
  • storm 2010/08/19 13:47 #

    어쩌면 오늘 밤에 올라갈지도!!!
  • 무인도 2010/08/19 16:19 # 삭제 답글

    정말 멋진 강의 감사드립니다. 앞으로 꾸준히 올려주세요. (__)
  • storm 2010/08/20 16:03 #

    (-_-)/
  • 가람해무 2010/08/20 15:44 # 삭제 답글

    여기까지 따라해봤는데 다음 화가 미친듯이 기다려집니다. +_+
  • storm 2010/08/20 16:03 #

    헐~ 오래간만이라능!!!
  • 2010/08/20 23:33 # 답글 비공개

    비공개 덧글입니다.
  • storm 2010/08/20 23:55 #

    sstorm74@naver.com 으로 메일주세요
  • 2010/08/21 20:26 # 답글 비공개

    비공개 덧글입니다.
  • storm 2010/08/21 23:34 #

    메일 드렸습니다.
  • 2010/08/28 20:59 # 삭제 답글 비공개

    비공개 덧글입니다.
  • storm 2010/08/29 01:42 #

    메일로 답변드렸습니다.
  • bonanza 2010/09/01 23:11 # 삭제 답글

    잘 봤습니다-!!
  • 에스프가르데 2010/09/23 14:15 # 삭제 답글

    헥헥, 잘 따라하고 있습니다 ;ㅂ;ㅋ
    꾸준한 강의 부탁드려요~ 감사합니다 (__)!
  • storm 2010/09/23 14:36 #

    뭐든 '꾸준한' 게 제일 어렵죠 :)
  • 호빵 2011/01/05 10:41 # 답글

    잘보고 갑니다.. 설명이 잘되어 있어요~~
  • storm 2011/01/07 13:31 #

    네 열심히 공부하셔서 엑셀고수가 되시길 :)
  • 2011/01/14 00:23 # 삭제 답글 비공개

    비공개 덧글입니다.
  • storm 2011/01/14 09:08 #

    강좌를 통해 어느 정도 감을 잡으셨다면 서점에서 자신에게 맞는 VBA책을 사서 전반적인 활용법을 숙지하신 후에 자신이 VBA를 써먹을 분야에서 남이 만든 소스를 구해서 분석하면서 배우시면 됩니다.
  • 2011/02/10 15:27 # 답글 비공개

    비공개 덧글입니다.
  • storm 2011/02/10 15:57 #

    RowSorce 속성에 값을 "itemDB!B" & Test ":B" & Rows (따옴표 및 띄어쓰기 주의)로 입력하세요.

  • 카츠라 2011/02/10 17:39 #

    알려주신대로 썼더니, "컴파일 오류입니다. 필요한 요소 : 문의 끝" 이라는 문장이 ":B" 부분에서 나옵니다.
    아, 혹시나 해서, 제가 사용하는 버젼은 Excel 2010입니다.
  • storm 2011/02/10 17:48 #

    소스를 볼 수 없으니까 보통 자주 범하는 실수를 추정한다면,

    Test = 4 라고 변수를 초기화해준 코드가

    lstName.RowSource = "itemDB!B" & Test ":B" & Rows 코드와 같은 프로시저 내에 있어야 하고 반드시 RowSource = ... 보다 위에 있어야 합니다.

    확인해보세요
  • 카츠라 2011/02/10 18:00 #

    http://pds21.egloos.com/pds/201102/10/00/e0063800_4d53a8f228ec6.jpg

    소스코드입니다. 몇 번이나 계속 질문드려도 계속 답변해주셔서 감사합니다 ㅠㅠㅠㅠ
  • storm 2011/02/10 18:22 #

    지금 소스만 놓고 본다면

    Rows = Application.CountA (Range ("A:A"))

    요 부분에서 Rows에 들어갈 값이 없거나 잘못된 듯 하네요.
    A열 전체에서 비어있지 않은 셀의 갯수가 제대로 구해질 수 있는지
    시트를 다시 확인해보세요.
  • storm 2011/02/10 18:24 #

    아참, 또하나 중요한 것이 Rows 변수의 값이 Test 변수의 값 이상이어야만 하겠죠.
    Rows 변수의 값이 Test 보다 작으면 안됩니다.
    그러니까 A:A 열에서 데이터가 들어있는 셀의 갯수가 4 이상이어야 하는거죠.
  • 카츠라 2011/02/10 22:00 #

    감사합니다. 확인해보도록 하겠습니다!
  • 카츠라 2011/02/11 14:39 #

    길게 계속 리플 남겨 죄송합니다.
    말씀하신 부분을 체크해봤는데 잘못되지 않은 것 같아서 다시 여쭤봅니다. ㅠㅠ
    <Test를 넣고 "itemDB!B" & Test ":B" & Rows 구문을 삽입한 코드의 디버깅 화면>
    http://pds18.egloos.com/pds/201102/11/00/e0063800_4d54ca60226b6.jpg
    <예제에서 나온 코드의 디버깅 화면>
    http://pds22.egloos.com/pds/201102/11/00/e0063800_4d54ca61a020f.jpg
    두 코드의 차이는 btnLoad_Click() 의 내용입니다.
    말씀해주신 CountA를 보았는데 아래쪽 그림처럼 14가 정확히 틀어옵니다.
    혹시나 싶어서 시트의 스크린샷도 첨부합니다.(첨부된 예제소스와 같습니다.)
    http://pds19.egloos.com/pds/201102/11/00/e0063800_4d54ca626ef1c.jpg
    http://pds21.egloos.com/pds/201102/11/00/e0063800_4d54ca624be26.jpg
  • storm 2011/02/11 14:50 #

    아... 설마 이거일 줄이야...
    Rows 변수만 Dim 으로 선언해놓고
    Test 변수는 선언이 안되어 있어요.
    변수 선언을 하세요 Dim Test As Long

    보통은 VBA 에디터 상단 메뉴 -> 도구 -> 옵션 -> 코드설정 항목중에 [변수선언 요구]를 체크해놓는데 엑셀 2010에서는 이게 디폴트가 아닌가 보네요. :(
  • 카츠라 2011/02/11 15:03 #

    앗.. 그런 실수가 ㅠㅠ 죄송합니다..
    헌데 추가를 해도 여전히 같은 문제가 생기네요;
    http://pds20.egloos.com/pds/201102/11/00/e0063800_4d54d0b123476.png
    <Dim Test As Long을 선언한 후의 디버깅>
    리플도 지저분하게 길게 달리고.. 수강료 내야할거 같은 이 죄송한 기분...
    혹시 2010에서는 명령어가 달라졌다거나, 이쪽에는 특정한 플러그인이 없는게 아닐까, 하는 생각도 드네요.. ㅠ
  • storm 2011/02/11 15:29 #

    Excel 2007에서는 아무 문제 없이 동작하는데요...

    혹시 모르니까 Rows = Application.WorksheetFunction.CountA (Range ("A:A")) 라고 입력해보세요.

    원래 VBA에서 엑셀함수를 쓰려면 Application.WorksheetFunction.함수이름 식으로 쓰는것이 정식이지만, 2007 이하 버전에서는 Application.함수이름 으로 쓰거나 WorksheetFunction.함수명 으로 써도 됩니다. 하지만 2010은 다를 수 있으니까 위와 같이 정식대로 다 써보세요.

  • 카츠라 2011/02/11 15:40 #

    으음;; 역시 같은 곳에서 오류가 나네요..
    http://pds22.egloos.com/pds/201102/11/00/ItemDB_Sample.xlsm
    엑셀 파일을 첨부합니다.. ㅠㅠ 혹시 이게 돌아간다면 2010의 문제거나.. 아님 PC환경의 문제일지도 모르겠네요.. ㅠㅠ
  • storm 2011/02/11 16:01 #

    파일이 잘못 압축된듯 하네요 그냥 엑셀파일 그대로 sstorm74@네이버.com 으로 보내주세요
  • 카츠라 2011/02/11 16:26 #

    메일 드렸습니다. 끈기있게 봐주셔서 감사합니다. ㅠㅠㅠ
  • storm 2011/02/11 17:26 #

    어익후 제가 댓글에서 실수 했네요.
    lstName.RowSource = "itemDB!B" & Test & ":B" & Rows 라고 해야 합니다.

    Test 와 ":B" 사이에 문자열을 연결하는 식별자인 &이 빠졌었네요.
  • 카츠라 2011/02/11 17:29 #

    그렇군요! ㅠㅠㅠ 제대로 작동하는 모습을 보니 굉장히 감격적이네요 ㅠㅠ

    시간 쪼개서 긴 질문에 답해주셔서 정말 감사합니다!
  • storm 2011/02/11 17:37 #

    막혀서 낑낑대다가 탁 해결되어 프로그램이 동작할 때의 그 쾌감이란
    게임에서 득템 했을 때보다 더 큰 기쁨이죠.
    그 맛에 코딩 하는 거구요 :)
  • storm 2011/02/11 14:51 # 답글

    [변수선언 요구] 옵션을 활상화 시키면 코드상에서 변수가 선언되지 않고 사용될 경우 디버깅에서 경고를 해줍니다.
  • 이 요셉 2011/03/02 23:32 # 삭제 답글

    아 정말 감사드립니다. 근데 저 하나 이해가 안가는게 있습니다.

    RowSource로 열을 불러올때 & rows 를 해주던데 왜 Long 형 변수로 설정한 것을

    아스키 문자 "&"을 사용하여 뒤에 첨자를 붙히는 지요..? 이해가 안가네요 ..^^;;;;
  • storm 2011/03/03 00:28 #

    VBA에서는 Integer 나 Long 과 같은 정수형 변수여도 문자열하고 같이 결합해서 사용하면 알아서 문자열로 변환해서 표현합니다.
  • 구름 2011/04/14 21:26 # 삭제 답글

    스톰님 질문입니다!

    2007에서 아무리 해도 첫번째 코드

    Private Sub btnLoad_Click()

    lstName.AddItem Worksheets("itemDB").Range("B2")

    End Sub

    여기서 뭐가 잘못되었다고 디버그424오류가 뜨더군요.

    아무래 해도 안되서 2003에서 했다가 끄고 다시 2007에서 하니까

    그제서야 되던데 왜 이런지 좀 알려주세요ㅠ_ㅠ


    p.s 물론 띄어쓰기는 했습니다 :)
  • storm 2011/04/15 09:56 #

    1. 유저폼의 버튼 '이름' 속성을 btnLoad 로 설정한게 맞는지 확인해보세요. 아마 프로시저에는 btnLoad_Click() 인데 버튼의 이름속성은 btn_Load 거나(언더바가 들어감) 아니면 디폴트값인 commandbutton1 로 되어 있을듯...

    2. 혹시 괄호 () 대신 대괄호 []를 쓰신건 아닌지요
  • cosmos 2012/07/06 20:22 # 삭제 답글

    15년전 어셈블러 입문하다 말았는데...오늘 멋진 강의 보고니까..그 때 생각이 납니다.

    멋진 강의 감사 합니다.
  • JuH 2014/06/18 17:18 # 삭제 답글

    쉽게 설명해주셔서 감사합니다. 질문 한가지가 있는데요...
    위와 같이 데이터를 유져폼에 불러오는데...
    중복된 항목은 제외하고 하나씩만 불러올 수 있나요?
  • storm 2014/06/24 16:18 #

    불가능한건 아니지만 VBA코드만으로 기능을 구현하려면 좀 복잡합니다.
  • 니힐클램 2014/12/09 19:28 # 삭제 답글

    쉽게 설명해주셔서 어려운 부분들은 해결되었는데 2가지 정도 문제점이 생겨서 그런데 해결좀 해주실수 있나요?
  • storm 2014/12/11 14:21 #

    질문 써주세요~
    아니면 이메일로 주시구요. (sstorm74@네이버닷컴)
  • 포포퐁 2017/10/25 21:19 # 삭제 답글

    안녕하세요 좋은 강좌 잘 보고 있습니다 예전거라 질문이 가능한지는 모르겠지만 ㅠ.ㅠ

    rows = application. counta (range(""a:a))

    이부분에서 a:a로 하는 이유는 뭔가요? 구해야 하는 부분이 b니까 b:b로 하고 밑에서 b2:b로하면 상관없지 않나요??
  • storm 2017/10/26 14:07 #

    뭐 그렇게 하셔도 상관은 없습니다. 구현하는 방법은 딱 한 가지만 있는 것은 아니고 상황이나 취향에 따라 다양하게 선택할 수 있습니다. 저의 경우는 보통 맨 첫 열을 기준으로 합니다.
  • 포포퐁 2017/10/29 20:13 # 삭제 답글

    아하 겹치면 오류가 나나해서 궁금했어요 좋은 자료로 열공할수있어서 감사합니다 ^-^
  • 오동통너구리 2019/06/28 16:04 # 삭제 답글

    오래작성된 글이라 질문이 가능한지 궁금합니다만.
    Rows에서 가지고있는 수가 14(첫번째제목이 적혀진컬럼을 포함해서)이고
    목록은 13개이잖아요. 그래서 14번째에 내용을 넣고 VBA를 실행시켰어요. 그런데 왜 13개만 목록에 표시될까요? Row가 14이니, 목록도14개가 떠야하는거 아닌지??
댓글 입력 영역



통계 위젯 (화이트)

1519
244
503012