VBA 기능이 내장되어 있습니다. VBA 엑셀. 사용자 정의 기능(구문, 구성요소). 여러 인수를 사용하여 VBA에서 함수 만들기

VBA로 작성된 함수는 계산을 수행하고 값(또는 값의 배열)을 반환하는 코드입니다. 함수를 생성하면 다음 세 가지 방법으로 사용할 수 있습니다.

  1. 인수를 취하고 값을 반환할 수 있는 워크시트의 수식으로 사용됩니다.
  2. VBA 루틴의 일부로. Sub 프로시저 또는 다른 함수 내부.
  3. 조건부 서식 규칙에서.

Excel에는 이미 450개 이상의 기본 제공 함수가 포함되어 있지만 때로는 부족한 경우도 있습니다. 때로는 내장 함수가 원하는 작업을 수행하지 못할 수도 있습니다. 때로는 결과를 얻기 위해 다른 사람이 이해할 수 없는 거대하고 복잡한 공식을 만들어야 할 때도 있습니다. 이 경우 읽기 쉽고 사용하기 쉬운 사용자 정의 함수를 만들 수 있습니다.

VBA로 만든 사용자 정의 함수는 일반적으로 기본 제공 함수보다 훨씬 느립니다. 따라서 내장 함수를 사용하여 결과를 얻을 수 없거나 계산량이 많지 않고 성능 저하가 중요하지 않은 상황에 가장 적합합니다.

귀하뿐만 아니라 귀하의 동료도 내장된 기능을 사용할 수 있습니다. 작성한 함수는 함수 마법사 대화 상자에서 다른 함수와 함께 표시됩니다. 함수를 만드는 과정이 겁이 나실 수도 있지만 매우 간단하다는 점을 서둘러 말씀드립니다.

프로시저(Sub)와 함수(Function)의 차이점은 무엇인가요?

주요 차이점은 프로시저(sub)가 일련의 명령을 실행하는 데 사용되며 함수(함수)와 달리 값(또는 값 배열)을 반환하도록 의도되지 않았다는 것입니다.

설명하기 위해 예를 들어 보겠습니다. 예를 들어, 1부터 100까지 일련의 숫자가 있고 짝수와 홀수를 구분해야 합니다.

예를 들어 (하위) 절차를 사용하면 셀을 탐색하고 채우기를 사용하여 이상한 셀을 강조 표시할 수 있습니다. 그리고 이 함수는 인접한 열에서 사용될 수 있으며 값이 짝수인지 아닌지에 따라 TRUE 또는 FALSE를 반환합니다. 저것들. 워크시트의 함수를 사용하여 채우기 색상을 변경할 수 없습니다.

VBA에서 간단한 사용자 정의 함수 만들기

VBA에서 간단한 사용자 정의 함수를 만들고 이것이 어떻게 작동하는지 살펴보겠습니다.

다음은 문자 값을 버리고 텍스트에서 숫자만 남기는 함수에 대한 코드입니다.

함수 번호(Text As String) As Long Dim i As Long Dim result As String For i = 1 To Len(Text) If IsNumeric(Mid(Text, i, 1)) Then result = result & Mid(Text, i, 1 ) 다음 숫자 = CLng(result) End Function

모든 것이 제대로 작동하려면 다음을 삽입해야 합니다. 이 코드책 모듈에 들어갑니다. 이 작업을 수행하는 방법을 모르는 경우 Excel에서 매크로를 기록하는 방법 문서부터 시작하세요.

이제 함수가 어떻게 작동하는지 살펴보겠습니다. 시트에서 사용해 보겠습니다.

함수 자체를 분석하기 전에, 생성 후 나타난 즐거운 순간 2가지를 살펴보겠습니다.

  • 다른 내장 함수처럼 사용할 수 있게 되었습니다(생성 방법 숨겨진 기능, 우리는 더 자세히 말할 것입니다).
  • "=" 기호를 입력하고 함수 이름을 입력하기 시작하면 Excel에서 일치하는 모든 항목을 표시하고 기본 제공 함수뿐만 아니라 사용자 지정 함수도 표시합니다.

기능을 단계별로 분석해보자

이제 자세히 알아보고 이 기능이 어떻게 생성되었는지 살펴보겠습니다. 함수는 다음 줄로 시작합니다.

함수 번호(문자열로 된 텍스트)

단어 기능우리의 경우에는 함수의 시작과 그 이름이 뒤따르는 것을 말합니다. 숫자.

  • 함수 이름에는 공백이 포함될 수 없습니다. 또한 셀 참조 이름과 충돌하는 경우 함수를 호출할 수 없습니다. 예를 들어 함수 이름을 ABC123으로 지정할 수 없습니다. 해당 이름은 Excel 워크시트의 셀도 참조하기 때문입니다.
  • 함수에 기존 함수와 동일한 이름을 지정하면 안 됩니다. 이렇게 하면 Excel에서 기본 제공 기능을 우선적으로 사용하게 됩니다.
  • 단어를 구분하려면 밑줄 문자를 사용하면 됩니다. 예를 들어, 수마(Suma)유효한 이름입니다.

이름 뒤에는 함수 인수가 괄호 안에 설명되어 있습니다. 내장과 유사 엑셀 기능. 우리의 경우 사용된 유일한 인수는 다음과 같습니다. 텍스트. 우리가 표시한 인수 이름 뒤에 문자열로, 이는 우리의 주장이 다음과 같다는 것을 의미합니다. 텍스트 값또는 텍스트 값이 포함된 셀에 대한 참조입니다. 데이터 유형을 지정하지 않으면 VBA는 이를 다음과 같이 처리합니다. 변종(즉, 모든 데이터 유형을 사용할 수 있으며 VBA가 이를 알아냅니다.)

첫 번째 줄의 마지막 부분 오랫동안함수가 반환하는 데이터 유형을 지정합니다. 우리의 경우 함수는 정수 값을 반환합니다. 이것도 필요하지 않습니다.

함수의 두 번째와 세 번째 줄은 우리가 사용할 추가 내부 변수를 선언합니다.

Dim i As Long Dim 결과를 문자열로

변하기 쉬운 우리는 그것을 문자를 열거하는 데 사용할 것입니다. 변수 결과함수의 중간 결과를 저장합니다.

함수의 작업은 Text 변수의 모든 문자를 살펴보고 숫자인 문자만 저장하는 것입니다. 따라서 1부터 마지막 ​​문자까지 루프를 시작합니다.

i = 1에서 Len(텍스트)까지

Len은 문자 수를 결정하는 함수입니다.

함수의 주요 라인은 텍스트의 다음 문자가 숫자인지 확인하고 숫자인 경우 결과 변수에 저장하는 것입니다.

IsNumeric(Mid(Text, i, 1))이면 결과 = result & Mid(Text, i, 1)

이를 위해서는 함수가 필요합니다. 숫자임- 그녀가 돌아왔다 진실텍스트가 숫자이고 거짓그렇지 않으면.

기능 중간 Text 인수에서 가져옵니다. 번째 문자(의미 1 , 기능을 나타냅니다 중간 1자만 사용 가능)/

기능 다음- 루프를 닫습니다 을 위한여기서 모든 것이 명확합니다.

숫자 = CLng(결과)

이 줄을 사용하여 텍스트 변수를 변환합니다. 결과, 인수의 모든 숫자를 포함합니다. 텍스트, V 숫자 값. 그리고 우리 함수가 어떤 결과를 출력해야 하는지 말합니다. 숫자.

코드의 마지막 줄은 기능 종료. 이는 함수 코드가 여기서 끝난다는 것을 VBA에 알려주는 필수 코드 줄입니다.

위 코드는 VBA에서 생성된 일반적인 사용자 정의 함수의 다양한 부분을 설명합니다. 향후 기사에서는 이러한 요소를 더 자세히 살펴보고 다음 내용도 살펴볼 것입니다. 다양한 방법실행 VBA 함수엑셀에서.

Dim nResult를 정수로 표시

nMult1 = CInt(InputBox("첫 번째 숫자를 입력하세요: ")) nMult2 = CInt(InputBox("두 번째 숫자를 입력하세요: ")) nResult = fMultiply(nMult1, nMult2)

Selection.InsertAfter nResult Selection.Collapse wdCollapseEnd

4. 코드를 주석 처리하려면 AutoNew() 를 사용하여 이 프로시저에 대한 모든 코드(Public Sub AutoNew() 및 End Sub 포함)를 강조 표시하고 편집 도구 모음에서 주석 블록 버튼을 클릭합니다.

3.9. 내장 VBA 언어 기능

3.9.1. 내장 함수란 무엇입니까?

안에 VBA 프로그래밍 언어는 수십 가지를 제공합니다.내장 기능. VBA 언어로 된 모든 프로그램에서 사용할 수 있으며 Excel, Word, Access 또는 AutoCAD 등 어떤 소프트웨어 제품을 사용하고 있는지는 중요하지 않습니다. 그들은 매우 적극적으로 사용되며 많은 상황에서 그것 없이는 할 수 없습니다. 전문 프로그래머는 이 기능을 완전히 자동으로 사용하지만 일반 사용자에게는 이 기능을 익히는 데 몇 시간을 투자하라고 조언합니다. 이러한 기능에 대한 지식이 없으면 VBA에서 효과적으로 작업할 수 없기 때문입니다. 그것들을 연구하는 데 유리한 추가 주장은 거의 동일한 기능 세트가 일반적인 함수에서 발견된다는 것입니다. 비주얼 베이직 VBScript 및 동일한 이름과 구문을 가진 이러한 함수 중 상당수는 C++, Delphi, Java, JavaScript 등 다른 프로그래밍 언어에서 찾을 수 있습니다.

안에 VBA 도움말에서 기본 제공 기능은 문자별로 그룹화되어 있습니다(그림 3.2).

코스에 참여한 많은 참가자들이 러시아어로 이러한 기능에 대한 도움이 있습니까?라는 질문을 했습니다. 아쉽게도 그러한 인증서를 찾을 수 없어서 제공하려고 합니다. 간략한 정보이 책에서. 다음으로 우리는 VBA 언어에서 활발히 사용되는 대부분의 함수(코사인이나 탄젠트와 같은 수학 함수)에 대해 이야기하겠습니다. 실무거의 사용되지 않으므로 재무 기능은 고려하지 않습니다). 공간을 절약하기 위해 함수의 전체 구문은 제공되지 않습니다. 가장 중요한 것은 각 함수의 기능과 사용할 수 있는 상황을 이해하는 것입니다.

다음 섹션의 기능은 기능별로 그룹화되어 있습니다. 단순히 함수 이름만으로 정보를 찾아야 한다면 책 마지막에 있는 색인을 활용하면 됩니다.

쌀. 3.2. 내장 기능 도움말

3.9.2. 변환 및 데이터 유형 확인 기능

VBA 프로그램에서는 값을 한 데이터 유형에서 다른 데이터 유형으로 변환하는 것이 매우 일반적입니다. 이 작업을 수행해야 하는 몇 가지 일반적인 상황은 다음과 같습니다.

InputBox() 를 통해 사용자로부터 값을 받을 때 문자열 값을 숫자 값으로 변환합니다.

사용자 컴퓨터의 지역 설정에 관계없이 날짜 또는 시간을 일관되게 표시해야 하는 경우 날짜/시간 값을 문자열 값으로 변환합니다.

특수 날짜/시간 함수를 사용하기 위해 문자열의 값을 날짜/시간으로 변환합니다.

대부분의 경우 데이터 유형을 변환하기 위해 이름이 접두사 "C"(Convert라는 단어에서 유래)와 데이터 유형 이름으로 구성된 함수가 사용됩니다. 이러한 함수 목록은 다음과 같습니다: CBool(), CByte(), CCur(), CDate(),

CDbl(), CDec(), CInt(), CLng(), CSng(), CStr(), CVar(), CVDate(), CVErr().

사용된 데이터 유형의 이름을 반환하는 TypeName() 함수를 사용하면 결국 무슨 일이 일어났는지 확인할 수 있습니다. 예를 들면 다음과 같습니다.

nVar1 = CInt(InputBox("값을 입력하세요")) MsgBox TypeName(nVar1)

이 경우 이 함수는 "Integer" 를 반환합니다.

또한 변환에 유용한 몇 가지 다른 기능이 있습니다.

Str() - 숫자 값을 문자열로 변환할 수 있습니다. CStr()과 거의 동일한 작업을 수행하지만 양수 앞에 공백을 삽입합니다.

Val() - 숫자와 문자의 혼합에서 숫자 값만 "꺼냅니다". 이 경우 함수는 데이터를 왼쪽에서 오른쪽으로 읽고 숫자가 아닌 첫 번째 값에서 중지합니다(허용되는 유일한 숫자가 아닌 값은 정수 부분과 소수 부분을 구분하는 점입니다). 수치 데이터와 함께 측정 단위나 통화를 적어둘 때 매우 편리합니다.

IsNumeric() 및 IsDate() - 변환 중에 오류가 없도록 값의 일관성을 확인합니다. 특수 값을 준수하는지 확인하려면 IsArray(), IsEmpty(),

IsError(), IsMissing(), IsNull() 및 IsObject() . 이 모든 함수는 반환됩니다.

전달된 값을 확인한 결과에 따라 True 또는 False가 됩니다.

Hex() 및 Oct() - 10진수 데이터를 16진수 및 8진수 값의 문자열 표현으로 변환합니다.

3.9.3. 문자열 함수

가장 일반적으로 사용되는 기능들입니다. 그것들은 끊임없이 필요하며, 여러분은 그것들을 아주 잘 알아야 합니다.

Asc() - 이 함수를 사용하면 전달된 문자에 대한 숫자 코드를 반환할 수 있습니다. 예를 들어 Asc("D")는 68을 반환합니다. 이 함수는 다음 또는 이전 문자를 결정하는 데 유용합니다. 일반적으로 역연산을 수행하는 Chr() 함수와 함께 사용됩니다. 숫자 코드에 따라 문자를 반환합니다. 예를 들어 Excel의 다음 코드를 사용하면 셀 A1부터 A20까지 러시아어 알파벳 문자를 A부터 U까지 순차적으로 쓸 수 있습니다.

Dim n, nCharCode As Integer n = 1

nCharCode = Asc("A") n 동안 수행<= 20

ActiveWorkbook.ActiveSheet.Range("A" & n).Value = Chr(nCharCode)

VBA 구문 및 프로그래밍 구성

nCharCode = nCharCode + 1 루프

이 함수의 변형은 AscB() 및 AscW() 입니다. AscB()는 문자에 대한 숫자 코드의 첫 번째 바이트만 반환하는 반면 AscW()는 문자에 대한 유니코드 코드를 반환합니다.

Chr() - 숫자 코드로 문자를 반환합니다. Asc() 함수(이전 예제 참조)와 함께 사용되는 것 외에도 한 가지 상황, 즉 서비스 문자를 출력해야 하는 경우 이 함수 없이는 할 수 없습니다. 예를 들어 Word에 "Gazprom"(따옴표로 묶음) 값을 입력해야 합니다. 인용문은 서비스 문자이며 다음과 같은 문자열을 사용하려는 시도입니다.

Selection.Text = ""가즈프롬""

구문 오류가 발생합니다. 그러면 모든 것이 잘 될 것입니다.

Selection.Text = Chr(34) & "Gazprom" & Chr(34)

이 함수에는 ChrB() 및 ChrW()라는 변형이 있습니다. Asc() 함수의 동일한 옵션과 유사하게 작동합니다.

InStr() 및 InStrRev()는 가장 널리 사용되는 함수 중 일부입니다. 문자열 변수 본문에서 일련의 문자를 감지하고 해당 위치를 반환할 수 있습니다. 시퀀스가 발견되지 않으면 0이 반환됩니다. InStr() 함수는 문자열의 처음부터 검색하고 InStrRev()는 끝부터 검색합니다.

Left() , Right() , Mid() - 각각 왼쪽, 오른쪽 또는 가운데에 있는 기존 문자열 변수에서 지정하는 문자 수를 가져올 수 있습니다.

Len() - 문자열의 문자 수(문자열 길이)를 반환합니다. 종종 루프, 교체 작업 등과 함께 사용됩니다.

LCase() 및 UCase() - 문자열을 각각 소문자 및 대문자로 변환합니다. 대소문자가 중요하지 않은 경우(성, 회사명, 도시 등) 비교를 위한 값을 준비하는 데 자주 사용됩니다.

LSet() 및 RSet() - 길이(각각 왼쪽과 오른쪽)를 변경하지 않고 한 변수를 다른 변수의 기호로 채웁니다. 추가 문자는 잘리고 누락된 문자는 공백으로 대체됩니다.

LTrim() , RTrim() , Trim() - 각각 왼쪽, 오른쪽 또는 왼쪽과 오른쪽 모두에서 공백을 제거합니다.

바꾸기() - 문자열의 한 문자 시퀀스를 다른 문자 시퀀스로 바꿉니다.

Space() 및 String() - 각각 지정한 공백 또는 문자 수의 문자열을 반환합니다. 일반적으로 형성하는 데 사용됩니다.

함수 절차결과를 반환하는 특별한 유형의 VBA 프로시저입니다. VBA 기본 제공 함수와 같은 사용자 정의 프로시저 함수에는 선택적 인수와 명명된 인수가 있을 수 있습니다. 매크로 레코더를 사용하여 프로시저 기능을 기록할 수는 없지만 레코더에 의해 기록된 매크로를 편집하여 프로시저 기능으로 전환할 수는 있습니다.

프로시저 함수와 다른 프로시저의 주요 차이점은 함수가 값을 반환하고 프로시저가 값을 반환하지 않는다는 사실 외에 프로시저 함수는 키워드를 사용한다는 것입니다. 기능그리고 기능 종료.

통사론:

함수명()
"VBA 문
기능 종료

함수는 함수의 시작을 선언하는 키워드입니다.

이름 - 함수 이름입니다. 함수 이름은 다른 VBA 식별자 이름과 동일한 규칙을 따릅니다.

Arglist - 이 함수에 대한 인수 목록, 선택적 요소입니다.

유형 - 모든 유형의 함수 반환 값입니다. 유형이 정의되지 않은 경우 프로시저 함수에서 반환된 결과는 Variant 유형입니다.

이름 = 표현식은 VBA에게 함수가 반환해야 하는 값, 즉 선택적 요소를 알려주는 함수 할당입니다. 그러나 프로시저 함수에는 항상 대입 연산자를 포함해야 합니다.

함수 종료 - 함수를 종료하는 키워드입니다.


함수에 인수(예: Now, Date)가 없더라도 함수 선언에는 괄호를 사용해야 합니다.

일반적으로 함수는 계산을 수행하고 결과를 반환하도록 설계되었습니다. 프로시저 함수를 선언할 때 함수에 전달되는 각 인수의 이름을 지정합니다. 목록의 인수 이름은 쉼표로 구분되며 모든 VBA 식별자에 적용되는 규칙을 따라야 합니다.


다음은 선행 및 후행 공백을 제거하고 표현식의 문자 수를 계산하는 간단한 프로시저 함수의 사용 목록입니다.



이 기능을 사용하지 않으면 목록은 다음과 같습니다.



이 간단한 예에서 프로시저 함수를 사용하는 주요 아이디어는 프로그램 코드의 가독성을 높이고 이를 줄이는 것입니다(즉, 동일한 코드 "조각"이 2개 이상 발생할 때 프로시저 함수가 작성된다는 것입니다). -프로그램 코드에서 3번). 실제로, 우리의 프로시저 함수가 한 줄이 아니라 10줄로 구성되어 있다면; 프로그램 코드는 이 프로시저 함수를 5번 사용하고 전체 프로그램 목록은 38줄 더 짧아집니다.


앞에서 설명한 것처럼 VBA는 모든 인수를 Variant 유형으로 함수 프로시저에 전달합니다. 인수 목록의 각 인수에 대해 특정 데이터 유형을 선언할 수 있습니다.

자신만의 VBA 함수를 만들기 전에 Excel VBA에는 코드를 작성할 때 사용할 수 있는 사전 구축된 내장 함수 모음이 많이 있다는 것을 아는 것이 도움이 됩니다.

이러한 기능 목록은 VBA 편집기에서 볼 수 있습니다.

  • Excel 통합 문서를 열고 VBA 편집기를 시작합니다(여기를 클릭하세요). Alt+F11)를 클릭한 다음 F2.
  • 화면 왼쪽 상단의 드롭다운 목록에서 라이브러리를 선택하세요. VBA.
  • 내장된 VBA 클래스 및 함수 목록이 나타납니다. 함수 이름을 클릭하면 창 하단에 간략한 설명이 표시됩니다. 누르기 F1해당 기능에 대한 온라인 도움말 페이지가 열립니다.

또한 예제가 포함된 기본 제공 VBA 함수의 전체 목록은 Visual Basic 개발자 센터 웹 사이트에서 찾을 수 있습니다.

VBA의 사용자 정의 함수 및 하위 프로시저

Excel Visual Basic에서는 특정 작업을 수행하는 명령 집합이 프로시저에 배치됩니다. 기능(기능) 또는 보결(서브루틴). 절차의 주요 차이점 기능그리고 보결그게 절차야? 기능결과, 프로시저를 반환합니다. 보결- 아니요.

따라서 작업을 수행하고 결과(예: 여러 숫자의 합)를 얻어야 하는 경우 일반적으로 이 절차가 사용됩니다. 기능, 단순히 일부 작업(예: 셀 그룹의 서식 변경)을 수행하려면 절차를 선택해야 합니다. 보결.

인수

인수를 사용하여 다양한 데이터를 VBA 프로시저에 전달할 수 있습니다. 인수 목록은 프로시저가 선언될 때 지정됩니다. 예를 들어, 절차 보결 VBA에서는 선택한 범위의 각 셀에 지정된 정수(Integer)를 추가합니다. 다음과 같이 인수를 사용하여 이 번호를 프로시저에 전달할 수 있습니다.

Sub AddToCells(i As Integer) ... End Sub

절차에 대한 논쟁이 있다는 점에 유의하십시오. 기능그리고 보결 VBA에서는 선택 사항입니다. 일부 프로시저에는 인수가 필요하지 않습니다.

선택적 인수

VBA 프로시저에는 선택적 인수가 있을 수 있습니다. 이는 사용자가 원할 경우 지정할 수 있는 인수이며, 생략할 경우 프로시저에서는 해당 인수에 대한 기본값을 사용합니다.

이전 예제로 돌아가서 함수에 대한 정수 인수를 선택 사항으로 만들려면 다음과 같이 선언합니다.

하위 AddToCells(선택적 i As Integer = 0)

이 경우 정수 인수는 기본값은 0입니다.

프로시저에는 여러 개의 선택적 인수가 있을 수 있으며 모두 인수 목록 끝에 나열됩니다.

값 및 참조로 인수 전달

VBA의 인수는 두 가지 방법으로 프로시저에 전달될 수 있습니다.

  • 바이발– 값으로 인수를 전달합니다. 즉, 값(즉, 인수의 복사본)만 프로시저에 전달되므로 프로시저 내부의 인수에 대한 변경 사항은 종료 시 손실됩니다.
  • ByRef– 참조로 인수를 전달합니다. 즉, 프로시저는 메모리에 있는 인수의 실제 주소를 전달받습니다. 프로시저 내 인수에 대한 변경 사항은 프로시저가 종료될 때 저장됩니다.

키워드 사용 바이발또는 ByRef프로시저 선언에서 인수가 프로시저에 전달되는 방법을 정확하게 지정할 수 있습니다. 아래에 예시가 나와 있습니다.

VBA의 인수는 기본적으로 참조로 전달된다는 점을 기억하세요. 즉, 키워드를 사용하지 않는 경우 바이발또는 ByRef이면 인수는 참조로 전달됩니다.

절차를 계속 배우기 전에 기능그리고 보결좀 더 자세하게, 이 두 가지 절차 유형의 특징과 차이점을 다시 살펴보는 것이 도움이 될 것입니다. 다음은 VBA 절차에 대한 간략한 설명입니다. 기능그리고 보결그리고 간단한 예시가 나와있습니다.

VBA 절차 "함수"

VBA 편집기는 절차를 인식합니다. 기능

기능...기능 종료

앞서 말씀드린대로 절차는 기능 VBA에서는 (반대로 보결), 값을 반환합니다. 반환 값에는 다음 규칙이 적용됩니다.

  • 반환 값의 데이터 유형은 프로시저 헤더에 선언되어야 합니다. 기능.
  • 반환 값을 포함하는 변수는 프로시저와 동일한 이름을 지정해야 합니다. 기능. 이 변수는 항상 프로시저의 필수 부분으로 존재하므로 별도로 선언할 필요가 없습니다. 기능.

이는 다음 예에서 완벽하게 설명됩니다.

VBA 프로시저 "함수"의 예: 숫자 3개를 사용하여 수학 연산 수행

다음은 VBA 프로시저 코드의 예입니다. 기능, 세 가지 유형의 인수를 사용합니다. 더블(이중 정밀도 부동 소수점 숫자). 결과적으로 프로시저는 다음 유형의 다른 숫자를 반환합니다. 더블, 처음 두 인수의 합에서 세 번째 인수를 뺀 값과 같습니다.

함수 SumMinus(dNum1 As Double, dNum2 As Double, dNum3 As Double) As Double SumMinus = dNum1 + dNum2 - dNum3 End Function

이것은 매우 간단한 VBA 절차입니다. 기능인수를 통해 데이터가 프로시저에 전달되는 방법을 보여줍니다. 프로시저가 반환한 데이터 유형은 다음과 같이 정의되어 있음을 알 수 있습니다. 더블(말은 이렇게 말해요 더블로인수 목록 뒤에). 이 예는 또한 절차의 결과가 어떻게 나타나는지 보여줍니다. 기능프로시저 이름과 동일한 이름의 변수에 저장됩니다.

VBA 프로시저 "함수" 호출

위에서 설명한 간단한 절차를 따르면 기능 Visual Basic 편집기의 모듈에 삽입하면 다른 VBA 프로시저에서 호출하거나 Excel 통합 문서의 워크시트에서 사용할 수 있습니다.

다른 프로시저에서 VBA 프로시저 "Function" 호출

절차 기능이 프로시저를 변수에 할당하기만 하면 다른 VBA 프로시저에서 호출할 수 있습니다. 다음 예에서는 프로시저에 대한 호출을 보여줍니다. 합계 마이너스, 위에서 정의한 것입니다.

Sub main() Dim total as Double total = SumMinus(5, 4, 3) End Sub

워크시트에서 VBA 프로시저 "함수" 호출

VBA 절차 기능다른 기본 제공 Excel 함수와 동일한 방식으로 Excel 워크시트에서 호출할 수 있습니다. 따라서 이전 예에서 생성된 프로시저는 기능합계 마이너스워크시트 셀에 다음 표현식을 입력하여 호출할 수 있습니다.

합 빼기(10, 5, 2)

VBA 프로시저 "하위"

VBA 편집자는 자신 앞에 절차가 있다는 것을 이해합니다. 보결, 다음 열기 및 닫기 명령문 사이에 포함된 명령 그룹을 발견하는 경우:

하위...끝 하위

VBA 절차 "Sub": 예 1. 선택한 셀 범위에서 가운데 ​​정렬 및 글꼴 크기 변경

간단한 VBA 절차의 예를 살펴보겠습니다. 보결, 그 작업은 선택한 셀 범위의 서식을 변경하는 것입니다. 셀은 가운데 정렬(수직 및 수평 모두)로 설정되고 글꼴 크기는 사용자가 지정한 크기로 변경됩니다.

Sub Format_Centered_And_Sized(선택적 iFontSize As Integer = 10) Selection.HorizontalAlignment = xlCenter Selection.VerticalAlignment = xlCenter Selection.Font.Size = iFontSize End Sub

이 절차 보결작업을 수행하지만 결과를 반환하지 않습니다.

이 예에서는 선택적 인수도 사용합니다. iFont크기. 인수의 경우 iFont크기절차에 전달되지 않음 보결이면 기본값은 10으로 간주됩니다. 그러나 인수가 iFont크기절차로 넘어갔습니다 보결을 선택하면 사용자가 지정한 글꼴 크기가 선택한 셀 범위에 설정됩니다.

VBA 절차 "하위": 예 2. 가운데 정렬 및 선택한 셀 범위의 글꼴에 굵게 적용

다음 절차는 방금 논의한 절차와 유사하지만 이번에는 크기를 변경하는 대신 선택한 셀 범위에 굵은 글꼴 스타일을 적용합니다. 이는 예시 절차입니다. 보결, 인수가 전달되지 않습니다.

Sub Format_Centered_And_Bold() Selection.HorizontalAlignment = xlCenter Selection.VerticalAlignment = xlCenter Selection.Font.Bold = True End Sub

Excel VBA에서 "Sub" 프로시저 호출

다른 프로시저에서 VBA 프로시저 "Sub" 호출

VBA 프로시저를 호출하려면 보결다른 VBA 절차에서 키워드를 적어야 합니다. 부르다, 프로시저 이름 보결그런 다음 괄호 안에 프로시저의 인수가 표시됩니다. 이는 아래 예에 나와 있습니다.

하위 main() 호출 형식_Centered_And_Sized(20) End Sub

절차를 밟으면 형식_중앙_및_크기인수가 두 개 이상인 경우 쉼표로 구분해야 합니다. 이와 같이:

하위 main() 호출 Format_Centered_And_Sized(arg1, arg2, ...) End Sub

워크시트에서 VBA 프로시저 "Sub" 호출

절차 보결프로시저를 사용하여 수행할 수 있는 것처럼 Excel 워크시트 셀에 직접 입력할 수 없습니다. 기능, 왜냐하면 절차가 보결값을 반환하지 않습니다. 그러나 절차는 보결, 인수가 없으며 다음과 같이 선언됩니다. 공공의(나중에 설명됨)은 워크시트 사용자가 사용할 수 있습니다. 따라서 위에서 설명한 간단한 절차를 따르면 보결 Visual Basic 편집기의 모듈에 삽입한 다음 프로시저를 형식_중앙_및_굵게 Excel 워크시트에서 사용할 수 있으며 절차는 다음과 같습니다. 형식_중앙_및_크기– 인수가 있으므로 사용할 수 없습니다.

프로시저를 실행(또는 실행)하는 간단한 방법은 다음과 같습니다. 보결, 워크시트에서 사용 가능:

  • 딸깍 하는 소리 Alt+F8(키를 누르세요 Alt그리고 누른 상태에서 키를 누르면 F8).
  • 나타나는 매크로 목록에서 실행하려는 매크로를 선택합니다.
  • 딸깍 하는 소리 실행하다(달리다)

절차를 수행하려면 보결빠르고 쉽게 키 조합을 할당할 수 있습니다. 이를 위해:

  • 딸깍 하는 소리 Alt+F8.
  • 나타나는 매크로 목록에서 키보드 단축키를 할당할 매크로를 선택하세요.
  • 딸깍 하는 소리 옵션(옵션)을 클릭하고 나타나는 대화 상자에 키보드 단축키를 입력하세요.
  • 딸깍 하는 소리 좋아요그리고 대화상자를 닫으세요 매크로(매크로).

주목:매크로에 키보드 단축키를 할당할 때 Excel의 표준 단축키처럼 사용되지 않도록 주의하세요(예: Ctrl+C). 기존 키보드 단축키를 선택하면 해당 단축키가 매크로에 다시 할당되므로 사용자가 실수로 매크로를 실행할 수 있습니다.

VBA 프로시저 범위

이 튜토리얼의 2부에서는 변수와 상수의 범위와 키워드의 역할에 대한 주제를 논의했습니다. 공공의그리고 사적인. 다음 키워드는 VBA 프로시저와 관련하여 사용될 수도 있습니다.

VBA 프로시저를 선언하기 전에 다음을 기억하십시오. 기능또는 보결키워드가 삽입되지 않은 경우 프로시저의 기본 속성이 설정됩니다. 공공의(즉, 특정 VBA 프로젝트의 모든 곳에서 사용할 수 있습니다.) 이는 기본적으로 변수 선언과 다릅니다. 사적인.

VBA 프로시저 "Function" 및 "Sub"의 조기 종료

VBA 프로시저의 실행을 종료해야 하는 경우 기능또는 보결, 자연스러운 결말을 기다리지 않고 이에 대한 연산자가 있습니다. 종료 기능그리고 하위 종료. 이러한 연산자의 사용은 간단한 절차 예를 사용하여 아래에 나와 있습니다. 기능, 추가 작업을 수행하기 위해 긍정적인 인수를 받을 것으로 예상됩니다. 양수가 아닌 값이 프로시저에 전달되면 더 이상 작업을 수행할 수 없으므로 사용자에게 오류 메시지가 표시되고 프로시저가 즉시 종료되어야 합니다.

함수 VAT_Amount(sVAT_Rate As Single) 단일 VAT_Amount = 0인 경우 sVAT_Rate<= 0 Then MsgBox "Expected a Positive value of sVAT_Rate but Received " & sVAT_Rate Exit Function End If ... End Function

절차를 완료하기 전에 주의하세요 기능VAT_금액, 내장 VBA 함수가 코드에 삽입됩니다. 메시지박스, 사용자에게 팝업 경고 창을 표시합니다.

Excel에서 VBA 코드를 작성할 때 모든 단계에서 기본 제공 연산자 집합이 사용됩니다. 이러한 연산자는 수학, 문자열, 비교 및 ​​논리 연산자로 구분됩니다. 다음으로 각 연산자 그룹을 자세히 살펴보겠습니다.

수학 연산자

기본 VBA 수학 연산자는 아래 표에 나열되어 있습니다.

표의 오른쪽 열에는 괄호가 없는 경우의 기본 연산자 우선 순위가 표시됩니다. 표현식에 괄호를 추가하면 VBA 문이 실행되는 순서를 원하는 대로 변경할 수 있습니다.

문자열 연산자

Excel VBA의 기본 문자열 연산자는 연결 연산자입니다. & (병합):

비교 연산자

비교 연산자는 두 숫자나 문자열을 비교하고 다음과 같은 부울 값을 반환하는 데 사용됩니다. 부울(참 또는 거짓). 주요 Excel VBA 비교 연산자는 다음 표에 나열되어 있습니다.

논리 연산자

비교 연산자와 같은 논리 연산자는 다음 유형의 부울 값을 반환합니다. 부울(참 또는 거짓). 기본 Excel VBA 논리 연산자는 아래 표에 나열되어 있습니다.

위 표에는 VBA에서 사용할 수 있는 모든 부울 연산자가 나열되어 있지 않습니다. 논리 연산자의 전체 목록은 Visual Basic 개발자 센터에서 찾을 수 있습니다.

내장된 기능

VBA에는 코드를 작성할 때 사용할 수 있는 내장 함수가 많이 있습니다. 다음은 가장 일반적으로 사용되는 것 중 일부입니다:

기능 행동
복근 주어진 숫자의 절대값을 반환합니다.
  • 복근(-20)값 20을 반환합니다.
  • 복근(20)값 20을 반환합니다.
Chr 매개변수의 숫자 값에 해당하는 ANSI 문자를 반환합니다.
  • Chr(10)줄 바꿈을 반환합니다.
  • Chr(97)문자를 반환합니다. .
날짜 현재 시스템 날짜를 반환합니다.
날짜추가 특정 날짜에 특정 시간 간격을 추가합니다. 함수 구문:

날짜추가( 간격 , 숫자 , 날짜 )

주장은 어디에 있는가 간격주어진 시간에 추가되는 시간 간격의 유형을 정의합니다. 날짜인수에 지정된 금액으로 숫자 .

논쟁 간격다음 값 중 하나를 사용할 수 있습니다.

  • DateAdd(“d”, 32, “2015년 1월 1일”) 2015년 1월 1일 날짜에 32일을 더하여 2015년 2월 2일 날짜를 반환합니다.
  • DateAdd(“ww”, 36, “2015/01/01”) 2015년 1월 1일 날짜에 36주를 더하고 2015년 9월 9일 날짜를 반환합니다.
날짜 차이 주어진 두 날짜 사이의 지정된 시간 간격 수를 계산합니다.
  • DateDiff(“d”, “2015년 1월 1일”, “2015년 2월 2일”) 2015년 1월 1일과 2015년 2월 2일 사이의 일수를 계산하여 결과 32를 반환합니다.
  • DateDiff(“ww”, “2015/01/01”, “2016/03/03”) 2015년 1월 1일과 2016년 3월 3일 사이의 주 수를 계산하여 결과 61을 반환합니다.
주어진 날짜의 해당 월의 일자에 해당하는 정수를 반환합니다.

예: 일(“2015년 1월 29일”)숫자 29를 반환합니다.

시간 주어진 시간의 시간에 해당하는 정수를 반환합니다.

예: 시(“22:45:00”)숫자 22를 반환합니다.

InStr 정수와 두 개의 문자열을 인수로 사용합니다. 정수로 지정된 위치에서 검색을 시작하여 첫 번째 문자열 내에서 두 번째 문자열이 나타나는 위치를 반환합니다.
  • InStr(1, “찾고 있는 단어가 여기에 있습니다.”, “단어”)숫자 13을 반환합니다.
  • InStr(14, “여기에 검색어가 있고, 여기에 또 다른 검색어가 있습니다”, “단어”)숫자 38을 반환합니다.

메모:숫자 인수를 지정할 수 없습니다. 이 경우 함수의 두 번째 인수에 지정된 문자열의 첫 번째 문자부터 검색이 시작됩니다.

정수 주어진 숫자의 정수 부분을 반환합니다.

예: 정수(5.79)결과 5를 반환합니다.

날짜 보고 진실주어진 값이 날짜인 경우, 또는 거짓– 데이트가 아닌 경우.
  • IsDate(“2015/01/01”)보고 진실;
  • 날짜(100)보고 거짓.
IsError 보고 진실, 주어진 값이 오류인 경우, 또는 거짓– 오류가 아닌 경우.
누락 선택적 프로시저 인수의 이름이 함수에 인수로 전달됩니다. 누락보고 진실, 문제의 프로시저 인수에 대해 값이 전달되지 않은 경우.
숫자임 보고 진실주어진 값이 숫자로 간주될 수 있으면 그렇지 않으면 반환됩니다. 거짓.
왼쪽 전달된 문자열의 시작 부분부터 지정된 수의 문자를 반환합니다. 함수의 구문은 다음과 같습니다.

왼쪽( , 길이 )

어디 원래 문자열이고 길이– 줄의 시작 부분부터 계산하여 반환된 문자 수입니다.

  • 왼쪽(“abvgdezziklmn”, 4)문자열 "abvg"를 반환합니다.
  • 왼쪽(“abvgdezziklmn”, 1)문자열 "a"를 반환합니다.
문자열의 문자 수를 반환합니다.

예: 렌(“abvgdez”)숫자 7을 반환합니다.

주어진 날짜의 월에 해당하는 정수를 반환합니다.

예: 월(“2015/01/29”)값 1을 반환합니다.

중간 전달된 문자열의 중간부터 지정된 수의 문자를 반환합니다. 함수 구문:

중간( , 시작 , 길이 )

어디 원래 문자열입니다 시작– 추출된 문자열의 시작 위치, 길이– 추출할 문자 수입니다.

  • Mid(“abvgdezziklmn”, 4, 5)문자열 "where"를 반환합니다.
  • Mid(“abvgdezziklmn”, 10, 2)문자열 "cl"을 반환합니다.
주어진 시간의 분 수에 해당하는 정수를 반환합니다. 예: 분(“22:45:15”)값 45를 반환합니다.
지금 현재 시스템 날짜와 시간을 반환합니다.
오른쪽 전달된 문자열의 끝에서부터 지정된 수의 문자를 반환합니다. 함수 구문:

오른쪽( , 길이 )

어디 원래 문자열이고 길이– 주어진 문자열의 끝에서부터 세어 추출해야 하는 문자 수입니다.

  • 오른쪽(“abvgdezziklmn”, 4)문자열 "clmn"을 반환합니다.
  • 오른쪽(“abvgdezziklmn”, 1)문자열 "n"을 반환합니다.
두번째 주어진 시간의 초 수에 해당하는 정수를 반환합니다.

예: 두 번째(“22:45:15”)값 15를 반환합니다.

광장 인수로 전달된 숫자 값의 제곱근을 반환합니다.
  • 스퀘어(4)값 2를 반환합니다.
  • 스퀘어(16)값 4를 반환합니다.
시간 현재 시스템 시간을 반환합니다.
유바운드 지정된 배열 차원의 위 첨자를 반환합니다.

메모:다차원 배열의 경우 선택적 인수를 사용하여 차원이 반환되어야 하는 인덱스를 지정할 수 있습니다. 지정하지 않으면 기본값은 1입니다.