VBA
제장 기술통계 작성 및 해석 7 단계 엑셀에서 자주 수행하는 작업을 자동화하는 방법으로 매크로(Macro)가 있다. 매크로는 VBA 프로그래밍 언어로 작성해야 하므로 이것들에 대하여 알아보자. 제.. 절 매크로의 기록과 실행 매크로란 MS 사에서 만든 비주얼 베이직(Visual Basic) 프로그램을 MS Office 제품군인 엑셀, 워드, 파워포인트 등 응용프로그램과 연동하여 편리하고 새로운 기능들을 만들 수 있다. 비주얼 베이직은 객체지향언어로 이미 만들어진 여러 가지 기능들을 가져와서 모듈에 명령과 함수를 모아 저장한 후 해당 작업이 필요할 때 실행할 수 있도록 만든 것이다... 매크로 기록 매크로 기록을 시작하면 엑셀에서는 사용자가 일련의 명령을 수행함에 따라 각 단계의 정보를 저장하고 매크로를 실행하여 일련의 명령을 다시 수행할 수 있다. 매크로 기록은 개발 도구 코드 매크로 기록 메뉴를 클릭 보기 매크로 매크로 기록 메뉴를 클릭
개발 도구 코드 Visual Basic 메뉴를 클릭하여 코드를 직접입력 하는 세가지 방법이 있다. Office를 설치하면 개발도구 메뉴는 기본값으로 설정되어 있지 않기 때문에 메뉴에 추가시켜야 한다. 이 메뉴의 추가는 파일 옵션 리본 사용자 지정 추가 기능 메뉴를 체크한다. 추가된 개발 도구 메뉴는 엑셀 메뉴에서 즉시 확인할 수 있다. 작성한 매크로는 저장할 때 Excel 매크로 사용 통합 문서로 저장해야 이후 파일을 불러서 매크로를 실행할 수 있으며 이 때 파일의 확장자는.xlsm이 된다. 매크로 관련 메뉴는 개발도구 코드(그림.)에서 사용한다. 매크로를 기 그림.: 매크로 관련메뉴 록하는 과정에 대하여 알아보자. 매크로 기록 순서는 그림.: 매크로 기록. 그림.과 같이 매크로 기록을 누르면 그림. 창이 나온다.
. 매크로 이름 상자에 매크로 이름을 입력한다(그림.). 매크로 이름을 입력할 때 첫 글자는 반드시 문자이어야 하며 나머지는 문자, 숫자, 밑줄 등을 사용할 수 있으나 공백은 사용할 수 없고 밑줄( )로 단어를 구분할 수 있다. 3. 매크로는 바로 가는 키로 실행할 수 있고, 바로 가기 키는.에 사용할 문자를 입력한다. 바로 가기 키는 Ctrl+문자나 Ctrl+Shift+문자를 사용할 수 있다. 여기서 문자는 키보드에 있는 임의의 문자키를 말하며 @나 # 같은 특수 문자나 숫자는 사용할 수 없다. 매크로가 포함된 엑셀 파일이 열려 있으면 매크로 실행의 바로 가기 키는 기본값으로 설정된 바로 가기 키보다 우선한다. 4. 매크로는 저장 위치 상자에서 매크로 저장할 위치를 선택할 수 있다. 사 용자가 엑셀를 실행할 때마다 설정된 매크로를 사용하려면 그림. 창의 매크로 저장 위치에서 개인용 매크로 통합문서에 저장한다. 이후 엑셀파 일 실행 후단축 키를 누르면 개인용 매크로 통합문서에 저장된 매크로가 실행된다. 5. 매크로 기록은 그림.에서 확인 버튼을 클릭한 후부터시작된다. 매크로 를 기록하는 과정에서 선택된 셀은 상태 참조로 기록한다. 그렇기 때문에 처음에 현재 셀은 매크로 기록전이므로 현재 셀을 인식할 수 없다. 따라서 매크로가 시작되면 특정한 셀을 선택해야 기준이 되는 셀이 설정되고 그 셀을 기준으로 작업이 진행된다. 6. 매크로 기록할 동작을 수행한다. 7. 매크로 기록 종료는 기록 중지( ) 를 클릭한다. 기록 중지 버튼은 그림.에서 매크로 기록을 눌렀을 때나타난다. 작성된 매크로는 VBA 코드로 변환되어 저장되어 있으며 Visual Basic Editor
로 코드 확인과 코드 편집이 가능하다. 다음은 사칙연산에 대한 4개의 매크로 이다. 먼저 덧셈에 대한 매크로를 만들어 보자.. 그림.에서 매크로 기록을 누르면 그림. 창이 나타난다. 매크로 이 름은 덧셈, 바로 가기 키는 a로 하고 확인 버튼을 누르면 덧셈에 대한 매크로 기록이 시작된다(그림.3(a)).. 덧셈을 하기 위하여 F3 셀에 =D3+E3를 입력하고 매크로 중지 버튼을 누 른다(그림.3(b)). 이때 주의사항으로 중지 버튼을 누르기 전 현재 셀의 위치를 F3으로 해야 매크로가 정상적으로 작동한다. 3. 덧셈 매크로를 만드는 것과 동일한 셀에 뺄셈, 곱셈, 나눗셈에 대한 매크 로를 만든다. 4. 이렇게 만든 4개의 매크로는 Visual Basic Editor의 프로젝트 탐색기 모듈 Module에서 확인할 수 있다(그림.3(c))... 매크로 실행 이미 만들어진 매크로를 실행할 때 프로그래머가 악의적인 코드를 만들었다면 실행 컴퓨터에 치명적인 영향을 줄 수 있으므로 Office에서는 보안에 강화하 고 있다. 매크로 실행의 기본 설정은 모든 매크로 제외이므로 설정을 변경해야 매크로 실행이 가능하다. 엑셀에서 매크로 설정은 다음과 같다. 개발 도구 코드 매크로 보안 매크로 설정 설정 종류 모든 매크로 제외(알림 표시 없음) 모든 매크로 제외(알림 표시) 디지털 서명된 매크로만 포함 : 공인인증서로 매크로를 서명한 경우 모든 매크로 포함(위험성 있는 코드가 실행될 수 있으므로 권장하지 않음) 기록된 매크로를 실행하는 방법은
(a) 덧셈 매크로 기록 (b) 엑셀에 작업한 매크로 내용 (c) editor에서 만든 매크로 확인 그림.3: 덧셈 메크로 기록 과정 매크로 기록시 저정된 바로 가기 키를 누르거나(그림.) 개발도구 컨트롤 삽입에서 단추 버튼을 엑셀에 추가한 후 이미 기록한 매크로를 연결하여 마우스 클릭으로 실행할 수 있으며 개발도구 코드 매크로를 누르거나 보기 매크로 매크로 버튼을 누르면 매크로가 실행한다. 현재 셀이 D3이고 B3과 C3에 숫자가 개 있을 때 사칙연산에 대한 매크로를 작성해보자. 그림.3(b)가 사칙연산을 설정한 매크로이다. 바로가기 키는 덧셈 은 a, 뺄셈은 b, 곱셈은 c, 나눗셈은 d로 하였다. 양식 버튼 4 개를 추가하였고, 각 연산을 연결하였다. 사칙연산에 대한 매크로를 실행해보자.
(a) 보안 센터 (b) 보안 경고 (c) Microsoft Office 보안 옵션 그림.4: 매크로 설정(보안) 덧셈에 대한 바로 가기 키 Ctrl + a, 삘셈에 대한 바로 가기 키 Ctrl + b, 곱셈에 대한 바로 가기 키 Ctrl + c, 나눗셈에 대한 바로 가기 키 Ctrl + d를 차례대로 눌러 매크로를 실행할 수 있다. 개발도구 코드 매크로를 실행하여 기록된 매크로 덧셈, 뺄셈, 곱셈, 나눗셈을 실행할 수 있다. 개발도구 컨트롤 삽입에서 단추 버튼을 클릭하고 셀에 추가될 단추의 크기를 마우스로 설정하면 단추가 추가된다. 단추와 매크로 연결은 단추 에 마우스 위치후 오른쪽 버튼을 누르면 설정된 매크로가 나오고 그 중 원하는 매크로를 연결한다(그림.5(a)).
(a) 매크로 지정 (b) 양식 버튼에 매크로 연결 결과 그림.5: 양식 버튼에 매크로 연결 제.. 절 VBA 그림.6: Visual Basic Editor 매크로와 VBA는 동일한 것이며 엑셀에서 마우스를 이용하여 실행과정을 기록한 것을 매크로라 명하고 Visual Basic Editor를 이용하여 코드를 직접 입력하면 VBA라 부른다. VBA(Visual Basic for Applications)는 비주얼 베 이직 언어를 사용하여 마이크로스프트 오피스에 속하는 제품들(엑셀, 워드,
파워포인트, 엑서스 등)과 연동하는 것을 말한다. 우리는 여기에서 마이크로스 프트의 오피스에 포함된 것 중 엑셀과 연동하기에 응용프로그램(Application) 이 엑셀이 된다. 비주얼 베이직의 기초문법은 예전의 베이직의 문법을 토대로 발전하였지만 GUI(Graphic User Interface) 환경에서 작성하기 때문에 예전 에 사용하던 베이직보다 사용하기가 쉽고 객체지향언어로 되어 있어서 예전의 베이직과는 차이점이 많다. 그림.6은 그림.에서 Visual Basic Editor를 실행한 것이다.
제장 비주얼 베이직 제.. 절 Visual Basic 시작하기 비주얼 베이직을 시작하려면 03 버젼인 경우, 개발 도구 코드 Visual Basic 메뉴를 선택하여 비주얼 베이직 에디터 화면(그림.)이 나타나도록 한다. Office 03은 기본값이 개발도구 리본 메뉴가 없으므로 파일 Excel 옵션 그림.: Visual Basic Editor(03) 리본 사용자 지정 개발도구를 체크를 해야 메뉴가 나타난다. 9
비주얼 베이직 프로그램을 작성하여 엑셀과 연동하려면 그림.의 프로 젝트 창에서 연결하려는 엑셀파일을 마우스로 클릭한 후 삽입 모듈 메뉴를 선택하면 모듈이 추가된다. 그림.에서 추가된 모듈을 선택하면 코드 입력창 이 좌측에 보이며 여기에 코드를 입력하여 프로그램을 작성한다. 제.. 절 엑셀과 Visual Basic 연동 비주얼 베이직 프로그램을 작성하고 엑셀과 연동해 보자.. 비주얼 베이직 프로그램을 작성한다. 프로그램은 코드 입력창에 Sub를 입력하고 적당한 매크로 명을 입력한 후 엔터 키를 누르면 다음과 같은 코드가 자동으로 만들어 진다. 보기. (Sub 문) Sub 창나오기() 여기서 Sub와 사이에 프로그램을 입력하면 매크로가 완성된다. 다음과 같이 매크로를 만들어 보자. 보기. (Sub 문 작성) Sub 창나오기() MsgBox "안녕하세요" MsgBox는 비주얼베이직에 포함된 것으로 간단한 메세지를 포함한 팝 업창을 제공한다. 작성한 비주얼 베이직 프로그램은 실행, 중단, 변경된 내용을 재설정할 수 있으며 그 방법은 다음과 같다. 003인 경우는 Visual Basic Editor에서 실행 메뉴에서
Sub/사용자 정의 폼 실행 또는 매크로 실행( ) : 사용자 정의 폼이나 매크로 실행 중단( ) : 실행중인 프로그램을 중지하는 것으로 프로그램이 오 류가 있는 경우 중단 버튼을 누르고 수정해야 함 재설정( ) : 프로그램을 수정하였으면 그 내용을 적용하기 위하 여 재설정 버튼을 클릭해야 함 007인 경우는 Visual Basic Editor에서 실행 메뉴에서 매크로 실행 : 사용자 정의 폼이나 매크로 실행 중단 : 실행중인 프로그램을 중지하는 것으로 프로그램이 오류가 있는 경우 중단 버튼을 누르고 수정해야 함 재설정 : 프로그램을 수정하였으면 그 내용을 적용하기 위하여 재설 정 버튼을 클릭해야 함. 엑셀에서 매크로를 실행하면 작성한 비주얼 베이직과 연동한다. 제.3. 절 Visual Basic 구성 비주얼 베이직은 새로운 프로그램을 작성하는 것보다 기존에 만들어져 있는 개 체나 메소드, 함수 등을 참조하여 사용하는 것이 더 바람직하다. 따라서 비주얼 베이직을 잘 사용하려면 기존에 만들어진 것들을 어떻게 사용하는 것이 주된 관건이다. 비주얼 베이직의 작성은 모듈이나 클래스 모듈, 폼 안에 하며 이것들이 프 로그램에서 가장 큰 단위이다. 표준 모듈 : 매크로를 만들기 위하여 일반적으로 사용하는 것 클래스 모듈 : 개체를 제공할 목적으로 작성한 모듈로 표준 모듈에서 이 것들을 참조하여 사용함 폼 : 창이나 대화상자에 버튼이나 리스트 등 컴포넌트를 추가하여 이것 들의 이벤트가 발생하였을 때 실행할 코드를 삽입
다음으로 큰 단위는 프로시저로 Sub, Function, Property가 있다. 따라서 실제로 프로시저 안에 프로그램을 작성하는 것이다. Sub : 프로그램을 작성하는 단위로 Sub가 종료될 때 되돌려 주는 값이 없음. 즉 리턴(return) 값이 없음 Function : 프로그램을 작성하는 단위로 Function이 종료될 때 되돌려 주는 값(return)이 있음 Property : 폼, 표준 모듈, 클래스 모듈의 읽기 전용 속성을 만드는데 사용 프로시저에는 여러 가지 개체, 함수, 메소드, 키워드 등 비주얼 베이직 구문에 맞게 프로그램을 작성한다. 제.4. 절 Visual Basic 도움말 비주얼 베이직에서 도움말을 사용하려면 003, 007 버전 모두 Visual Basic Editor에서 ( ) 메뉴를 클릭하면 그림.(a) 도움말 창이 나타난다. 003 버 (a) 도움말 오류(007) (b) 도움말(007) 그림.: Visual Basic Editor 도움말 전은 Visual Basic 도움말을 바로 사용할 수 있으나, 007 버전은 에러 메세지가 출력된다. 그림.(a) 도움말 창은 인터넷에서 도움말 항목에 대하여 다운로드를 시 도하며 도움말 사용이 불가능하다는 메세지를 보여준다. 007인 경우 도움말을 실행하려면 그림.(a) 창의 하단에 이 컴퓨터에서 오프라인 콘텐츠를 표시 합니다. 를 클릭하여 오프라인 도움말을 사용할 수 있다(.(b)).
도움말 사용시 주의할 점은 엑셀에서 도움말 메뉴를 누르면 엑셀 도움말이 보이고 Visual Basic Editor에서 도움말 메뉴를 누르면 Visual Basic 도움말이 보인다. 제.5. 절 엑셀과 관련된 개체, 메소드, 함수, 속성 비주얼 베이직에서 엑셀과 관련된 것들은 무엇인지 알아보자..5. 통합문서 엑셀 파일을 통합문서라고도 하며 Workbooks 개체로 되어 있다. 개체에는 메 소드, 함수, 상수 등이 포함되어 있어 있으며 이를 사용하여 프로그램을 작성할 수 있다. 다음은 통합문서의 사용법이다. Workbooks Workbooks(index ) Workbooks(filename) 이 개체에 사용한 인수들은 index : 열린 순서로 숫자를 부터 사용할 수 있다. filename : 통합문서의 이름으로 하나의 파일만 열려 있다면 입력할 필요 가 없다. 새로운 통합문서를 만들어 보자. 보기.3 (통합문서 만들기) Sub 통합문서추가() Workbooks.Add Workbooks 개체에 Add 메소드를 사용하여 새로운 통합문서를 만들 수 있다. 엑셀파일을 열어보자.
보기.4 (통합문서 열기) Sub 통합문서열기() Workbooks.Open("C:\MyFolder\MyExcel.xls") Workbooks 개체에 Open 메소드를 사용하여 새로운 통합문서를 열 수 있다. 보기.5 (통합문서 참조) Sub 통합문서활성화() Workbooks().Activate 이미 실행중인 통합문서를 닫아보자. 보기.6 (통합문서 닫기) Sub 통합문서닫기() Workbooks.close Workbooks 개체에 Close 메소드를 사용하여 새로운 통합문서를 닫을 수 있다. 이 때 열려진 통합문서가 여러 개인 경우 닫는 통합문서는 현재 활성화 상태인 엑셀파일이다..5. 시트 참조 시트를 참조하려면 Worksheets나 Sheets의 속성을 사용하며. 하는 방법은 Worksheets(index ) Worksheets(sheet name) Sheets(sheet name) 이다. 여기서 괄호()에 들어갈 인수는
index : 참조(인덱스) 번호 sheet name : 시트이름 을 사용한다. 보기.7 (시트 참조) Sub 시트참조() Worksheets().Activate end Sub Sub 시트참조() Worksheets("Sheets3").Activate end Sub Sub 시트참조3() Sheets().Activate end Sub Sub 시트참조4() Sheets("Sheets3").Activate end Sub 시트참조과 시트참조3 프로시저는 시트 번호로 해당 시트를 활성화하였고 시 트참조와 시트참조4 프로시저는 시티 이름으로 해당 시트를 활성화하였다..5.3 셀 참조 셀을 참조는 Cells와 Range 그리고 Offset 속성으로 한다. Cells 속성은 Cells(row num, col num) 으로 하며 row num은 행의 위치 col num은 열의 위치이다.
예를 들어 Cells(,)은 A 셀을 나타낸다. 만일 엑셀에 있는 함수를 계산하여 셀에 출력하려면 Formula 속성과 FormulaRC 속성을 사용한다. Formula : 이 속성은 특정한 셀에 엑셀함수의 결과를 되돌려 줌 FormulaRC : 현재 셀을 기준으로 엑셀함수의 결과를 되돌려 줌 예를 들어 Range("A").Formula = "=RAND()" 를 실행하면 A 셀에 0에서 사이의 실수에서 난수가 출력된다. 경우에 따라서 엑셀함수에 이중 따옴표( )를 사용할 때에는 이중 따옴표를 하나 더 입력해야 오류없이 문장이 실행한다. 다음과 IF 함수에 이중 따옴표를 사용하는 경우를 보자. Range("A").Formula = "=IF(A>5,""크다"",""작다"")" A 셀이 5보다 큰 경우는 크다 문자열이 그렇지 않은 경우는 작다 문자열이 출력되도록 하려면 이중 따옴표를 하나 더 입력해야 한다. Range 속성은 Range( ref ) 이며 ref 에는 셀을 A 스타일로 입력하며, 여러 개의 셀도 지정할 수 있다. 예를 들어 Range( A )은 A 셀이며, Range( A:B )는 A:B 셀을 지정한 것이다. Offset 속성의 사용법은 expression.offset( RowOffset, ColumnOffset ) 이며, expression : Range 개체를 나타내는 변수를 사용
RowOffset : 정수를 입력하며, 양수는 아래, 음수는 위, 0은 기본값 ColumnOffset : 정수를 입력하며, 양수는 오른쪽, 음수는 왼쪽, 0은 기본 값 이다. 다음 예를 보자. 보기.8 (Offset 속성) Sub 셀참조() Worksheets("Sheet").Activate ActiveCell.Offset(,).Activate 위의 예에서 첫 줄은 현재 시트를 활성화 상태로 두 번째 줄은 현재 셀에서 아래로 두 행, 오른 쪽으로 두 열 옮긴 셀을 현재 셀로 설정한 것이다. 제.6. 절 VBA에서 제공하는 함수의 사용방법 VBA에서 제공하는 함수 중 입력기능을 제공하는 함수 InputBox와 출력결과를 제공하는 함수 MsgBox에 대하여 알아보자. 먼저 MsgBox 함수의 사용방법에 대하여 알아보기로 하자. MsgBox(prompt[, buttons] [, title] [, helpfile, context]) 이 함수는 어떠한 메세지를 사용자에게 전달하는 경우에 사용하는 것으로 이 함수가 종료되면 버튼의 값을 되돌려 준다. 사용법에서 기울임꼴의 단어는 함수 의 명명된 인수이다. 특히 대괄호로 묶인 인수들은 생략할 수 있으나 그 이외의 것은 받드시 값을 입력해야 한다. 즉 prompt 인수는 받드시 사용해야 한다. 각 인수의 사용법은 다음과 같다. 주의 : 코드에서는 대괄호를 입력하지 않고 설명하기에 편의상 사 용하였다.
prompt : 반드시 입력하는 필수 요소로 대화 상자에서 메세지로 나타나는 문자열이다. buttons : 표시할 버튼의 개수와 형식을 지정하는 것으로 기본값은 0이며 선택 요소이다. title : 제목표시줄에 표현하는 문자열로 선택 요소이다. helpfile : 도움말을 대화 상자에 제공하며 도움말 파일을 문자열에 입력 한다. 이 옵션을 사용하면 context도 반드시 사용해야 한다. context : 도움말을 작성한 것을 도움말 항목에 번호로 나타내는 것이다. 이 옵션을 사용하면 helpfile도 반드시 사용해야 한다. buttons에 사용하는 인수들은 다음과 같이 설정되어 있으며 상수 문자나 숫자 로 설정할 수 있다. 또한 위의 버튼을 눌렀을 경우에 MsgBox가 되돌려 주는 값이 있으며 다음과 같다. 함수에 인수를 입력하여 사용하는 방법은 두 가지가 있는데 함수와 메서드의 인수들은 코드에서 위치나 이름별로 지정할 수 있으며 위치별로 인수를 지정하려면 각 인수들 사이에 쉼표를 넣어 구문에 나타 난 순서대로 사용한다. 만일 순서가 중간에 있는 인수에 값을 입력하지 않으려면 컴마를 두 개 입력하며(,,) 인수의 위치가 끝이면 생략할 수 있다. 이 방법은 함수나 메서드가 값을 전달하지 않는 경우나 결과값을 무시하는 경우에 사용한다. 다음 함수의 사용법을 보자. 보기.9 (MsgBox 함수) MsgBox "정답이다!",0,"대답 상자" 위에서 첫 번째 인수는 prompt로 반드시 입력하는 것이고, 두 번째 인수는 buttons로 버튼의 형식을 설정한 것이며 세 번째 인수는 title로 제목표 시줄에 나타날 문자열이다.
이름별로 인수를 지정하는 것으로 인수 이름, 콜론, 등호(:=), 인수 값을 차례로 입력한다. 또한 이 방법은 인수의 배열 순서에 상관없이 명명된 인수를 지정할 수 있다. 보기.0 (MsgBox 함수) MsgBox Title:="대답 상자", Prompt:="정답이다!" 함수와 어떤 메서드는 인수들을 괄호로 묶는 경우가 있는데, 이러한 경우 는 함수나 메서드가 값을 반환하는 경우이다. 다음 예는 MsgBox 함수의 결과값은 변수 myvar에 저장된 선택된 단추를 가리키는 숫자다. 결과 값이 사용되기 때문에 괄호가 필요하며, 그런 다음 다른 메세지 상자는 변수의 값을 보여준다. 보기. (MsgBox 함수3) 3 4 5 Sub Question() myvar = MsgBox(Prompt:="저는 제 일을 좋아한다.", _ Title:="대답 상자", Buttons:="4") MsgBox myvar 위의 함수에서 첫 번째와 두 번째 줄은 한 줄에 입력해야 되나 밑줄( )과 빈 공간(t)을 사용하여 두 줄을 사용하였고, 괄호를 사용하였기 때문에 함수의 리턴값을 받아야 되며 변수 myvar에 리턴값이 저장된다. 세 번째 줄에서는 첫 번째 줄과 두 번째 줄에서 리턴 값이 무엇인지 확인할 수 있 도록 MsgBox를 사용하였으며 그림.3에 예 버튼을 누른 것과 그 결과가 출력되었다. 다음으로 입력을 담당하는 InputBox 함수의 사용법을 알아보자. InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context])
(a) MsgBox에서 리턴 값 보내기 (b) MsgBox에서 리턴 값 출력 그림.3: MsgBox 사용 예 이 함수에서 옵션의 사용법은 다음과 같다. prompt : 반드시 입력하는 필수 요소로 대화 상자에서 메세지로 나타나는 문자열이다. title : 제목표시줄에 표현하는 문자열로 선택 요소이다. default : 입력란에 기본값으로 나타날 입력값을 설정한다. xpos : 화면 좌측에서 대화상자까지의 간격으로 생략하면 기본값이 수평 중앙이다. ypos : 화면 위에서 대화상자까지 간격으로 생략하면 대화상자는 /3 가량 아래에 위치한다. helpfile : 도움말을 대화 상자에 제공하며 도움말 파일을 문자열에 입력 한다. 이 옵션을 사용하면 context도 반드시 사용해야 한다. context : 도움말을 작성한 것을 도움말 항목에 번호로 나타내는 것이다. 이 옵션을 사용하면 helpfile도 반드시 사용해야 한다. 보기. (InputBox 함수) Sub Question() myvar = InputBox(Prompt:="숫자를 입력하세요.", _ 3 Default:="00", Title:="홀수, 짝수 판별")
4 5 MsgBox myvar 위의 함수는 입력 상자의 메세지는 숫자를 입력하세요, 입력란의 기본 값은 00, 제목표시줄은 홀수, 짝수 판별로 설정하였다. 그림.4에 기본 설정값 00 을 입력하면 myvar 변수에 값이 저장되며 세 번째 줄에 그 값이 출력된다. (a) InputBox에서 리턴 값 보내기 (b) InputBox에서 리턴 값 출력 그림.4: InputBox 사용 예 제.7. 절 변수 변수란 프로그램 실행 중 수정될 수 있는 데이터를 포함할 수 있는 명명된 저 장 위치를 의미하며 변수 범위 안에서 유일하게 식별하는 이름을 갖는다. 변수 이름은 문자로 시작해야 하고(한글도 사용 가능), 같은 범위 안에서 고유해야 하고, 55 문자보다 길어서는 안되고, 포함 구간이나 형식 선언 문자를 포함할 수 없다. 변수로 자주 사용하게 될 데이터 형식에 대하여 알아보자. Boolean 변수는 6비트(바이트) 숫자로 저장되지만, 이 변수가 가질 수 있 는 값은 오직 True 혹은 False이다. Boolean 변수는 Print를 사용할 때는 True 또는 False로, Write #을 사용할 때는 #TRUE# 또는 #FALSE# 로 표시한다. Boolean 변수는 두 상태 중 한 가지를 지정하기 위해 True 와 False 키워드를 사용한다. 다른 숫자 형식이 Boolean값으로 변환될 때 0은 False로, 그 밖의 다른 값들은 True로 변환된다. Boolean값이 다른 데이터 형식으로 변환될 때 False는 0으로 True는 -로 변환된다.
Byte 변수는 0부터 55까지 값의 범위를 가지는 부호없는 단일한 8비트(바 이트) 숫자로 저장된다. Byte 데이터 형식은 이진 데이터를 저장할 때 사용한다. Currency 변수는 정수 부분 5자리와 소수점 이하 4자리의 고정 소수점을 주기 위하여 0,000 단위로 구분한 정수 형식의 64 비트(8바이트) 숫 자로 저장된다. 이 변수의 표현 범위는 9,337,03,685,477.5808부터 9,337,03,685,477.5807이며, Currency의 형식 선언 문자는 at 기호(@) 이다. Currency 데이터 형식은 정확성이 필요한 고정 소수점 계산과 돈 계산 등에 유용게 사용된다. Date 변수는 IEEE 64비트(8바이트) 부동 소수점 숫자로 저장되며, 00년 월 일부터 9999년 월 3일까지의 날짜와 0:00:00부터 3:59:59까지의 시 간을 표현할 수 있다. 인식 가능한 날짜 형식의 모든 문자는 Date 변수에 할당될 수 있다. 날짜 리터럴은 #January, 993# 또는 # Jan 93# 등과 같이 기호(#)를 사용해야 한다. Date 변수는 날짜의 경우 컴퓨터 가 인식하는 간단하게 표시 날짜 형식에 따라 나타낸다. 시간의 경우 시간 혹은 4 시간의 시간 형식으로 나타낸다. 다른 숫자 형식을 Date로 변환할 경우 정수 부분의 값은 날짜 정보를 나타내고 소수점 아래의 값 은 시간 정보를 나타낸다. 자정은 0으로, 정오는 0.5로 표시하며, 음수는 899년 월 30일 이전의 날짜를 나타낸다. Decimal 변수는 변할 수 있는 0의 배수로 잘린 96비트(바이트) 부호있는 정수를 저장한다. 0의 배수로 자른 요소는 소수점 아래 자릿수를 확정한 후, 0부터 8까지의 범위를 결정하게 된다. 이 변수가 가질수 있는 값 의 범위에 대하여 알아보자. 소수점 아래 자리가 없게 잘린 경우 가능한 가장 큰 값은 ±79,8,6,54,64,337,593,543,950,335이며, 0이 아닌 가장 작은 값은 ±0 8 이고 소수점 아래 8자리의 경우 가장 큰 값은 ±7.9865464337593543950335이다. [참고] Decimal 데이터 형식은 Variant 안에서만 사용 가능한 다. 즉, 변수를 Decimal 형으로 선언하여 사용할 수 없으나,
CDec 함수를 사용하면 하위 형식이 Decimal인 Variant를 만들 수 있다. Double 변수는 IEEE 64비트(8바이트) 부동 소수점 숫자를 저장하며, 그 값 의 범위는 음수인 경우.79769334863 0308 4.940656458447 0 34 이며 양수인 경우 4.940656458447 0 34.79769334863 0308 까지이다. Double용 형식 선언 문자는 숫자 기호(#)를 사용한다. Integer 변수는 3767부터 3767까지의 범위를 갖는6비트(바이트) 숫자 를 저장한다. Integer용 형식 선언 문자는 백분율 기호(%)를 사용한다. Integer 변수는 나열된 값을 표현하는 데에도 사용할 수 있다. 나열된 값은 정수의 유한 집합을 포함하며, 각 값은 사용된 구문에서 유용하게 사용된다. 예를 들면 검은색 = 0, 흰색 = 처럼 나열된 값은 주어진 범위 값 중 하나를 선택하여 사용할 때 편리한다. 모든 나열된 값에 대해 Const 문을 이용해서 상수로 정의하는 것이 좋다. Long 변수는,47,483,648부터,47,483,647까지의 값을 사용할 수 있으 며, 3비트(4바이트) 숫자로 저장된다. Long용 형식 선언 문자는 앰퍼샌 드 기호(&)를 사용한다. Object 변수는 개체를 참조하는 3비트(4바이트) 주소를 저장하며, 이것이 Object로 선언된 변수는 Set 문을 사용하여 지정된 개체를 참조할 수 있다. [참고] Object 형으로 선언된 변수는 어떠한 개체라도 참조할 수 있지만, 그 변수에 의해 참조되는 개체 바인딩은 런타임 바인딩이므로 속도가 항상 느리다. 빠른 실행 모드 바인딩을 하려면 특정 클래스 이름으로 선언된 변수에 개체 참조를 지 정한다. Single 변수는 음수인 경우 3.4083 038 부터.4098 0 45 까지, 양수 인 경우.4098 0 45 부터 3.4083 038 까지 범위 값으로 IEEE 3 비트(4바이트) 부동 소수점 숫자를 저장한다. Single용 형식 선언 문자는 느낌표 기호(!)를 사용한다.
String 문자열에는 가변 길이와 고정 길이 문자열의 두 종류가 있다. 가변 길이 문자열은 대략 0억(3 )개 까지의 문자를 포함한다. 고정 길이 문자열은 부터 대략 64K(6 )개 까지의 문자를 포함한 다. [참고] Public형 고정 길이 문자열은 클래스 모듈에서는 사용할 수 없다. String 문자의 코드 범위는 0부터 55까지이며, 문자 집합에서 앞의 8 개 문자(0부터 7까지)가 표준 U.S. 키보드 글자와 기호 문자를 나타 낸다. 앞의 8개 문자는 ASCII 문자 집합에서 정의한 것과 동일하며, 뒤의 8개 문자(8부터 55까지)는 국제 기호, 강세, 통화 표시 및 분수 등과 같은 특수 문자를 나타낸다. String 형식 선언 문자는 달러 기호($) 를 사용한다. 사용자 정의 데이터 형식 사용자 정의 데이터 형식이란 Type 문을 사용해서 만든 데이터 형식을 말한다. 사용자 정의 데이터 형식에는 하나 이상의 데이터 형식, 배열, 미리 정의한 사용자 정의 데이터 형식이 포함되며, 예를 들면 다음과 같다. 보기.3 (변수) Type MyType MyName As String 3 MyBirthDate As Date 4 MySex As Integer 5 End Type 문자열 변수는 이름을 저장한다. 날짜 변수는 생일을 저장한다. 정수 변수는 성별을 저장한다. 여자는 0이고 남자는 이다. Variant 데이터 형식은 Dim, Private, Public 또는 Static과 같은 문을 사용 하여 다른 형식으로 명시적으로 선언되지 않은 모든 변수의 데이터 형 식이다. Variant 데이터 형식은 형식 선언 문자가 없다. Variant는 고정
길이 String 데이터를 제외한 모든 종류의 데이터를 처리할 수 있는 특 별한 데이터 형식이다. Variant 형식은 이제 사용자 정의 형식을 지원 한다. Variant는 Empty, Error, Nothing, Null 등의 특정한 값을 가질 수 있다. VarType 함수나 TypeName 함수를 사용하면 Variant로 선언된 데 이터가 어떻게 처리되는지 결정할 수 있다. 숫자 데이터의 경우 음수는.797693348635 0308 부터 4.94066 0 34 까지, 양수는 4.94066 0 34 부터.797693348635 0308 까지 표현할 수 있다. 일반적으로 숫자 Variant 데이터는 Variant 안에서 고유의 데이터 형식을 계속 갖 게 된다. 예를 들면 integer를 Variant에 할당하면 이후 연속된 연산은 Variant를 Integer로 처리한다. 그러나 Byte, Integer, Long, Single 값의 가진 Variant에서 산술 연산을 실행한 결과값이 원래의 데이터 형식의 일반적인 값보다 클 경우 그 결과값은 Variant안에서 더 큰 데이터 형식 으로 변환된다. Byte는 Integer로 변환되고, Integer는 Long으로, Long과 Single은 Double로 변환된다. Currency, Decimal 그리고 Double 값을 가진 Variant 변수들이 각각 범위를 초과하면 오류가 발생한다. Variant 데이터 형식은 더욱 유연하게 데이터를 다루는 작업을 해야 하는 곳에서 사용할 수 있다. Variant 변수의 내용이 숫자라면 아래의 예와 같이 상황에 따라 숫자를 문자열로 표현할 수도 있고 또는 실제값이 될 수도 있다. 보기.4 (변수) Dim MyVar As Variant MyVar = 9805 위의 예제에서 MyVar 변수는 실제 값인 9805를 숫자로 나타내고 있다. 산술 연산자는 Variant 변수가 숫자값 또는 숫자로 변환될 수 있는 문자열 데이터를 포함하고 있다고 가정하고 작업을 수행한다. 만약 MyVar 변수 값을 숫자를 포함하고 있는 또 다른 Variant 변수 혹은 숫자 형식 변수에 더하기 위해 + 연산을 한다면 그 결과값은 산술 합계가 된다. Empty 값은 Variant 변수가 초기화되지 않았음(초기값이 할당되지 않았음)을 의미한다. Empty 값을 가진 Variant 변수는 산술적으로 사용할 때는 0을
의미하고, 문자열 의미로 사용할 때는 크기가 0인 문자열( )을 의미한다. Empty와 Null을 혼동하지 마십시오. Null은 Variant 변수가 의도적으로 유효하지 않은 값을 가지고 있다는 것을 의미한다. Variant에서 Error는 프로시저에서 오류가 발생한 것을 나타내는 특별한 값이다. 그러나 다른 오류와는 달리 보통 프로그램 단위의 오류 처리는 발생하지 않으며, 발생 하는 오류값에 따라 다른 방법으로 오류를 처리할 수 있게 한다. CVErr 함수를 사용하여 실제값을 오류값으로 변환하면 Error 값이 만들어진다..7. Dim 문 Dim 문은 변수를 선언할때 사용하는 키워드이다. 사용방법은 Dim varname[([subscripts])] [As type] [, varname[([subscripts])] [As type]]... 이다. Dim 문에서 단어 Dim은 필수 키워드이다. 유일한 필수 요소는 varname( 변수 이름)이다. 예를 들어, 보기.5 (변수3) Dim myvar, nextvar, thirdvar 라 하면 변수 myvar, nextvar, thirdvar를 만든다. 이들은 자동으로 Variant 변 수로 선언된다. 그러나 모든 경우 Variant를 사용하는 것은 많은 메모리를 요구 하므로 이보다 작은 데이터 형식을 사용하여도 가능한 경우에 데이터 형식을 지정할 수가 있는데, 그 예로 String로 선언하려면 Dim myanswer As String 로 하면 된다. 또한 이렇게 변수를 선언하면 여러 오류도 예방할 수 있다. 변수를 여러 개 선언하려면 각 변수마다 데이터 형식을 포함해야 한다. 에를 들어 Dim x As Integer, y As Integer, z As Integer
와 같이 하면 x, y, z는 모두 Integer로 되었으며, Dim x, y, z As Integer 와 같이 하면 x, y는 Variant데이터 형식으로 되고 z만 Integer 데이터 형식으로 지정된다. 배열은 Dim myarray() 와 같이 선언하여 사용할 수 있으며 배열에 관한 자세한 내용은.7.4 소절을 참조하라..7. Visual Basic 명명 규칙 Visual Basic 모듈에서 프로시저, 상수, 변수, 인수의 이름을 정할 때는 다음과 같은 규칙을 따른다. 첫 번째 문자는 숫자를 사용할 수 없으며 영어나 한글 등의 문자를 사용 해야 한다. 공백이나 마침표(.), 느낌표(!), @, &, $, # 문자는 이름에 사용할 수 없다. 길이는 55자를 넘을 수 없다. 보통 Visual Basic의 함수, 문, 메서드 같은 이름은 사용할 수 없다. 즉 언 어가 먼저 사용하려고 저장된 예약어인 키워드는 사용할 수 없다. 그러나 이미 지정된 이름과 충돌하는 내부 언어 함수나 문, 메서드를 사용하려면 명시적으로 나타내야 한다. 관련된 형식 라이브러리의 이름을 내부 함수, 문, 메서드 앞에 넣는다. 같은 수준의 범위에서는 이름을 반복하여 붙일 수 없다. 예를 들어 같은 프로시저에서 age라는 변수를 두 개 선언할 수 없다. 그러나 같은 모듈에 서 Private 변수 age와 프로시저 수준 변수 age를 선언할 수 있다. [참고] Visual Basic에서는 대/소문자를 구분할 필요는 없으나 이름이 선언된 문에서는 대문자로 보존된다.
.7.3 Visual Basic 문 작성 Visual Basic의 문은 키워드, 연산자, 변수, 상수, 식을 포함할 수 있다. 각 문은 다음 세 분야 중 하나에 속한다. 변수나 상수, 프로시저의 이름을 정하고 데이터 형식을 지정할 수 있는 선언문이다. (선언문 작성 예 ReDim, Public, Private, Static, Const) 값이나 식을 변수나 상수에 지정하는 지정문이다.(예 Let, Set 지정문 작 성) 동작을 초기화하는 실행문이다. 이 문은 메서드나 함수를 수행할 수 있고 코드 블록을 반복하거나 분기할 수 있다. 실행문은 수치 연산자나 조건 연산자를 포함한다.(실행문 작성 예Do-While-Loop).7.3. 여러 줄에 계속되는 문 문은 보통 한 줄에 쓸 수 있지만 줄 연속 문자를 사용하여 다음 줄로 문을 연결 할 수 있다. 여러 줄에 한 문을 넣으려면 한 줄의 맨 끝에 밑줄( )과 빈 공간(t) 을 차례로 붙여쓴다. 다음 MsgBox 실행문은 3줄에 걸쳐 연결된다. 보기.6 (한 실행문을 여러 줄에 입력) Sub DemoBox() 이 프로시저는 문자열 변수를 선언한다. Claudia으로 지정하십시오. 3 그리고 연결된 메시지라고 표시한다. 4 Dim myvar As String 5 myvar = "John" 6 MsgBox Prompt:="Hello " & myvar, _ 7 Title:="Greeting Box", _ 8 Buttons:=vbExclamation 9
.7.3. 한 줄에 여러 실행문 넣기 기본적으로 한 줄에는 한 실행문만 입력할 수 있도록 설정되어 있으나 간단한 문장들은 한 줄여 여러 실행문을 입력하여도 프로그램 코드가 보기에 편할 수 있다. 여러 실행문을 한 줄에 사용하는 방법은 실행문과 실행문 사이에 콜론(:)을 삽입하면 된다. 다음과 같이 한 줄에 여러 변수의 값을 생성하고 그 결과를 출력하면 567 이 출력된다. 보기.7 (한 줄에 여러 실행문 넣기) Sub 한줄에여러문넣기() i=5: j=6: k=7 3 MsgBox i & j & k 4.7.3.3 주석 추가 주석은 누구나 코드를 읽을 수 있게 프로시저나 특별한 명령을 설명한다. Visual Basic은 프로시저를 실행할 때 주석은 무시한다. 주석 줄은 작은따옴표( )로 시작하거나 Rem 뒤에 공백을 두어 사용하고 프로시저의 어느 곳에나 쓰일 수 있다. 문과 같은 줄에 주석을 추가하려면 문 뒤에 작은 따옴표를 넣고 주석을 달면 된다. 기본적으로 주석은 녹색 문자열로 표시된다..7.3.4 구문 오류 검사 코드를 한 줄 입력하고 Enter키를 눌렀을 때 그 줄이 빨간색으로 표시되면(오류 메시지도 함께 표시됨) 문에서 무엇이 잘못되었는지 찾아 수정해야 한다.
.7.4 배열 사용 배열을 선언하면 동일한 데이터 형식의 값들 생성하여 작업할 수 있다. 배열은 값을 저장할 많은 공간들로 된 단일 변수인 반면 일반 변수는 값 하나만 저장 할 수 있는 공간을 갖는다. 배열의 모든 값을 참조하기 위해서 배열을 전체로 참조할 수도 있고 각 요소들을 참조할 수도 있다. 예를 들어, 매일마다 하루 경비를 저장해야 할 때는 365개 변수를 선언하기 보다는 365개의 요소를 가지는 배열 변수 한 개를 선언하는 것이 효율적이다. 배열의 각 요소마다 값이 한 개 있다. 다음 문은 365개 요소로 된 배열 변수 curexpense를 선언한다. 기본적으로 배열의 인덱스는 0으로 시작하므로 배열 의 상한값은 365가 아닌 364이다. Dim curexpense(364) As Currency 요소의 값을 개별적으로 설정하려면 요소의 인덱스를 지정한다. 다음 보기는 배열의 각 요소에 초기값 0을 지정한 예이다. 보기.8 (배열 사용) Sub FillArray() Dim curexpense(364) As Currency 3 Dim inti As Integer 4 For inti = 0 to 364 5 6 7 curexpense(inti) = 0 Next.7.4. 하한값 변경 배열을 사용하다 보면 시작 인덱스를 변경하면 작업이 편리하게 진행되는 경 우가 있다. 이런 경우 모듈의 맨 위에 있는 Option Base 문을 사용하여 첫 번째 요소의 기본 인덱스를 0에서 로 변경할 수 있다. 다음 보기에서 Option Base 문은 첫 번째 요소의 인덱스를 변경하고 Dim 문은 365개 요소의 배열 변수 curexpense를 선언한다.
보기.9 (배열 기본 인덱스 변경) Option Base Dim curexpense(365) As Currency 또한 To를 사용하면 배열의 인덱스를 명시적으로 설정할 수 있다. 다음은 To 를 사용하여 배열의 하한값을 명시적으로 설정하였다. 보기.0 (배열의 인덱스를 명시적으로 설정) Dim curexpense( To 365) As Currency Dim strweekday(7 To 3) As String.7.4. 배열에 Variant 값 저장 Variant 값 배열을 만드는 방법은 두 가지이다. 첫 번째는 각 배열 요소에 Variant 데이터 형식을 각각 입력한다. 다음 예를 보자. 보기. (Variant 배열 형식 입력) Dim vardata(3) As Variant vardata(0) = "Claudia Bendel" 3 vardata() = "44 Maple Blvd" 4 vardata() = 38 5 vardata(3) = Format("06-09-95", "일반 날짜") 두 번째는 Array 함수의 결과값으로 나오는 배열을 Variant 변수에 지정하는 것이다. 보기. (Array 함수로 Variant 배열 형식 입력) Dim vardata As Variant vardata = Array("Ron Bendel", "44 Maple Blvd", 38, _ 3 Format("06-09-95", "General Date"))
두 방법 중 어떤 방법으로 변수를 만들었어도 Variant 값들로 된 배열의 요소는 인덱스로 나타낼 수 있다. 예를 들어, 보기.에 다음 문을 추가해보자. 보기.3 (Variant 벼열 요소 호출) MsgBox "Data for " & vardata(0) & " has been recorded." 다차원 배열 사용.7.4.3 배열은 차원 이상 사용하면 다차원 배열이라고 부른다. Visual Basic에서 배열 은 60 차원까지 선언할 수 있다. 다음은 5 0의 차원 배열을 선언한 예이다. 보기.4 ( 차원 배열) Dim sngmulti( To 5, To 0) As Single 배열을 행렬로 생각한다면 첫 번째 인수는 행을 나타내고 두 번째 인수는 열을 나타낸다. 다차원 배열을 처리할 때는 중첩된 For-Next 문을 사용한다. 다음 프로시저 는 차원 배열을 Single 값으로 채운다. 보기.5 ( 차원 배열에 값 채우기) Sub FillArrayMulti() Dim inti As Integer, intj As Integer 3 Dim sngmulti( To 5, To 0) As Single 4 5 배열을 값으로 채운다. 6 For inti = To 5 7 For intj = To 0 8 sngmulti(inti, intj) = inti * intj 9 Debug.Print sngmulti(inti, intj) 0 Next intj Next inti
.7.4.4 고정 배열 선언 배열의 선언을 Dim으로 할 경우 배열의 크기는 Dim에 선언한 값보다 이 더 크다. 다음은 고정 배열의 크기를 행과 열로 된 Integer 배열이다. 보기.6 (고정 배열 선언) Dim MyArray(0, 0) As Integer 첫 번째 인수는 행을 나타내고 두 번째 인수는 열을 나타낸다. 다른 변수 선언과 같이 배열에 대해 데이터 형식을 지정하지 않으면 선언된 배열 요소의 데이터 형식은 Variant가 된다. 배열의 각 숫자 Variant 요소는 6바이트를 사용한다. 각 문자열 Variant 요소는 바이트를 사용한다. 되도록 정확히 코드를 작성 하려면 Variant가 아닌 데이터 형식을 선언하십시오. 다음 코드들은 여러 가지 배열의 크기를 비교한다. 보기.7 (배열 크기 선언) 정수 배열은 바이트를 사용한다.( 요소 * 바이트) ReDim MyIntegerArray(0) As Integer 3 4 배정도 배열은 88바이트를 사용한다.( 요소 * 8바이트) 5 ReDim MyDoubleArray(0) As Double 6 7 Variant 배열은 적어도 76바이트를 사용한다. 8 ( 요소 * 6바이트) 9 ReDim MyVariantArray(0) 0 정수 배열은 00 * 00 * 바이트를 사용한다. (0,000바이트) 3 ReDim MyIntegerArray (99, 99) As Integer 4 5 배정도 배열은 00 * 00 * 8바이트를 사용한다. 6 (80,000 바이트)
7 ReDim MyDoubleArray (99, 99) As Double 8 9 Variant 배열은 적어도 60,000바이트를 사용한다. 0 (00 * 00 * 6바이트) ReDim MyVariantArray(99, 99) 위의 예에서 운영 체제와 사용가능한 메모리에 따라 배열의 최대 크기는 변할 수 있다. 사용할 수 있는 RAM 용량을 초과하는 배열을 사용하면 데이터가 디스크로부터 읽히거나 기록되기 때문에 속도가 느려진다..7.5 동적 배열 선언 동적 배열을 선언하면 코드가 실행하는 동안 배열의 크기를 정할 수 있다. 다음 보기와 같이 Static, Dim, Private, Public 문을 사용하여 배열을 선언하고 괄호 안은 공백으로 남겨둔다. 보기.8 (배열 선언(크기 설정 않함)) Dim sngarray() As Single [참고] ReDim 문을 사용하면 프로시저에서 암시적으로 배열을 선 언할 수 있다. ReDim 문을 사용할 때 배열 이름을 잘못 쓰지 않도록 주의 한다. Option Explicit 문이 모듈에 포함되어 있어도 두 번째 배열을 만들 수 있다. 배열의 범위에 있는 프로시저에서는 ReDim 문을 사용하여 차원의 수를 변경하거나 요소의 수를 정의하고 각 차원의 상한값과 하한값을 정의한다. ReDim 문을 사용하여 동적 배열을 변경할 수도 있다. 그러나 이렇게 할 때마다 배열에 있는 기 존의 값을 잃게 된다. 따라서 배열에 있는 기존의 값을 보존하면서 배열을 확장하려면 ReDim Preserve를 사용한다. 예를 들어, 다음 은 원래 요소의 현재값을 잃지 않고 배열 vararray를 0 요소만큼 확장한다. 보기.9 (배열 요소 확장)
ReDim Preserve vararray(ubound(vararray) + 0) [메모] Preserve 키워드를 동적 배열과 함께 사용하면 마지막 차원의 상한값만 변경할 수 있지만 차원의 수는 변경할 수 없다. 제.8. 절 프로시저 프로시저는 문, 변수 등을 사용하여 실행할 수 있는 공간으로 Sub 프로시저, Function 프로시저, Property 프로시저가 있다..8. Sub 프로시저 Sub 프로시저는 동작은 수행하지만 값은 반환하지 않는 Sub와 로 묶 인 일련의 Visual Basic 문이다. Sub 프로시저는 호출 프로시저에 의해 전달된 상수, 변수, 식 같은 인수를 가질수 있다. Sub 프로시저의 구성은 [Private Public Friend][Static] Sub name[(arglist)] [statements] [Exit Sub] [statement] 이다. Sub 프로시저에 인수가 없으면 Sub 문에는 공백의 괄호가 포함되어야 한다. 다음은 Sub 프로시저 예다. 보기.30 (Sub 프로시저) Sub GetInfo() Dim answer As String answer = InputBox(Prompt:="이름을 입력하십시오.") If answer = Empty Then MsgBox Prompt:="이름을 입력하지 않았다." Else
MsgBox Prompt:="이름은 "& answer &"이다." End If.8. Function 프로시저 Function 프로시저는 동작을 수행한 결과 값을 반환하는 것으로 구성은 Function과 End Function으로 묶인 비주얼 베이직 문이다. Sub 프로시저의 구성은 [Private Public Friend][Static] Function name[(arglist)] [As type] [statements] [name = expression] [Exit Function] [statement] [name = expression] 이다. Function 프로시저는 호출 프로시저에 의해 전달된 상수, 변수, 식 같은 인수를 가질 수 있으며 값을 반환하는 형태의 데이터 형식을 지정해야 한다. 이 때 되돌려 주는 값은 Function에 붙여진 프로시저 명으로 해야 한다. 다음은 계승(factorial)을 만드는 Function 프로시저 예이다. 보기.3 (Function 프로시저) Sub go_to() Dim num As Integer, int_num As Integer 3 Dim in_value 4 in_value = InputBox("숫자를 입력하세요") 5 If Not IsNumeric(in_value) Then 6 GoTo not_num
7 End If 8 num = in_value 9 out_value = factorial(num) 0 Cells(, ) = out_value Exit Sub not_num: MsgBox ("숫자를 입력하세요") 3 4 Function factorial(i As Integer) As Long 5 j = i 6 For i = i - To Step - j = j * i 7 8 Next i 9 factorial = j 0 End Function 이다. 위에서 계승(factorial)은 Sub 프로시저에서 Function 프로시저가 이 될 때까지 호출하며, factorial 프로시저에서 되돌려 주는 값은 9 줄에factorial=j 이다..8.3 Sub와 Function 프로시저 호출 다른 프로시저에서 Sub 프로시저를 호출하려면 프로시저 이름을 입력하고 필 요한 인수 값을 넣어야 한다. Call 문은 필요하지 않지만 사용할 경우에는 모든 인수를 괄호로 묶어야 한다. Sub 프로시저를 사용하여 다른 프로시저를 구성할 수 있는데, 그러면 이해하기 쉽고 디버그도 쉽다. 다음 보기에서는 Sub 프로시 저인 Main이 Sub 프로시저인 MultiBeep을 호출하여 인수 값인 56을 전달한다. MultiBeep이 실행되고 나면 컨트롤은 Main으로 반환되며 Main은 Sub 프로시 저인 Message를 호출한다. Message는 메시지 상자를 보여준다. 확인을 누르면 컨트롤은 다시 Main으로 반환되고 Main은 종료된다. 보기.3 (Sub 프로시저 호출)
Sub Main() MultiBeep 56 3 Message 4 5 Sub MultiBeep(numbeeps) 6 7 8 9 0 For counter = To numbeeps Beep Next counter Sub Message() MsgBox "잠깐 쉴 시간이다!" 인수가 두 개 이상인 Sub 프로시저 호출 다음은 인수가 두 개 이상인 Sub 프 로시저를 호출하는 방법을 나타낸 것이다. HouseCalc가 두 번째 호출되면 Call 문이 사용되므로 인수를 괄호로 묶어야 한다. 보기.33 (Sub 프로시저 호출(인수 개)) Sub Main() HouseCalc 99800, 4300 3 Call HouseCalc(380950, 49500) 4 5 Sub HouseCalc(price As Single, wage As Single) 6 7 8 9 0 If.5 * wage <= 0.8 * price Then MsgBox "이 집을 살 여유가 없다." Else MsgBox "이 집을 살 여유가 있다." End If
괄호를 사용한 Function 프로시저 호출 함수의 결과값을 사용하려면 다음 보기 와 같이 함수를 변수에 지정하고 인수들을 괄호로 묶어야 한다. Answer3 = MsgBox("당신의 봉급에 만족하십니까?", 4, "질문 3") 함수의 결과값에는 관계 없이 Sub 프로시저를 호출하는 방법으로 함수를 호 출할 수 있다. 다음 보기와 같이 괄호를 생략하고 인수들을 나열하며 함수를 변수에는 지정하지 않는다. MsgBox "작업이 완료되었다!", 0, "작업 상자" 주의 앞의 보기에서 괄호로 묶는다면 구문 오류가 발생한다. 명명된 인수 전달 Sub 또는 Function 프로시저는 명명된 인수를 사용하여 호출된 프로시저에 값 을 전달할 수 있다. 명명된 인수들은 순서에 상관없이 나열할 수 있다. 명명된 인수는 인수 이름과 콜론, 등호(:=), 인수에 지정된 값으로 구성된다. 다음은 결과값 없이 명명된 인수를 사용하여 MsgBox 함수를 호출한다. MsgBox Title:="작업 상자", Prompt:="작업이 완료되었다!" 다음은 명명된 인수를 사용하여 MsgBox 함수를 호출한다. 결과값은 변수 answer3에 지정한다. answer3 = MsgBox(Title:="질문 3", _ Prompt:="당신의 봉급에 만족하십니까?", Buttons:=4) 제.9. 절 제어문 프로그램 작성시 일정한 조건에 따라 증가 또는 감소하는 경우나 특정한 조건 동안 명령을 실행할 때 사용하는 키워드가 있으며 이것을 제어문이라고 말한다..9. Do-Loop 문 사용 Do-Loop 문을 사용하여 문 블럭을 무제한으로 실행할 수 있다. 조건이 True이 거나 True가 될 때까지 반복된다. While이나 Until 키워드를 사용하여 Do-Loop
문에서 조건을 검사하는 방법은 두 가지이다. Do-Loop 문에 들어가기 전에 조 건을 검사할 수도 있고 적어도 한 번 Do-Loop 문을 실행한 후에 검사할 수도 있다. Do-Loop 문에 들어가기 전에 조건을 검사하려면 다음과 같이 한다. Do [{While Until} condition ] 반복할 문 [Exit Do] Loop 또한 적어도 한 번 Do-Loop 문을 실행한 후에 조건을 검사하려면 다음과 같이 한다. Do 반복할 문 [Exit Do] Loop [{While Until} condition ] 다음 ChkFirstWhile 프로시저에서는 Do-Loop 문에 들어가기 전에 조건을 검사 한다. mynum이 0이 아닌 9로 설정되었다면 그 Do-Loop 안의 문은 실행되지 않다. ChkLastWhile 프로시저에서는 조건이 False가 되기 전까지 루프 안의 문은 한 번만 실행된다. 보기.34 (조건이 True일 동안 문 반복) Sub ChkFirstWhile() counter = 0 3 mynum = 0 4 Do While mynum > 0 5 mynum = mynum - 6 counter = counter +
7 Loop 8 MsgBox "루프를 "& counter &"번 반복하였다." 9 0 Sub ChkLastWhile() counter = 0 3 mynum = 9 4 Do 5 mynum = mynum - 6 counter = counter + 7 Loop While mynum > 0 8 MsgBox "루프를 "& counter &"번 반복하였다." 9 Do-Loop 문에서 조건을 검사하기 위해 Until 키워드를 사용하는 방법이 두 가지 있다. Do-Loop 문에 들어가기 전에 조건을 검사(ChkFirstUntil)할 수도 있고 루 프가 적어도 한 번 실행된 후에 검사(ChkLastUntil)할 수도 있다. 루프는 조건이 False인 동안 반복된다. 보기.35 (조건이 True가 될 때까지 문 반복) Sub ChkFirstUntil() counter = 0 3 mynum = 0 4 Do Until mynum = 0 5 mynum = mynum - 6 counter = counter + 7 Loop 8 MsgBox "루프를 "& counter &"번 반복하였다." 9 0 Sub ChkLastUntil()
counter = 0 3 mynum = 4 Do 5 mynum = mynum + 6 counter = counter + 7 Loop Until mynum = 0 8 MsgBox "루프를 "& counter &"번 반복하였다." 9 Exit Do 문을 사용하여 Do-Loop 문을 빠져 나갈 수 있다. 예를 들어, 끝없이 반복되는 루프를 빠져 나가려면 If-Then-Else 문이나 Select-Case 문의 True 문 블록에서 Exit Do 문을 사용하십시오. 조건이 False일 경우에는 루프가 계속 반복되어 실행될 것이다. 다음 보기에서 mynum에는 끝없이 반복되는 루프를 만드는 값이 지정되었다. If-Then-Else 문은 이 조건을 검사하고 루프가 계속 반복되는 것을 막기 위해 조건이 맞으면 빠져 나간다. 보기.36 (Do-Loop 문 빠져 나가기) Sub ExitExample() counter = 0 3 mynum = 9 4 Do Until mynum = 0 5 mynum = mynum - 6 counter = counter + 7 If mynum < 0 Then Exit Do 8 Loop 9 MsgBox "루프를 "& counter &"번 반복하였다." 0 [참고] 계속 반복되는 루프를 멈추려면 Esc키나 Ctrl+Break를 누 르십시오.
.9. For-Each-Next 문 For-Each-Next 문은 컬렉션의 각 개체나 배열의 각 요소마다 문 블럭을 반복한 다. 루프가 실행될 때마다 자동으로 변수가 설정된다. 사용법은 다음과 같다. For Each element In group 반복할 문 [Exit For] Next element For-Each-Next 문에 사용한 값들은 element : 컬렉션이나 배열의 요소들을 반복실행에 사용하는 변수 group : 개체 컬렉션이나 배열이름 예를 들어, 다음 프로시저는 실행 중인 프로시저가 들어 있는 폼을 제외한 모든 폼을 닫다. 보기.37 (유저폼 닫기 반복) Sub CloseForms() For Each frm In Application.Forms If frm.caption <> Screen. ActiveForm.Caption Then frm.close 3 4 5 Next 다음 코드는 배열의 각 요소를 반복하며 각 값을 인덱스 변수 I의 값으로 설정 한다. 보기.38 (배열에 값 할당 반복) Dim TestArray(0) As Integer, I As Variant For Each I In TestArray
3 4 TestArray(I) = I Next I 셀 범위에서 반복 실행 For-Each-Next 문을 사용하여 범위에 있는 모든 셀을 반복할 수 있다. 다음 프로시저는 시트의 A:D0 범위를 반복 실행하며 절대 값이 0.0보다 작은 숫자는 0으로 설정한다. 보기.39 (개체에 속한 콜렉션 반복) 3 4 5 Sub RoundToZero() For Each myobject in mycollection If Abs(myObject.Value) < 0.0 Then myobject.value = 0 Next 끝나기 전에 Each-Next-Loop 문 빠져 나가려면 Exit For 문을 사용하여 For Each-Next 루프를 빠져 나갈 수 있다. 예를 들어, 오류가 발생하면 특별히 오 류를 검사하는 If-Then-Else 문이나 Select-Case 문의 True 문 블록에 Exit For 문을 사용하면 반복문을 빠져나갈 수 있다. 오류가 발생하지 않고 If-Then-Else 문이 False이면 루프는 예상대로 계속 실행된다. 다음 보기는 A:B5 범위에서 숫자가 없는 첫 번째 셀을 검사한다. 그런 셀을 찾으면 메시지가 표시되고 Exit For 문에 의해 루프를 빠져 나간다. 보기.40 (반복문 빠져나가기) Sub TestForNumbers() For Each myobject In MyCollection 3 If IsNumeric(myObject.Value) = False Then 4 MsgBox "개체에 숫자값이 아닌 값이 있다." 5 Exit For 6 7 8 End If Next c
.9.3 For-Next 문 For-Next 문을 사용하여 정해진 횟수만큼 문 블럭을 반복할 수 있다. For 루프는 루프를 반복할 때마다 값이 증가되거나 감소되는 카운터 변수를 사용한다. For counter=start To end [Step step ] 반복할 문 [Exit For] Next counter For-Next 문에 사용한 값들은 counter : 반복문에 루프 카운터로 사용할 숫자 변수명 start : 반복문에서 시작값 end : 반복문에서 종료값 step : 반복문에서 루프에서 변화하는 값으로 생략하면 다음 프로시저는 신호음을 50번 낸다. For 문은 카운터 변수 x와 시작값, 최종값을 지정한다. Next 문은 카운터 변수를 씩 증가시킨다. 보기.4 (반복해서 beep 소리 내기) Sub Beeps() For x = To 50 3 Beep 4 Next x 5 Step 키워드를 사용하면 지정한 값만큼 카운터 변수를 증가시키거나 감소시킬 수 있다. 다음 보기에서는 루프가 반복될 때마다 카운터 변수 j가 씩 증가한다. 루프가 끝나면 total은, 4, 6, 8, 0의 합계가 된다.
보기.4 (증가치를 반복해서 합계 구하기) 3 Sub TwosTotal() For j = To 0 Step total = total + j 4 Next j 5 MsgBox "총 "& total &"이다." 6 카운터 변수를 감소시키려면 음수 Step 값을 사용하십시오. 카운터 변수를 감 소시키려면 최종값을 시작값보다 작게 지정해야 한다. 다음 보기에서 카운터 변수 mynum은 루프가 반복될 때마다 씩 감소된다. 루프가 끝나면 total은 6, 4,, 0, 8, 6, 4, 의 합계가 된다. 보기.43 (감소치를 반복해서 합계 구하기) 3 Sub NewTotal() For mynum = 6 To Step - total = total + mynum 4 Next mynum 5 MsgBox "총 "& total &"이다." 6 [참고] 문 다음에 카운터 변수 이름을 포함할 필요는 없다. 앞의 보기에서 카운터 변수 이름은 이해를 쉽게 하도록 포함되었다. Exit For 문을 사용하면 최종값에 이르기 전에 For-Next 문을 빠져 나올 수 있 다. 예를 들어, 오류가 발생할 때 특별히 오류를 검사하는 If-Then-Else 문이나 Select-Case 문의 True 문 블록에 Exit For 문을 사용하면 된다. 오류가 발생하지 않고 If-Then-Else 문이 False이면 루프는 예상대로 실행을 계속할 것이다.
.9.4 If-Then-ElseIf-Then-Else 문 If-Then-ElseIf-Then-Else 문을 사용하여 조건 값에 따라서 특정 문이나 문 블록 을 실행할 수 있다. If-Then-ElseIf-Then-Else 문은 필요한 수준만큼 중첩될 수 있다. 그러나 읽기 쉽게 하려면 다중 수준으로 중첩된 If-Then-ElseIf-Then-Else 문을 사용하는 것보다는 Select-Case 문을 사용할 수도 있다. If-Then-ElseIfThen-Else 문의 사용법은 다음과 같다. If condition Then 실행 문 [ElseIf condition Then 실행 문 ] [Else 실행 문3 ] End If condition 여기서 condition : 이 조건이 True이면 실행 문 이 실행됨 condition : condition 을 제외하고 이 조건이 True이면 실행 문 가 실행 됨 또한 조건이 여러 개이면 ElseIf condition Then을 여러 번 사용하면 된다. 반 대로 조건이 한 개인 것을 실행하려면 If-Then-Else를 사용한다. 다음 보기는 Else 키워드를 생략한 한 줄 구문이다. 보기.44 (논리가 한 개인 경우 한 문장 실행 조건문) Sub FixDate() mydate = #/3/95#
3 4 If mydate < Now Then mydate = Now 한 줄 이상의 코드를 실행하려면 여러 줄 문을 사용해야 한다. 다음 보기와 같이 이 구문은 End If 문을 포함한다. 보기.45 (논리가 한 개인 경우 여러 문장 실행 조건문) Sub AlertUser(value as Long) If value = 0 Then 3 AlertLabel.ForeColor = "Red" 4 AlertLabel.Font.Bold = True 5 AlertLabel.Font.Italic = True 6 7 End If 조건이 True일 때 특정 문을 실행하고 False일 때 다른 문 실행 If-Then-Else 문을 사용하여 실행문 블록 두 개를 정의한다. 조건이 True이면 한 블록이 실행되고 False이면 다른 블록이 실행된다. 보기.46 (논리가 한 개인 경우 TRUE, FALSE마다 실행 조건문) Sub AlertUser(value as Long) If value = 0 Then 3 AlertLabel.ForeColor = vbred 4 AlertLabel.Font.Bold = True 5 AlertLabel.Font.Italic = True 6 Else 7 AlertLabel.Forecolor = vbblack 8 AlertLabel.Font.Bold = False 9 AlertLabel.Font.Italic = False 0 End If
첫 번째 조건이 False일 때 두 번째 조건 검사 If-Then-Else 문에 ElseIf 문을 추가하여 첫 번째 조건이 False일 때 두 번째 조건을 검사할 수 있다. 예를 들어, 다음 Function 프로시저는 일의 등급에 따라 보너스를 계산한다. Else 문 다음의 문은 모든 If 와 ElseIf 문이 False일 때 실행한다. 보기.47 (논리가 두 개 이상인 경우 조건문) 3 4 5 6 7 8 9 0 Function Bonus(performance, salary) If performance = Then Bonus = salary * 0. ElseIf performance = Then Bonus = salary * 0.09 ElseIf performance = 3 Then Bonus = salary * 0.07 Else Bonus = 0 End If End Function.9.5 Select-Case 문 하나의 식을 다른 여러 값과 비교할 때는 If-Then-Else 문의 ElseIf 대신에 SelectCase 문을 사용한다. If-Then-Else 문이 각 ElseIf 문의 다른 식을 나타낼 수 있는 반면, Select-Case 문은 제어 구조의 맨 위에서 식을 한 번만 검토할 수 있다. Select-Case 문의 사용법은 다음과 같다.
Select Case testexpression Case expressionlist 실행문... Case Else 실행문 End Select 위 식에서 인수의 사용은 다음과 같다. testexpression : 반드시 입력해야 하는 값으로 수식이나 문자식 testexpressionlist : Case에 반드시 입력하는 값으로 특정값이나 범위를 지정할 수 있음 다음 보기에서는 Select-Case 문을 사용하여 프로시저에 전달된 인수 performance를 검토한다. Case 문은 각각 값, 값 범위, 비교 연산자와의 조합을 두 개 이상 가질 수 있다. 선택적인 Case-Else 문은 Select Case 문이 어느 Case 문의 값과도 일치하지 않을 때 실행된다. 보기.48 (여러 가지 경우에 대한 조건문) 3 4 5 6 7 8 9 0 Function Bonus(performance, salary) Select Case performance Case Bonus = salary * 0. Case, 3 Bonus = salary * 0.09 Case 4 To 6 Bonus = salary * 0.07 Case Is > 8 Bonus = 00
Case Else Bonus = 0 3 End Select 4 End Function.9.6 With 문 With 문을 이용하면 연속되는 문 전체에서 개체나 사용자 정의 형식을 한 번만 지정할 수 있다. With 문은 프로시저를 빠르게 실행시키고 반복적인 입력을 하지 않도록 한다. With 문 사용법은 다음과 같다. With object 실행문 End With 위 사용법에서 object는 개체의 이름이나 사용자 정의 형식을 사용한다. 다음 보기는 숫자 30으로 셀 범위를 채우고 글꼴 유형을 굵게 하고 셀 내부 색을 노란색으로 설정한다. 보기.49 (개체의 속성값 설정) Sub FormatRange() With Worksheets("Sheet").Range("A:C0") 3.Value = 30 4.Font.Bold = True 5.Interior.Color = RGB(55, 55, 0) 6 7 End With
더 큰 효과를 내기 위해 With 문을 중첩시킬 수 있다. 다음 보기는 셀 A에 수식을 넣고 글꼴을 설정한다. 보기.50 (여러 개체의 속성값 설정) Sub MyInput() With Workbooks("Book").Worksheets("Sheet").Cells(, ) 3.Formula = "=SQRT(50)" 4 With.Font 5.Name = "Arial" 6.Bold = True 7.Size = 8 8 9 0 End With End With 제.0. 절 연산자 연산자는 숫자나 문자의 계산에 사용하는 것으로 그 종류는 다음과 같다..0. 산술 연산자 산술 연산자는 수학적 계산을 수행하는 연산자로 그 종류는 다음과 같다. ^ 연산자 : 어떤 수의 지수승을 구하는 연산자이다. ^ 5는..................................................... 3이다. * 연산자 : 두 수를 곱하는 연산자이다. * 5는..................................................... 0이다. / 연산자 : 두 수를 나누고 부동 소수점을 반환하는 연산자이다. / 5는.....................................................0.4이다.
\ 연산자 : 두 수를 나누고 정수 몫을 반환하는 연산자이다. \ 5는...................................................... 0이다. Mod 연산자 : 두 수를 나누고 나머지를 반환하는 연산자이다. Mod 5는.................................................... 이다. + 연산자 : 두 수의 합을 구하는 연산자이다. + 5는....................................................... 7이다. - 연산자 : 두 수의 차를 구하거나 어떤 수식의 음수를 구하는 연산자이다. - 5는....................................................... -3이다..0. 비교 연산자 비교 연산자는 비교를 수행하는 연산자로 그 종류는 다음과 같다. < : 첫 번째 값이 두 번째 값보다 작으면 TRUE를 되돌려 주고 그렇지 않으면 FALSE를 되돌려 주는 연산자이다. < 5는.................................................. TRUE이다. <= : 첫 번째 값이 두 번째 값보다 작거나 같으면 TRUE를 되돌려 주고 그렇지 않으면 FALSE를 되돌려 주는 연산자이다. <= 5는................................................ TRUE이다. > : 첫 번째 값이 두 번째 값보다 크면 TRUE를 되돌려 주고 그렇지 않 으면 FALSE를 되돌려 주는 연산자이다. > 5는................................................. FALSE이다. > : 첫 번째 값이 두 번째 값보다 크거나 같으면 TRUE를 되돌려 주고 그렇지 않으면 FALSE를 되돌려 주는 연산자이다. >= 5는................................................ FALSE이다. = : 첫 번째 값과 두 번째 값이 같으면 TRUE를 되돌려 주고 그렇지 않 으면 FALSE를 되돌려 주는 연산자이다. = 5는................................................. FALSE이다.
<> : 첫 번째 값과 두 번째 값이 다르면 TRUE를 되돌려 주고 그렇지 않 으면 FALSE를 되돌려 주는 연산자이다. <> 5는................................................ FALSE이다. Like : 두 문자열을 비교하는 연산자이다. 한림 Like 한림 은...................................... FALSE다. Is : 두 개체가 가르키는 변수가 동등한지 비교하는 연산자이다. Range( A ) Is Range( A )는............................. FALSE다..0.3 문자열 연결 연산자 문자열 연결 연산자는 문자열을 조합하는 연산자로 그 종류는 다음과 같다. & : 두 식을 강제로 연결하는 연산자이다. 한림 & 대학교 는.............................. 한림대학교 이다. + : 두 수를 더하는 연산자이다. +5는........................................................ 7이다..0.4 논리 연산자 논리 연산자는 논리적인 작업을 수행하는 연산자로 그 종류는 다음과 같다. And : 수 식의 논리곱을 구하는 연산자이다. 두 식의 논리가 모두 TRUE 면 TRUE 그 이외는 FALSE이다. > 5 And < 5는......................................... FALSE다. Eqv : 두 식이 논리적으로 같은지 비교하는 연산자이다. 두 식의 논리가 모두 같으면 TRUE 다르면 FALSE > Eqv < 는......................................... FALSE다. Imp : 두 식의 논리적 함축성을 구하는 연산자이다. 첫 번째 논리가 TRUE 이고 두 번째 논리가 FALSE인 경우만 FALSE이고 나머지 경우는 모두 TRUE이다. Imp는.................................................... TRUE이다.
Not : 식의 논리적 부정을 구하는 연산자이다. 식의 논리가 FALSE이면 결과는 TRUE이고 TRUE이면 FALSE이다. Not > 5는.............................................. TRUE이다. Or : 두 식의 논리합을 구하는 연산자이다. 두 식의 논리가 모두 FALSE 이면 FALSE 그 이외의 논리는 모두 TRUE이다. > 5 Or < 5는........................................ TRUE이다. Xor : 두 식이 논리적으로 다른지 비교하는 연산자이다. 두 식의 논리가 모두 다르면 TRUE 두 식의 논리가 모두 같으면 FALSE가 된다. > 5 Xor < 5는........................................TRUE이다.
상수 값 보이는 단추 vbokonly 0 확인 단추 vbokcancel 확인, 취소 단추 vbabortretryignore 중단, 다시 시도, 무시 단추 vbyesnocancel 3 예, 아니오, 취소 단추 vbyesno 4 예, 아니오 단추 vbretrycancel 5 다시 시도, 취소 단추 vbcritical 6 중대 메시지 아이콘 vbquestion 3 쿼리 경고 아이콘 vbexclamation 48 메시지 경고 아이콘 vbinformation 64 메시지 정보 아이콘 vbdefaultbutton 0 첫째 단추가 기본값 vbdefaultbutton 56 둘째 단추가 기본값 vbdefaultbutton3 5 세째 단추가 기본값 vbdefaultbutton4 768 넷째 단추가 기본값 vbapplicationmodal 0 응용 프로그램 모달로 사용자가 현재 사용 중인 프로그램 내에 서 계속 작업하려면 반드시 메 시지 상자에 응답 4096 vbsystemmodal 시스템 모달로 사용자가 메시지 상자에 응답할 때까지 모든 프 로그램들은 정지 vbmsgboxhelpbutton 6384 메시지 상자에 도움말 단추 추 가 vbmsgboxsetforeground 65536 메시지 상자 창을 전경 창으로 설정 vbmsgboxright 5488 텍스트를 오른쪽 정렬 vbmsgboxrtlreading 048576 히브리어와 아랍어 시스템에서 오른쪽에서 왼쪽으로 읽을 수 있도록 설정 표.: 인수로 사용하는 버튼의 특성
상수 값 단추 설명 vbok 확인 단추 vbcancel 취소 단추 vbabort 3 중단 단추 vbretry 4 다시 시도 단추 vbignore 5 무시 단추 vbyes 6 예 단추 vbno 7 아니오 단추 표.: 버튼에서 되돌려 주는 값 논리 논리 And OR Eqv Imp Xor TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE FALSE FALSE TRUE FALSE FALSE TRUE FALSE TRUE FALSE TRUE FALSE TRUE TRUE FALSE FALSE FALSE FALSE TRUE TRUE FALSE 표.3: 두 논리값에 대한 논리 연산 결과
제3장 사용자 정의 폼(User Form) 윈도에서 응용 프로그램들은 사용자가 사용하기 편리하도록 대화 상자를 많 이 사용하고 있다. 즉 독립적인 창에 버튼이나 입력란, 메세지 등을 표현할 수 있다. 엑셀에서도 사용자가 독립적인 창에 버튼이나 입력란을 추가할 수 있으 며 버튼을 클릭하거나 입력란에 값을 추가할 때 여러 현상이 일어나게 할 수 있는데 이런 독립적인 창을 사용자 정의 폼(UserForm, 유저폼)이라 부른다. 제 3.. 절 사용자 정의 폼 작성과 실행 사용자 정의 폼을 작성하려면 Visual Basic Editor에서 삽입 사용자 정의 폼 메뉴를 선택한다. 그러면 사용자 정의 폼이 코드 입력 창에 나타나고 속성 창은 서용자 정의 폼에 대한 속성으로 변경된다. 또한 컨트롤 도구상자가 나타나며 여기에 있는 여러 컨트롤들(버튼, 레이블, 텍스트 상자, 옵션 버튼 등)을 사용자 정의 폼에 추가할 수 있다. 이렇게 사용자가 만든 사용자 정의 폼을 다음과 같이 보기 3. (유저 폼 부르기) Sub 유저폼부르기() uf.show 모듈에서 호출할 수 있다. 여기서 사용자 정의 폼에 대한 변수명은 uf로 하였 다. 이 프로시저를 엑셀에서 호출하면 사용자 정의 폼이 엑셀 화면에 나타난다 59
그림 3.: 유저 폼 부르기 (그림 3.). 유저 폼은 만들고 엑셀에서 실행하는 과정을 요약하면 다음과 같다.. Visual Basic Editor에서 삽입 사용자 정의 폼 메뉴를 실행하여 유저 폼을 추가. Visual Basic Editor에서 삽입 모듈 메뉴를 실행하여 모듈을 삽입하고 보기 3.에서와 같이 Shwo 속성을 사용하여 유저 폼을 호출 3. 엑셀에서 모듈에서 작성한 Sub 프로시저를 호출, 즉 제 장에서 소개한 매크로를 호출 사용자 정의 폼에는 여러 가지 속성값이 있으며, 이 값으로 사용자 정의 폼의 형태나 설정 등을 변경할 수 있다. 유저 폼의 속성값은 Visual Basic Editor의 속성 창이나 프로그램 코드 창에서 설정값을 변경할 수 있다. 사용자 정의 폼의 속성값은 있는 것 중 몇 개만 소개한다. (이름) : 유저 폼의 이름을 명명하는 것으로 프로그램언어 표현으로 유저 폼의 변수명을 설정 BackColor : 유저 폼의 뒷 배경색을 설정 Caption : 유저 폼의 제목 표시줄에 삽입할 문자열을 입력 Font : 글자의 크기, 굵기, 종류를 설정 ForeColor : 유저 폼의 앞 배경색을 설정
Height : 유저 폼의 창의 크기에서 세로 길이 ScrollBars : 스크롤 바의 설정 Width : 유저폼의 창의 크기에서 가로 길이 제 3.. 절 컨트롤 도구 상자 사용자 정의 폼에 여러 가지 컨트롤을 추가하여 그 컨트롤에 이벤트 가 발생 하면 적절한 행동을 취할 수 있다. 컨트롤이란 명령 단추, 프레임, 토글 단추, 확인란, 레이블, 텍스트 상자 등이며 이것들을 사용자 정의 폼이나 문서에 추 가하여 사용할 수 있는 것이다. 컨트롤을 사용자 정의 폼에 설치하는 방법은 사용자 정의 폼을 추가하면 도 구상자가 나타나고 여기에서 추가하려는 컨트롤을 마우스로 클릭한 후 사용자 정의 폼에 컨트롤을 추가하려는 영역을 마우스로 설정하면 된다. 컨트롤을 추가한 목적은 이벤트가 발생하였때 어떤 프로시저나 문장 등 프로그램이 실행되는 것이므로 이 과정에 대하여 알아보자. 컨트롤에 이벤트 발생시 프로그램이 실행되도록 하려면 사용자 정의 폼에서 추가된 컨트롤을 더블 클릭하면 코드 창에 이벤트가 발생하였을 때 실행되는 프로시저가 나타 난다. 이 프로시저 안에 프로그램을 삽입하면 해당 이벤트가 발생하였을 때 프로그램이 실행된다. 사용자 정의 폼에 추가할 수 있는 컨트롤들은 레이블(Label) : 문자가 입력할 수 있는 컨트롤 텍스트 상자(TextBox) : 문자를 입력받아서 변수나 그 값을 되돌려 줄 수 있는 컨트롤 콤보 상자(ComboBox) : 여러 리스트를 추가하고 드랍 다운하여 리스트의 목록을 선택할 수 있는 컨트롤 목록 상자(ListBox) : 여러 리스트를 추가하여 목록을 선택할 수 있는 콘 트롤 버튼을 클릭하거나, 마우스를 움직이거나, 키보드를 입력하는 것을 말한다.
확인란(CheckBox) : 여러 체크 박스를 추가하고 다중 선택할 수 있는 콘트롤 옵션 단추(OptionButton) : 라디오 버튼을 추가하는 컨트롤 토글 단추(ToggleButton) : 버튼을 추가하는 컨트롤 프레임(Frame) : 이 컨트롤에 여러 콘트롤들 추가하여 그룹화할 수 있는 콘트롤 명령 단추(CommandButton) : 일반적인 버튼에 대한 컨트롤 연속탭(TabStrip) : 여러 가지 탭을 입력할 수 있는 컨트롤 다중 페이지(MultiPage) : 여러 페이지를 추가할 수 있는 콘트롤 스크롤 막대(ScrollBar) : 스크롤 바를 입력할 수 있는 컨트롤 스핀 단추(SpinButton) : 위 또는 아래로 이동할 수 있는 컨트롤 이미지(Image) : 그림을 입력할 수 있는 컨트롤 RefEdit : 셀을 선택하는 기능이 있는 컨트롤 이 있다. 이 컨트롤들은 그림 3.에서 보는 것처럼 컨트롤 도구 상자에서 추가할 수 있다. 제 3.3. 절 사용자 정의 폼으로 응용프로그램 만들기 사용자 정의 폼으로 몇 가지 응용프로그램을 만들어보자. 숫자를 입력할 수 있는 텍스트 상자를 만들고 입력된 값이 홀수인지 짝수인지 구분하여 셀에 출력하는 프로그램을 만들어 보자.. 사용자 정의 폼을 만들고 이름을 uf로 한다.. 유저 폼에 텍스트 상자를 입력하고 tf로 한다.
그림 3.: 컨트롤 도구 상자 3. 명령 단추를 만들고 이름을 cb로 하고 명령 단추에 계산하기의 텍스트를 삽입한다. 4. 명령 단추를 클릭하여 다음 코드를 삽입한다. Private Sub cb_click() If (tb.value Mod = 0) Then Range("A") = tb.value & "은(는) 짝수" Else Range("A") = tb.value & "은(는) 홀수" End If 5. 모듈을 삽입하고 유저 폼을 호출하는 코드를 삽입한다. Sub 홀짝판별() uf.show 6. 엑셀에서 개발도구 컨트롤 삽입 단추를 클릭하여 모듈에 삽입한 매크로를 지정한다.
00년 월드컵 축구에서 8강에 진출했던 8개 팀이 승률이 모두 같다고 가정하 고 어떤 팀이 우승할지 프로그램을 만들어 보자. 우선 사용자 정의 폼을 추가한 후 8강에 진출한 8개 팀을 8개 레이블로 유저 폼에 추가한다. 8강에 진출했던 팀은 미국, 독일, 스페인, 한국, 브라질, 잉글랜드, 터키, 세네갈이다. 8강에서 4 강으로 진출할 팀을 결정하게 될 명령 단추를 추하가고, 이 단추를 클릭하였을 때 어떤 팀이 승리할지 코드를 삽입하자. 이 과정은 4강전과 결승전에서도 동일 하게 작성한다. 그리고 이 과정을 다시 할 수 있도록 명령 단추를 만든다(그림 3.3). 이제 명령 단추를 클릭하였을 경우, 각 시합에서 이기는 팀이 결정되는 그림 3.3: 유저 폼 부르기 프로그램을 다음과 같이 작성한다. 보기 3. (컨트롤에 코드 삽입) Private Sub cb_click() If Rnd > 0.5 Then Range("A" & ) = l.caption
Else Range("A" & ) = l.caption End If If Rnd > 0.5 Then Range("A" & ) = l3.caption Else Range("A" & ) = l4.caption End If If Rnd > 0.5 Then Range("A" & 3) = l5.caption Else Range("A" & 3) = l6.caption End If If Rnd > 0.5 Then Range("A" & 4) = l7.caption Else Range("A" & 4) = l8.caption End If uf.cb.visible = False 이 프로그램을 작성하기 전에 그림 3.3의 유저 폼에 추가한 각 컨트롤 중 8강 전에 진출한 각 팀을 레이블에 추가하였으며 그 이름을 l에서 l8로 입력하고, 8 강전 명령 버튼의 이름을 cb, 유저 폼의 이름은 uf로 한다. 8강전 명령 버튼을 클릭한 후 위의 코드를 입력한다. 8강에서 승리팀의 결정은 Rnd 함수로 0에서 사이의 난수를 발생하여 0.5보다 크면 어느 팀이 승리하고, 그렇지 않으면 상대 팀이 승리하는 방법을 사용하였다. 코드에서 사용한 l.caption에서 l8.caption 은 8강전에 진출한 팀을 차례로 호출한 것이다. 8 강전을 종료하였을 경우는 다
시 경기를 할 필요가 없기 때문에 이 버튼을 사용하지 못하도록 uf.cb.visible = False 명령을 삽입하여 보이지 않도록 설정한다. 각 경기에서 승리한 팀은 Range 객체를 사용하여 셀에 결과가 나타나도록 하였다. 8강전 경기를 다시 한 번 실행하려면 모든 버튼이 보이게 해야 되므로 다시 한번 명령 버튼에 다음과 같은 코드를 삽입한다. 보기 3.3 (컨트롤에 코드 삽입) Private Sub cb4_click() cb.visible = True 8강전 버튼 cb.visible = True 4강전 버튼 cb3.visible = True 결승전 버튼