42
1 경영 IT실무 Excel VBA (WEEK 11~16) P1-24: VBA매뉴얼 P25: VBA Exercise P26-43: GROUP PROJECT 예제 소속: 한동대학교 경영경제학부 성명: 교수 김대식

Excel VBA - KOCWcontents.kocw.net/kocw/document/2014/handong/kimdaeshik/43.pdf · Excel VBA (WEEK 11~16) P1-24: VBA매뉴얼 P25: VBA Exercise P26-43: GROUP PROJECT 예제 소속:

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

  • 1

    경영 IT실무

    Excel VBA

    (WEEK 11~16)

    P1-24: VBA매뉴얼

    P25: VBA Exercise

    P26-43: GROUP PROJECT 예제

    소속: 한동대학교

    경영경제학부

    성명: 교수 김대식

  • 2

    1. VBA의 개념

    VBA (Visual Basic for Application)

    Visual Basic은 Ms에서 Basic을 기반으로 만든 개체지향적인 프로그램 언어를 말한다. Visual은 "

    시각적"이라는 의미이고, Basic은 퍼스널 컴퓨터에서 사용된 프로그램언어이다. 여기에 “응용 프로

    그램”을 의미하는 Application이 붙어서 "Application을 위한 Visual Basic"을 의미한다. MS Office

    계열의 제품에는 Visual Basic이 탑재되어있는데, VB언어의 구조를 가지고 있지만, VB에 비해 제한

    적인 개체(object)를 사용한다. VBA에서 다른 응용프로그램의 개체를 사용하려면 "참조" 과정을

    거쳐 VB나 MS Office의 개체를 사용할 수 있다.

    BASIC

    1960년대 말 미국 Dartmouth 대학의 John Kemeny 교수가 개발하여 주로 퍼스널 컴퓨터에 채

    용되고 있다. 간단한 영어의 어구를 기반으로 한 명령이 쓰이고 있으므로 쉽게 배울 수 있다. 그

    러나 퍼스널 컴퓨터에 적재되어 있는 것은 그 기종의 하드웨어 구성 등에 의한 고유한 명령을 가

    지고 있는 경우가 많다. BASIC이라고 불리고 있는 것은 interpreter와 editor 등이 포함된 시스템

    프로그램이다. 인터프리터방식이기 때문에 컴파일러 언어와 비교하면 처리속도가 느리지만, 프로

    그램의 수정이 간단하고 번역프로그램이 사용하는 기억소자가 적어도 되므로 외부 기억장치 없이

    작은 시스템으로도 이용할 수 있다는 특징이 있다.

    개체지향프로그래밍 (Object-oriented programming)

    모든 데이터를 object로 취급하며, 이 object에는 class의 개념이 있어서 상, 하위의 관계가 있

    다. class의 구체적인 예가 instance이다. object 사이는 메시지의 송신으로 상호 통신한다. 가장 특

    징적인 것은 각 class에 그 메시지를 처리하기 위한 방식이 있다는 것이다. 어떤 instance에 메시

    지가 도달하면 그 상위 class가 그것을 처리한다. 현재 개체지향개념은 프레임 표현형식과 융합하

    여 인공지능을 위한 소프트웨어 기법의 하나로 되어 있다.

    개체지향 프로그램은 C, Pascal, BASIC 등과 같은 절차형 언어(procedure-oriented programming)

    가 크고 복잡한 프로그램을 구축하기 어렵다는 문제점을 해결하기 위해 탄생된 것이다. 절차형

    언어에서는 코드 전체를 여러 개의 기능부분 즉, 인쇄하는 기능부분과 사용자로부터의 입력을 받

    는 기능부분 등으로 분할하는데, 이와 같이 각 기능부분을 구성하는 코드를 module이라고 한다.

    절차형 언어에서는 프로그램을 여러 기능으로 나누고 이들 module을 편성하여 프로그램을 작성

    할 경우, 각 module이 처리하는 데이터에 대해서는 전혀 고려하지 않는다. 다시 말하면 데이터

    취급이 완전하지 않고 현실 세계의 문제를 프로그램으로서 표현하는 것이 곤란하다.

    이러한 절차형 프로그래밍이 가지는 문제를 해결하기 위해 탄생된 개체지향 프로그래밍은

    object라는 작은 단위로서 모든 처리를 기술하는 프로그래밍 방법으로서 모든 처리는 object에 대

    한 요구의 형태로 표현되며, 요구를 받은 object는 자기 자신 내에 기술되어 있는 처리를 실행한

    다. 이 방법으로 프로그램을 작성할 경우 프로그램이 단순화되고, 생산성과 신뢰성이 높은 시스템

    을 구축할 수 있다.

  • 3

    VB

    VB는 사용자가 프로그램을 만드는데 필요한 도구를 하나의 완성된 object(개체)로 제공한다. 이

    object에는 정의된 어떤 기능이 내장되어 있다. 사용자는 각 object가 어떤 기능을 하는지 알아서,

    object를 사용하는 방법에 따라 사용하면 된다. 이것을 개체지향 프로그램이라고 한다.

    그림은 VBA에서 사용하는 Userform과 control을 폼에 삽입한 것으로, 각각의 항목들이 object

    이다. 즉, Userform, 텍스트박스, 콤보박스 등이 모두 object이다. 만약 프로그램 언어(C+)로 그림

    에 있는 하나의 object를 만든다면, 화면에 표시될 object를 디자인하고, object의 기능을 만들어

    넣어야 한다. 그러나 VBA에서는 완성된 object를 사용자에게 제공하기 때문에, form, 텍스트박스

    등을 직접 만들지 않아도, 제공되는 object를 복사해서 사용만 하면 된다. 그러므로 사용자는 각

    object의 용도만 익히면 object를 만드는 방법을 모르더라도 프로그래밍을 할 수 있게 된다. 예를

    들어 텍스트박스는 값을 입력 및 출력할 수 있는 object이다. 콤보박스는 리스트에 값을 등록시키

    고 사용자가 특정 값을 찾아 선택하도록 하는 object이다. 이처럼 주어진 object를 가지고 원하는

    프로그램을 만들기 때문에 ‘개체지향 프로그램’이라고 한다.

    엑셀 VBA의 주요 용어와 개념

    A. 객체 또는 개체 (Object)

    i. 워크북, 워크시트, 셀, 차트, 유저폼, 클래스모듈, 그림, 선, 단추, 리스트박스, 텍

    스트박스 등 눈에 보이는 모든 것이 객체

    B. 속성 (Attribute): 객체가 갖고 있는 특성

    i. 텍스트박스의 속성은 위치, 크기, 글꼴, 색상 값 등이 있다.

    C. 메서드 (Method)

    i. 복사하기, 잘라내기, 지우기, 붙여넣기, 이동하기, 보이기(Show), 숨기기(Hide)_,

    저장하기, 열기, 닫기 등 실행명령을 의미

    D. 프로시저(Procedure): 프로그램을 구성하는 작은 프로그램

    VB Editor에서 [삽입]-[모듈]

    i. Sub 프로시저: Sub로 시작하여 End Sub로 끝난다.

    ii. Function 프로시저: Function로 시작하여 End Function로 끝난다

    매개변수를 이용

  • 4

    E. 이벤트 (Event): 특정버튼을 눌렀을 때에 실행할 명령문을 포함.

    Yes, No, Cancel 등의 버튼과 연결되어 사용

    Class와 Instance

    VBA에서 제공하는 Userform을 class라고 한다. VBA에서 object는 class와 instance의 개념으로

    세분 할 수 있는데, VBA가 기본적으로 제공하는 모든 object는 class이고 사용자는 제공된 class를

    복사해서 사용하게 된다. 이렇게 사용자가 class를 복사하여 사용한 object를 instance라고 한다.

    Excel이 제공하는 도구상자의 각종 도형은 class가 되고, 사용자가 sheet에 도형을 그리면 복사된

    도형은 instance가 된다. 복사된 도형은 class의 성격을 그대로 이어받는다. 하나의 class에서 얼마

    든지 instance를 만들어 낼 수 있다. Userform에 텍스트박스를 삽입하면 도구상자에 표시된 텍스

    트박스는 class이고 사용자가 삽입된 텍스트박스는 instance가 된다.

    Class와 instance는 각각이 object로서, class는 프로그래머가 만들어 제공하는 object이고, 사용

    자가 이 class를 복사해 사용하면 instance가 되는 것이다. 즉, 사용자가 사용하는 object는

    instance가 된다.

    사용자도 class를 만들 수 있다. 사용자가 필요한 object의 이름을 정하고 object의 기능(속성,

    메서드)를 정의하면 이것도 class가 된다. 이렇게 만든 class를 사용하면 instance가 된다.

    Object

  • 5

    VBA의 개체(object)구조는 다음과 같다.

    라이브러리가 등록되어야만 개체를 찾을 수 있다. 라이브러리는 확장자가 "olb"인 파일로 시스

    템폴더에 등록된다. 위의 ‘개체 찾아보기’ 그림에는 Excel 라이브러리의 클래스(class)와 구성원

    (property, method)이 표시된다. (보기 개체 찾아보기)

    라이브러리는 object를 아주 크게 분류한 단위로, Excel, MsForm, Office 라이브러리가 있다. 각

    각의 라이브러리에는 class가 있고, class에는 정의된 property와 method가 있다. 이 class를 사용

    자는 instance로 사용하게 된다.

    2. VBE

    VBE(Visual Basic Editor)는 VBA를 작업하도록 제공된 공간이다. 통합문서 창에서 시트에 작업

    을 하듯이, VBE에서 VBA 작업을 하게 된다.

    VBE는 [Alt+F11] 키의 조합으로 열 수 있다. Excel 화면에서 단축키를 누르면 다음과 같은 VBE

    기본 화면이 나타난다. VB Editor 기본 화면은 다음과 같이 구성되어 있다.

    라이브러리 클래스

    구성원

    코드 창

    속성창

  • 6

    (1) 프로젝트 탐색기 창 – 열려있는 파일과 포함되어 있는 개체들의 정보를 보여준다.

    (2) 속성 창 – 해당 개체의 속성 값에 대한 정보를 보여준다. 속성의 수정도 가능하다.

  • 7

    메뉴 표시줄

    표준 도구모음

    3. VBE 환경설정

    VBE 환경설정은 [도구 – 옵션] 메뉴에서 할 수 있다.

    편집기 탭

    코드 설정의 옵션들은 코드 작성시에 발생하는 에러를 줄이고 작성을 용이하게 할 수 있도록

    도와주는 기능이므로 모두 설정하여 사용하는 것이 편리하다.

    자동 구문 검사 : 코드 창에 입력된 코드에 에러가 있을 경우 사용자에게 알려주는 기능이다.

    변수 선언 요구 : 코드 창에 자동으로 "Option Explicit"문이 삽입된다. 이 구문은 변수를 명시적

    으로 선언하여 사용하도록 하는 기능으로, 선언하지 않은 변수는 사용할 수 없

    게 된다.

    구성원 자동 목록 : 코드를 작성할 때 object의 property, method를 자동으로 보여주는 상자를

    표시한다.

    자동 요약 정보 : 입력시점에 함수와 함수의 매개변수 정보를 보여준다.

    자동 데이터 설명 : 코드 창에서 마우스를 변수에 갖다 대면 변수의 값을 보여주는 기능이다.

  • 8

    편집기 형식 탭

    코드창의 폰트를 설정하는 탭으로 글꼴과 크기를 설정할 수 있다.

    일반 탭

  • 9

    폼 모눈 설정 : Userform의 모눈을 설정하는 옵션이다. 모눈 단위의 너비와 높이는 : 1 ~ 60 포

    인트까지 설정할 수 있다.

    오류 잡기 : 오류를 처리하는 방법을 결정한다.

    1) 오류가 발생시 무조건 중단

    : 오류가 발생하면 해당 프로젝트가 중단 모드로 들어간다. 이때 오류 처리기의 활성

    여부나 코드가 클래스 모듈에 있는지의 여부는 상관 없다.

    2) 클래스 모듈에서 중단

    : 클래스 모듈에서 발생한 오류가 처리되지 않으면 해당 프로젝트는 오류를 일으킨

    클래스 모듈의 코드 행에서 중단 모드로 들어간다.

    3) 처리되지 않은 오류 발생시 중단

    : 오류 처리기가 활성화되어 있으면 중단 모드로 들어가지 않고 오류를 잡는다. 활성

    중인 오류 처리기가 없을 경우, 해당 프로젝트는 중단 모드로 들어간다. 하지만 클래

    스 모듈에 처리되지 않은 오류가 있으면 해당 프로젝트는 클래스의 offending 프로

    시저를 일으키는 코드 행에서 중단 모드로 들어간다.

    오류잡기의 옵션은 ‘처리되지 않은 오류 발생시 중단’으로 설정한다. 프로시저에 오

    류 처리기(오류를 잡는 문)를 작성하여 예상되는 오류를 처리하고, 그래도 처리되지 않

    는 오류가 발생되면 프로시저를 중단 모드로 들어간다.

    컴파일

    1) 요청할 때 컴파일

    : 프로젝트를 시작하기 전에 프로젝트를 완전히 컴파일 할 것인지, 또는 필요에 따라

    코드를 컴파일 하여 응용 프로그램을 곧바로 시작할 수 있게 할 것인지를 결정한다.

    2) 백그라운드 컴파일

    : 실행 모드 중에 유휴 시간을 사용하여 백그라운드에 있는 프로젝트의 컴파일을 완

    료할 것인지를 결정한다. 백그라운드 컴파일을 선택하면 런타임 실행 속도가 빨라진

    다. 요청할 때 컴파일을 선택해야만 이 기능을 사용할 수 있다.

    코드 창에 코드를 작성하고 코드를 실행시키면, 가장 먼저 컴파일 과정을 거치게 된

    다. 컴파일은 프로시저의 코드를 기계어로 변환하는 것을 말한다. 컴파일 옵션을 모두

    체크하면 실행속도가 빨라진다.

    도킹 탭

  • 10

    도킹은 ‘결합’을 의미하는 것으로서, VBA에서는 각각의 창에 공간을 배분하여 위치시키는 것을

    말한다. 직접 실행 창, 지역 창, 조사식 창, 프로젝트 탐색기, 속성 창, 개체 찾아보기 등 6개의 창

    을 VBE의 ‘창’이라고 하는데, 이러한 창들간에 도킹을 함으로써 VBA 사용시 화면 구성을 보다 효

    율적으로 할 수 있다. 6개의 창 중에서 도킹을 체크하지 않는 창이 있을 때, VBE에서 도킹을 체크

    하지 않은 창을 불러드리면 선택한 창만 VBE 전면에 표시된다. 반면에 도킹을 체크한 창들은 각

    각 자신의 할당된 위치에 정렬된다.

  • 11

    4. VBE 메뉴

    메뉴 표시줄

    파일

    저장 (Ctrl+S)

    : 현재의 프로젝트 파일을 저장한다.

    파일 가져오기 (Ctrl+M)

    : 외부에 저장된 VB파일을 현재의 프로젝트로 가져온다.

    frm : 사용자 정의 폼 파일

    bas : 모듈

    cls : 클래스 모듈

    프로젝트에서 작성된 모듈, 클래스 모듈, 사용자 정의 폼 등을 VB파일로 저장하고, ‘파일

    가져오기’ 메뉴를 사용해 현재의 프로젝트에 추가시켜 사용할 수 있다. VB파일을 Excel 파

    일로 저장하기 보다는 VB파일로 저장하면 파일의 용량이 작아질 뿐 아니라, 참고하고 싶을

    때 언제든지 불러서 참고할 수 있다. 텍스트로 작성된 파일도 가져 올 수 있다.

    파일 내보내기 (Ctrl+E)

    : 현재의 프로젝트에서 작성한 모듈, 클래스 모듈, 사용자 정의 폼을 VB파일로 저장한다.

    통합문서의 모든 모듈을 파일 내보내기로 저장하고 프로젝트의 모듈 시트를 삭제하여 보

    관하면 매크로가 없는 문서가 될 수 있다. VBA로 자동화 할 경우에도 사용되는 기능이다.

  • 12

    편집

    실행 취소 (Ctrl+Z)

    찾기 (Ctrl+F), 다음 찾기 (F3), 바꾸기 (Ctrl+H))

    : 모듈에서 코드를 찾을 때 사용한다.

    속성/메서드 목록 명령 (Ctrl+J)

    : 개체 이름 뒤에 마침표(.)를 입력하면, 그 개체에 사용할 수 있는 속성과 메서드가 들어

    있는 목록 상자를 표시한다. 또는 포인터가 빈 영역에 있을 때 전체적으로 사용할 수 있

    는 메서드의 목록을 표시한다. (코드를 입력할 때 목록 상자가 자동으로 열리도록 하려면

    옵션 대화 상자의 편집기 탭에서 ‘구성원 자동 목록’을 선택한다.)

    사용자는 메서드를 직접 입력하거나 목록에서 원하는 항목을 선택한 후 Tab키를 눌러

    입력시킬 수 있다.

    상수 목록 명령 (Ctrl+Shift+J)

    : 등호(=) 앞에 입력한 속성에 대해 유효한 상수가 들어 있는 목록 상자를 표시한다. (코

    드를 입력할 때 목록 상자가 자동으로 열리도록 하려면 옵션 대화 상자의 편집기 탭에서

    ‘구성원 자동 목록’을 선택한다.)

    사용자는 상수를 직접 입력하거나 목록에서 원하는 항목을 선택한 후 Tab키를 눌러 입

  • 13

    력시킬 수 있다.

    요약 정보 명령 (Ctrl+I)

    : 코드 창에서 해당 변수, 함수, 문, 메서드 또는 프로시저에 대한 구문을 제공한다. 요약

    정보는 항목에 대한 구문을 표시하고 현재 매개 변수를 반전시킨다. 매개 변수가 있는

    함수나 프로시저의 경우 입력하는 매개 변수와 다음 매개 변수와 구분하는데 사용되는

    쉼표(,)를 입력할 때까지 현재 입력하고 있는 매개 변수는 굵은 글씨로 표시된다. (코드를

    입력할 때 요약 정보가 자동으로 표시되도록 하려면 옵션 대화 상자의 편집기 탭에서

    ‘구성원 자동 목록’을 선택한다.)

    매개 변수 정보 명령 (Ctrl+Shift+I)

    : 초기 함수 또는 문의 매개 변수에 대한 정보를 표시한다. 함수나 문의 매개 변수로 함

    수를 포함하는 함수나 문이 있을 경우 매개 변수 정보를 선택하면 처음 함수에 대한 정

    보를 제공한다. 요약 정보는 각 포함 함수에 대한 정보를 제공한다. 입력하는 매개 변수

    와 다음 매개 변수와 구분하는데 사용되는 쉼표(,)를 입력할 때까지 현재 입력하고 있는

    매개 변수는 굵은 글씨로 표시된다.

    단어 채우기 명령 (Ctrl+Space)

    : 개체, 속성, 메서드, 함수, 예약어 등의 경우, Visual Basic에서 식별할 수 있는 단어까지

    입력하고 명령을 실행시키면 나머지 부분을 자동으로 완성한다.

    삽입

    삽입의 하위메뉴에서 모듈을 클릭하면, 프로젝트에 모듈시트가 삽입된다. 사용자는 모듈시트에

    프로시저를 삽입하고 코드를 작성하게 된다.

    모듈에는 프로젝트의 모듈(Module1, Module2, …), 통합문서의 모듈, 워크시트의 모듈이 있다.

    삽입 메뉴에서 삽입하는 모듈은 프로젝트 내에서 공용으로 사용할 수 있는 프로젝트의 모듈이고,

    통합문서와 워크시트의 모듈은 각각의 개체 안에서만 작용하는 이벤트 모듈이다. 프로젝트 탐색

    기 창에서 각각을 더블클릭하여 활성화시킬 수 있다.

  • 14

    모듈이 활성화되면, 개체선택 상자를 클릭하여 개체를 선택할 수 있다.

    개체를 선택하면 이벤트 프로시저 선택 상자를 클릭하여 이벤트를 선택하여, 개체에서 발생하

    는 이벤트에 관한 코드를 작성할 수 있다.

  • 15

    5. 프로시저

    프로시저 삽입

    VBA를 구성하는 요소에는 문(Statement), 변수, 상수, 개체, 속성, 메서드, 프로시저, 모듈, 폼 등

    이 있다. 코드의 작성은 모듈에 프로시저를 삽입하고, 삽입된 프로시저에 하게 된다. 프로시저는

    Sub 프로시저, Function 프로시저, Property 프로시저로 구분되며, Public, Private 키워드의 사용으

    로 프로시저의 적용범위가 달라진다.

    모듈 창을 열고 메뉴의 [삽입 – 프로시저]를 클릭하여 아래와 같은 대화상자를 불러내고 프로시

    저의 이름을 입력하여 프로시저를 추가할 수 있다.

    프로시저는 모듈에 직접 입력하여 삽입할 수도 있다. 프로시저 선언 시 구조는 다음과 같다.

    Public

    Private

    Sub

    Function

    Property

    프로시저 이름 (인수)

    Ex) ‘example’이라는 이름의 Sub 프로시저를 Private 범위로 인수는 없이 삽입하려면 선언

    문은 다음과 같다.

    Private Sub example()

    End Sub

    단, 범위를 생략할 경우 Public으로 인식한다.

    프로시저의 적용범위

    하나의 프로젝트에는 여러 개의 모듈이 존재한다. 모듈은 5가지로 구분되는데, 워크시트의 모듈,

  • 16

    통합문서의 모듈, 프로젝트의 모듈, 폼의 모듈, 클래스 모듈이 있다. 프로젝트 탐색기 창에서 확인

    할 수 있다.

    시트(다수) : 시트의 모듈은 각 워크시트당 1개씩 주어진다.

    통합문서(1개) : 프로젝트의 통합문서의 모듈이 주어진다.

    모듈(다수) : [삽입 – 모듈]로 추가할 수 있다. 프로젝트의 모듈이다.

    폼 : [삽입 – 사용자 정의 폼]으로 추가할 수 있다. 폼은 각각 1개씩의 모듈을 갖는다.

    클래스모듈 : [삽입 – 클래스모듈]로 추가할 수 있다.

    각각의 모듈에서 프로시저를 Private 또는 Public으로 하는가에 따라서 프로시저의 적용되는 범

    위가 달라진다. Public 프로시저는 프로젝트의 모든 다른 모듈에서 호출하여 사용할 수 있는 프로

    시저가 되지만, 반대로 Private 프로시저는 프로시저가 삽입된 모듈에서만 호출될 수 있다.

    Ex) 아래의 두 개의 모듈에서 각각의 프로시저에 대한 호출의 가능 여부를 비교해 보도

    록 한다. (프로시저는 Call 문으로 호출한다.)

    Module1 Module2

    Private Sub AAA()

    Call BBB ‘가능

    Call DDD ‘가능

    Call CCC ‘불가능

    End Sub

    Public Sub BBB()

    Call AAA ‘가능

    Call DDD ‘가능

    Call CCC ‘불가능

    End Sub

    Private Sub CCC()

    Call AAA ‘불가능

    Call BBB ‘가능

    Call DDD ‘가능

    End Sub

    Public Sub DDD()

    Call AAA ’불가능

    Call BBB ’가능

    Call CCC ‘가능

    End Sub

    Sub 프로시저와 Function 프로시저의 차이

    Sub 프로시저는 프로시저의 코드를 실행하고 End Sub에서 종료되는 프로시저인 반면, Function

    프로시저는 프로시저의 코드를 실행하고 그 결과값을 반환하는 프로시저이다. Function 프로시저

    를 ‘사용자 함수’라고 한다. 즉, 사용자가 필요에 의해 만든 함수라는 의미이다.

    Function 프로시저

    Function 프로시저의 작성도 Sub 프로시저와 유사하다. Function 프로시저는 코드를 실행하고

    결과값을 그 프로시저의 이름에 담아서 반환한다.

    Ex) Function 프로시저의 작성과 호출

  • 17

    Module1

    Sub AAA()

    Dim A as Integer

    A = HowVal(10)

    End Sub

    Function HowVal(intNum As Integer)

    HowVal = intNum * 50

    End Function

    Function 프로시저를 호출할 때는 프로시저의 이름을 바로 입력한다. 또한, Function 프로시저에

    인수(위의 예에서는 intNum)를 사용하도록 작성하였다면, 인수도 함께 입력한다. 작성한 AAA() 프

    로시저를 실행하면 Function 프로시저에서 인수를 10으로 하여 HowVal Function 프로시저를 호출

    하였으므로 ‘HowVal = 10 * 50’이 되어, HowVal(10)은 500이 되고 이 값이 변수 A에 기록된다.

  • 18

    6. 변수

    변수는 프로그램 내에서 수시로 변화하는 값(문자, 숫자)을 관리하기 위해서 사용한다. 예를 들

    어 5, 10, 20이라는 숫자가 있을 때, 이 세 개의 숫자를 특정 숫자 15와 비교하여 “크다”, 또는 “작

    다”라는 메시지를 표시하는 프로그램을 만들고자 한다. 이때 만약 각각의 숫자를 직접 비교하도록

    프로그램을 작성한다면 코드가 복잡하고 길어지게 된다. 이러한 경우 각각의 값을 변수에 임시로

    저장하여 비교하도록 프로그램을 작성하면 코드 작성이 간편해질 뿐 아니라, 가독성이 높아져 코

    드의 검토 및 수정작업이 용이해진다.

    변수의 선언

    Dim : 가장 일반적인 변수 선언 방법이다. 변수의 선언에는 프로시저 내에서 선언하여 프로시

    저 수준의 변수로 사용하는 방법과 프로시저 외부, 즉 모듈에 선언하여 모듈 수준의 변

    수로 사용하는 방법이 있다.

    Dim 변수이름 As 속성

    Public : Public문으로 변수를 모듈에 선언하면, 프로젝트의 모든 프로시저에서 인식되는 변수로

    사용할 수 있다.

    ※ VBE 옵션에서 [변수선언요구]를 체크하면, 코드창에 ‘Option Explicit’라는 문이 자동으로

    입력된다. 이것은 변수를 반드시 선언하도록 하고, 선언하지 않은 변수는 사용할 수 없도

    록 하는 기능을 한다. 변수를 선언하여 사용하면 코드의 가독성이 좋아지고 오류 발생시

    디버그가 용이해진다.

    Ex) 아래의 두 개의 모듈에서 선언된 변수들에 값을 지정하고자 할 때, 각각의 변수를 인

    식 및 사용할 수 있는지 여부를 비교해 보도록 한다. (변수에 값을 지정할 때는 ‘변수이름

    = 지정할 값’의 형식으로 작성한다.)

    Module1 Module2

    Dim A ‘모듈 수준의 변수

    Sub AAA()

    A = 10 ‘가능

    B = 100 ‘가능

    End Sub

    Public B ‘프로젝트 수준의 변수

    Sub BBB()

    A = 10 ‘불가능

    B = 100 ‘가능

    End Sub

    이름 지정 규칙

    VB에서 프로시저, 변수, 상수, 인수 등의 이름을 정할 때는 다음과 같은 규칙에 유의하여 사용

    하도록 한다.

    1) 이름은 문자로 시작해야 한다. 즉, 숫자, 형식 선언문자 등으로 시작하는 이름은 사용할

    수 없다.

  • 19

    2) 이름에는 공백이나 마침표(.), 느낌표(!), @, &, $, # 문자를 사용할 수 없다.

    3) 이름은 최대 255자를 넘을 수 없다.

    4) VB의 예약어는 사용할 수 없다. 즉, VB에서 내부적으로 이미 정해진 함수, 속성, 메서드

    명은 이름으로 사용할 수 없다.

    5) 모듈에서 같은 이름의 변수를 선언할 수 없다.

    A. 변수(변경 가능): a=15

    B. 상수(변경 불가): Cost pi=3.141592654

    C. 연산자:

    i. 사칙연산자 + - * /

    ii. 지수연산자 ^

    iii. 비교연산자 < >=

    D. InputBox() 함수는 변수로 입력된 내용을 받는다.

    변수 = InputBox(메시지, [제목])

    E. MsgBox() 함수는 메시지를 윈도우 형태로 출력한다.

    F.

    MsgBox 메시지, [단추형식], [제목]

    Msgbox “안녕하세요?”, vbOK, “제목1”

    MsgBox “계속 진행하겠습니까?”, vbYesNoCancel, “제목2”

    G. 데이터선언문

    Dim a As Integer -32,768 ~ 32,767 사이의 정수

    Dim b As Long 더 큰 정수

    Dim c As String*4 길이가 4인 문자

    Dim d As String 일반적인 문자

    Dim e As Double 실수 (8 byte)

    Dim f As Single 실수 (4 byte)

    Dim g As Variant 모든 데이터 형태가 가능

  • 20

    H. For~Next구문

    For 카운터변수 = 시작값 To 종료값 [건너뛸값]

    처리할 내용

    Exit For

    Next [카운터변수]

    I. Do~Loop 구문

    Do [While 조건] [Until 조건]

    ….

    [Exit Do]

    ….

    Loop

    J. If ~ Then 문

    If 조건1 Then

    ……

    ElseIf 조건2 Then

    ……

    Else

    …….

    End If

    K. Select ~ Case 문

    여러 가지 경우에 대하여 구분하여 사용하는 문장

    Select Case 변수

    Case 95 To 100

    Hakjum =”A+”

    Case 90 To 94.9

    Hakjum =”A”

    ….

    [Case Else]

    …..

    End Select

  • 21

    7. Excel VBA UserForm 사용 설명

    7-1. User form 작성

    프로그램의 작업 수행에 필요한 데이터나 명령 등을 입력 받기 위하여 사용자가 원하는

    User form을 디자인하여 사용할 수 있다. [삽입 – 사용자정의폼] 을 선택하여 User form을 생성하

    고, [도구상자] 의 개체들을 원하는 곳에 위치시켜서 작성한다. ([도구상자] 가 보이지 않을 경우

    [보기 – 도구상자] 선택)

    예제) User form 작성

    7-2. Macro Function

    Macro Function은 반복되는 복잡한 작업의 수행을 용이하게 하기 위한 기능이다. 작업 과

    정을 기록해 두었다가 필요한 경우에 실행시켜 자동으로 작업을 수행하도록 한다.

    예제) Macro 작성 및 코드 확인

    2주차에 실습했던 데이터테이블을 Macro를 사용하여 다시 작성하도록 한다.

    작성된 Macro의 코드를 확인하고, 직접 코드를 입력하여 Macro를 만들어 본다.

    ([매크로 – 매크로 보기] 에서 작성된 Macro1을 선택하고 [편집], 또는 Alt+F11 VBA

    Editor의 프로젝트 탐색기에서 [모듈 – Module1] 더블클릭)

    7-3. 실행파일 (Procedure)

    Module - 프로그램의 코드를 입력하는 창

    (1) 표준 Module - Sheet Module, ThisWorkbook Module, 모듈 Module

    (2) 폼 (Form Module)

    (3) 클래스 모듈 (Class Module)

  • 22

    Procedure - 코드에서 각각의 기능을 수행하는 프로그램의 한 단위

    (1) Public / Private - 적용 범위(호출 가능 범위)

    (2) Sub / Function - 결과값 반환 여부

    변수 - 작업을 수행하는데 있어서 필요한 값들을 임시로 저장

    String, Single, Integer, Boolean

    예제) Procedure 작성

    Message Box / 변수 사용

    Message Box로부터 값을 입력 받아 변수에 저장하기 위한 Procedure

    Message Box / If문

    Message Box로부터 입력되는 값에 따라 각각 다른 Message Box를 호출

    [예] 선택

    [아니오] 선택

    암호 확인 프로그램 (Input Box / Message Box / If문 / Do Loop문)

  • 23

    Input Box로 암호를 입력 받는 프로그램, 3회까지 시도

    암호 일치

    암호 불일치

    7-4. User form의 명령 단추

    User form - 데이터나 명령을 입력 또는 출력하기 위해 사용자가 원하는 Form을 디자인

    하여 사용하는 것

    Form Module - User form에서의 event(ex:명령단추 클릭)에 따라 실행되는 procedure를

    작성하는 곳

    예제) 암호 설정 / 확인 프로그램

    Userform을 사용한 초기화면

  • 24

    [암호설정]을 선택한 경우 암호설정 form 호출

    [암호확인]을 선택한 경우 앞에서 작성한 ‘암호확인 프로그램’ 호출

    ‘암호확인 프로그램’ 대신 UserForm3을 호출하여 암호를 확인하도록 수정

  • 25

    엑셀 VBA TUTORIAL 문제

    1. 엑셀 VBA의 기본 연습

    A. 1부터 100까지 수열의 합을 구하고 그 값을 MsgBox를 이용하

    여 보여라.

    For~Next 문과 Do~While 문을 사용하여라.

    B. 시작하는 정수와 마지막 정수를 InputBox를 이용하여 읽고 그

    합을 구하라.

    C. InputBox를 이용하여 읽은 시작하는 정수와 마지막 정수를 워

    크시트내의 B2, B3에 보이고 수열의 합은 B4에 보여라.

    2. Select~Case를 이용하여 학점을 구하는 Function을 만들어 보라

    3. UserForm을 만들어 이곳에 수열의 합을 구하기 위한 시작 값과 마

    지막 값을 입력하는 Box를 만들어 읽은 후 그 결과를 원하는 워크

    시트의 원하는 셀에 표시하여 보라.

    4. 1-2주에 사용하였던 엑셀파일을 열고 Data Table을 작성하는 매크

    로를 녹음한 후 VB Editor를 사용하여 코드를 이해하고 그것을 변

    경하여 자동으로 Data Table을 만드는 매크로를 만들어라.

  • 26

    엑셀과 VBA을 연결시키는 프로젝트 예제

    Manual

    1. 엑셀 파일을 다음과 같이 수정한다.

    (1) 가정치들을 별도의 워크시트에 만들고 그 이름을 “Assumption”이라고 한다.

    (2) Income Statement는 별도의 워크시트에 만들고 (이름을 “Income-Statement”라고 함)

    필요한 함수들을 수정한다.

    (3) 별도의 워크시트에 로그인할 때 나타날 화면을 만든다. 워크시트 이름을 “Login화면”

  • 27

    이라고 한다.

    (4) 메인메뉴가 나타날 화면을 별도의 워크시트에 만들고 이름을 “배경화면”이라 한다.

    (5) 로그아웃할 때 나타날 화면을 별도의 워크시트에 만들고 이름을 “Logout화면” 이라

    한다.

  • 28

  • 29

    2. User-Form을 만든다

    (1) Alt+F11 를 누르고 매크로 이름을 입력한 후 VBA Editor로 들어간다.

    (2) 삽입-사용자 정의폼 (User-Form)을 선택한다. 사용자정의폼의 이름을 “UserForm1” 이

    라고 한다.

    (3) 명령단추를 눌러 선택한 후 마우스를 이동하여 원하는 위치에서 왼쪽버튼을 누른 후

    드래그하여 원하는 위치에서 버튼을 떼면 명령단추가 만들어지고 그 이름이

    CommandButtion1이 된다. 같은 방법으로 원하는 만큼의 버튼을 만든다. 이 명령 단

    추들은 아직 매크로가 연결되어 있지 않다.

  • 30

    속성 창에서 각 버튼의 Caption을 변경하고 Font를 원하는 크기로 조정한다.

    도구상자의 레이블을 선택하여 UserForm1의 제목을 “Main Menu”라고 입력한다.

  • 31

    (4) UserForm2를 다음과 같이 만든다. 여기서는 도구상자의 텍스트상자를 이용한다.

    네개의 박스의 이름은 TextBox1, TextBox2, TextBox3, TextBox4

  • 32

    3. Macro 기록을 이용하여 필요한 매크로를 만든다

    (1) 매크로기록을 이용하여 워크시트 이동하는 매크로를 만든다.

    매크로기록을 시작하고 그 이름을 “메인메뉴”로 정한다. 배경화면을 선택하고 A1을

    선택한다. 기록중지를 누른 후 편집을 보면

    Public Sub 메인메뉴()

    Worksheets("배경화면").Select

    Range("A1").Select

    End Sub

    여기에 메인메뉴가 나타나게 하려면 UserForm1.Show를 삽입한다.

    Public Sub 메인메뉴()

    Worksheets("배경화면").Select

    Range("A1").Select

    UserForm1.Show

    End Sub

    이 매크로를 실행하여 제대로 작동하는지 확인한다.

    Income-Statement 워크시트와 Assumption 워크시트 옆에 삽입-도형에서 원하는 도

    형을 삽입하고 이 도형 위에 마우스를 가져간 후 오른쪽 마우스를 눌러 방금 작성한 “메

    인메뉴” 매크로를 지정하여 작동하는지 확인한다.

    (2) 매크로기록을 선택한 후 이름을 “MyScreen”이라 한다.

  • 33

    엑셀 매뉴에서 보기표시/숨기기 에서 수식입력줄, 눈금선, 머릿글 의 선택을 취소한

    후 다시 선택한다. 기록을 중지하고 매크로 편집기에서 함수를 살펴보면서 다음과 같이

    수정한다.

    Sub MyScreen()

    ' 매크로기록을 이용하여 작성한다.

    ' Formular 입력창을 닫는다

    Application.DisplayFormulaBar = False

    ' Row & Column의 번호를 나타내는 Headings 를 닫는다

    ActiveWindow.DisplayHeadings = False

    ' Row & Column의 Gridline을 없앤다

    ActiveWindow.DisplayGridlines = False

    ' Full screen mode로 전환한다

    Application.DisplayFullScreen = True

    End Sub

    Sub OriginalScreen()

    ' Formular 입력창을 연다

    Application.DisplayFormulaBar = True

    ' Row & Column의 번호를 나타내는 Headings 를 연다

    ActiveWindow.DisplayHeadings = True

    ' Row & Column의 Gridline을 보이게 한다

    ActiveWindow.DisplayGridlines = True

    ' Full screen mode로 전환한다

    Application.DisplayFullScreen = True

    ' 원래 screen으로 전환한다

    Application.WindowState = xlNormal

    End Sub

    이 두 매크로를 실행하여 화면이 어떻게 변화하는지 살펴본다.

    (3) 매크로 기록을 선택하고 이름을 “DataTable1작성” 이라고 한 후 Data Table을

  • 34

    “Assumption” 워크시트의 우측에 만든다. 기록을 중지한다.

    4. Macro 만들기와 편집을 이용하여 필요한 프로그램을 만든다.

    (1) UserForm2를 화면에 올리면서 TextBox1,2,3,4에 워하는 값이 나타나도록 한다. 이를

    위해 매트로 새로만들기를 선택하여 이름을 “Assumption보기”로 하고 다음과 같이 입

    력한다.

    Public Sub Assumption보기()

    ' 메인메뉴가 사라진다.

    UserForm1.Hide

    ' Assumption 워크시트의 D3:D7의 값이 TextBox 1~4에 나타나게 한다.

    UserForm2.TextBox1.Value = Worksheets("Assumption").Range("D3").Value

    UserForm2.TextBox2.Value = Worksheets("Assumption").Range("D4").Value

    UserForm2.TextBox3.Value = Worksheets("Assumption").Range("D5").Value

    UserForm2.TextBox4.Value = Worksheets("Assumption").Range("D7").Value

    ' 가정치 입력을 위한 UserForm2가 나타난다.

    UserForm2.Show

    End Sub

    (2) TextBox 1,2,3,4에서 값이 수정될 경우 수정된 값들을 “Assumption”워크시트의 원하는

    Range로 보내주는 매크로를 기록한다. 이름은 “Assumption수정” 이라 한다.

    Public Sub Assumption수정()

  • 35

    ' TextBox 1~4의 수정된 값이 Assumption 워크시트의 D3:D7에 입력된다.

    Worksheets("Assumption").Range("D3").Value = UserForm2.TextBox1.Value

    Worksheets("Assumption").Range("D4").Value = UserForm2.TextBox2.Value

    Worksheets("Assumption").Range("D5").Value = UserForm2.TextBox3.Value

    Worksheets("Assumption").Range("D7").Value = UserForm2.TextBox4.Value

    ' 가정치 입력을 위한 UserForm2가 사라지고 메인메뉴로 돌아간다

    UserForm2.Hide

    메인메뉴

    End Sub

    (3) DataTable1작성 매크로 중 일부를 다음과 같이 수정한다. InputBox를 이용하여 Data

    Table에서 매출증가율의 Minimum과 Maximum을 입력하게 하고 이 두 값을 이용하

    여 5개의 값으로 자동계산하게 한다.

    Sub DataTable1작성()

    '

    Dim Max, Min As Single

    Dim i As Integer

    ' DataTable1작성 Macro

    ' 데이터테이블을 작성할 워크시트를 오픈한다.

    Sheets("Assumption").Select

    ' 데이터테이블의 Column Input Cell의 최대, 최소값을 물어서 자동으로 5단계로 나누

    어 계산한다.

    thePrompt = "Enter the minimum value for the annual sales increase rate."

    theTitle = "Min/Max 입력창"

    theDefault = 0.06

    Min = InputBox(thePrompt, theTitle, theDefault)

    thePrompt = "Enter the maximum value for the annual sales increase rate."

    theTitle = "Min/Max 입력창"

    theDefault = 0.1

    Max = InputBox(thePrompt, theTitle, theDefault)

    ' 매출증가율을 Min, Max 사이에 5단계로 나누어 계산하고 데이터테이블의 Column

    Input에 해당되는 곳이 입력한다.

    Range("G7").Select

    ActiveCell.FormulaR1C1 = Min

  • 36

    Range("G8").Select

    ActiveCell.FormulaR1C1 = Min + (Max - Min) / 4

    Range("G9").Select

    ActiveCell.FormulaR1C1 = Min + (Max - Min) * 2 / 4

    Range("G10").Select

    ActiveCell.FormulaR1C1 = Min + (Max - Min) * 3 / 4

    Range("G11").Select

    ActiveCell.FormulaR1C1 = Max

    ' 이하의 모든 매크로코드는 매크로기록을 이용하여 구한 것으로 수정이 필요 없다.

    이렇게 수정된 매크로를 실행하여 정상적으로 실행되는지 확인한다.

    5. 매크로명령들을 User-Form의 명령단추에 연결한다.

    (1) UserForm1 을 열고 각 명령단추를 더블클릭하고, 각 명령단추를 클릭할 경우 실행할

    매크로 이름 또는 매크로 코드를 입력한다.

    Private Sub CommandButton1_Click()

    Assumption보기

    End Sub

    Private Sub CommandButton2_Click()

    UserForm1.Hide

    Worksheets("Income-statement").Select

    Range("A1").Select

    End Sub

    Private Sub CommandButton3_Click()

    UserForm1.Hide

    DataTable1작성

    End Sub

    Private Sub CommandButton4_Click()

    UserForm1.Hide

    Auto_Close

    End Sub

    (2) UserForm2에 있는 명령단추에 대한 매크로

  • 37

    CHANGE, CANCEL 두 버튼을 더블클릭한 후 각 단추에 대한 매크로를 입력한다.

    Private Sub CommandButton1_Click()

    Assumption수정

    End Sub

    Private Sub CommandButton2_Click()

    UserForm2.Hide

    메인메뉴

    End Sub

    이제는 메인메뉴 매크로를 실행하여 전체 프로그램이 어떻게 조정되는지 확인하라.

    6. 자동로그인, 자동로그아웃을 위한 프로그램을 만든다.

    (1) 엑셀파일을 열 때 최초로 실행되는 파일은 Auto-Open이다. 여기에서 파일에 접속할

    수 있는 권한을 물어볼 수 있다.

    Public Sub Auto_Open()

    ' 엑셀이 열리면서 자동으로 실행된다.

    ' 초기화면으로 이동한다

    Sheets("Login화면").Select

    Range("A1").Select

    ' InputBox를 이용하여 패스워드나 이름을 입력하기 위한 준비

    thePrompt = "Please enter the password."

    theTitle = "경영IT실무 프로젝트 Login"

    theDefault = "홍길동"

    ' 입력이 올바르면 메인메뉴로 이동하고 3번 틀리면 나가게한다

    ' i는 암호 입력 회수를 나타낸다.

    i = 0

    Do While i < 3

    i = i + 1

    theReply = InputBox(thePrompt, theTitle, theDefault)

    If theReply = "*****" Then

    MsgBox "Welcome to 경영IT실무 프로젝트"

    ' 엑셀메뉴를 사라지게 한다.

  • 38

    MyScreen

    ' UserForm1이 나타나게 한다.

    메인메뉴

    Exit Do

    Else

    Beep

    thePrompt = "Invalid! Please check and enter the password again."

    End If

    Loop

    If i = 3 Then

    Sheets("Logout화면").Select

    Range("A1").Select

    MsgBox "Sorry, you are not allowed to access."

    Workbooks("Excel-VBAproject.xlsm").Saved = True

    Workbooks("Excel-VBAproject.xlsm").Close

    End If

    End Sub

    3번의 로그인 기회를 주려면 다음과 같이 Do While …. Loop를 이용하여 수정한다. 이름

    은 반드시 Auto_Open 이어야 한다. 수정 불가.

    Public Sub Auto_Open()

    ' 엑셀이 열리면서 자동으로 실행된다.

    ' 초기화면으로 이동한다

    Sheets("Login화면").Select

    Range("A1").Select

    ' InputBox를 이용하여 패스워드나 이름을 입력하기 위한 준비

    thePrompt = "Please enter the password."

    theTitle = "경영IT실무 프로젝트 Login"

    theDefault = "홍길동"

    theReply = InputBox(thePrompt, theTitle, theDefault)

    If theReply = "*****" Then

    MsgBox "Welcome to 경영IT실무 프로젝트"

    ' 엑셀메뉴를 사라지게 한다.

    MyScreen

  • 39

    ' UserForm1이 나타나게 한다.

    메인메뉴

    Else

    Beep

    Sheets("Logout화면").Select

    Range("A1").Select

    MsgBox "Sorry, you are not allowed to access."

    Workbooks("Excel-VBAproject.xlsm").Saved = True

    Workbooks("Excel-VBAproject.xlsm").Close

    End If

    End Sub

    (2) 프로그램을 끝낼 때 자동으로 실행되는 파일은 Auto_Close이다.

    Public Sub Auto_Close()

    ' 프로그램을 종료할 때 자동으로 실행된다.

    Sheets("Logout화면").Select

    Range("A1").Select

    OriginalScreen

    Workbooks("Excel-VBAproject.xlsm").Saved = False

    MsgBox "See you again!"

    Workbooks("Excel-VBAproject.xlsm").Close

    End Sub

    7. User-Form의 TextBox, ListBox, ComboBox 등의 포맷을 변경한다.

    이제는 프로그램이 좀더 효과적으로 보이도록 업그레이드 해보자.

    (1) UserForm2의 TextBox1,2,3,4에 포맷을 추가하려면 “Assumption보기” 매크로를 다음과

    같이 수정한다.

    Public Sub Assumption보기2()

    ' Assumption보기에서 숫자의 Format을 지정해준다.

    ' 메인메뉴가 사라진다.

    UserForm1.Hide

    ' Assumption 워크시트의 D3:D7의 값이 TextBox 1~4에 나타나게 한다.

    ' 각 TextBox에 나타날 숫자의 형식을 지정한다.

    UserForm2.TextBox1.Value = Format(Worksheets("Assumption").Range("D3").Value,

    "$##,###.00")

  • 40

    UserForm2.TextBox2.Value = Format(Worksheets("Assumption").Range("D4").Value,

    "##.00%")

    UserForm2.TextBox3.Value = Format(Worksheets("Assumption").Range("D5").Value,

    "##.00%")

    UserForm2.TextBox4.Value = Format(Worksheets("Assumption").Range("D7").Value,

    "##.00%")

    ' 가정치 입력을 위한 UserForm2가 나타난다.

    UserForm2.Show

    End Sub

    (2) UserForm2에 TextBox 외에 ListBox, ComboBox 등을 이용하려면 새로운 입력폼

    (UserForm3)을 만들고 “Assuption보기” 매크로와 “Assumption수정” 매크로를 다음과

    같이 수정한다.

    (3) UserForm3를 이용하여 가정치를 보기 위하여 “Assumption보기” 매크로를 수정한다.

    Public Sub Assumption보기3()

    ComboBox1

    ListBox1

  • 41

    ' Assumption보기에서 숫자의 Format을 지정해준다.

    ' 메인메뉴가 사라진다.

    UserForm1.Hide

    ' Assumption 워크시트의 D3:D7의 값이 TextBox 1~4에 나타나게 한다.

    ' 각 TextBox에 나타날 숫자의 형식을 지정한다.

    UserForm3.TextBox1.Value = Format(Worksheets("Assumption").Range("D3").Value,

    "$##,###.00")

    UserForm3.TextBox2.Value = Format(Worksheets("Assumption").Range("D4").Value,

    "##.00%")

    ' TextBox3 대신에 ComboBox 사용해 본다

    UserForm3.ComboBox1.Value = Format(Worksheets("Assumption").Range("D5").Value,

    "##.00%")

    UserForm3.ComboBox1.AddItem "5%"

    UserForm3.ComboBox1.AddItem "10%"

    UserForm3.ComboBox1.AddItem "15%"

    UserForm3.ComboBox1.AddItem "20%"

    ' TextBox4 대신에 ListBox1을 이용해본다.

    UserForm3.ListBox1.AddItem "50%"

    UserForm3.ListBox1.AddItem "60%"

    UserForm3.ListBox1.AddItem "70%"

    UserForm3.ListBox1.AddItem "80%"

    ' 가정치 입력을 위한 UserForm2가 나타난다.

    UserForm3.Show

    End Sub

    (4) UserForm3에서 수정된 값을 엑셀로 돌려주기 위하여 “Assumption수정”을 다음과 같

    이 고친다.

    Public Sub Assumption수정3()

    ' TextBox 1~4의 수정된 값이 Assumption 워크시트의 D3:D7에 입력된다.

    Worksheets("Assumption").Range("D3").Value = UserForm3.TextBox1.Value

    Worksheets("Assumption").Range("D4").Value = UserForm3.TextBox2.Value

    ' ComboBox1 에서의 선택항목을 확인

    For i = 0 To 3

    If UserForm3.ComboBox1.ListIndex = i Then

  • 42

    Worksheets("Assumption").Range("D5").Value = UserForm3.ComboBox1.List(i)

    End If

    Next

    ' ListBox1 에서의 선택항목을 확인

    For j = 0 To 3

    If UserForm3.ListBox1.Selected( j) Then

    Worksheets("Assumption").Range("D7").Value = UserForm3.ListBox1.List( j)

    End If

    Next

    ' 가정치 입력을 위한 UserForm2가 사라지고 메인메뉴로 돌아간다

    UserForm3.Hide

    메인메뉴

    End Sub