이 콘텐츠는 Northwind 2.0 Developer Edition 및 Starter Edition에 적용될 수 있습니다.
VBA(Visual Basic for Applications)는 모든 Office 제품에서 사용되는 프로그래밍 언어입니다. VBA를 학습하면 Access뿐만 아니라 모든 Office 제품으로 작업할 수 있습니다.
"방법"을 검색할 때 Access 특정 예제를 찾고 검색에 Microsoft Access를 포함해야 합니다. 다른 Office 제품에 대한 솔루션이 작동하는 경우가 많지만 보장은 없습니다. Microsoft Access는 완성도 높은 제품입니다. 즉, 많은 예제가 있습니다. 이는 당신을 위해 중대하다!또한 Access 프로그래밍에 대한 이전 설명서가 계속 실행 가능하여 살펴볼 수 있음을 의미합니다. 오래된 책의 대부분은 여전히 원래 비용의 일부에 중고 도서 사이트에서 사용할 수 있습니다. Microsoft 웹 사이트를 확인하여 여전히 지원되는 Access 버전을 확인하고 해당 버전으로 이동합니다.
Office에 대한 지원 종료 리소스 - Office 배포 | Microsoft Learn
다음은 Microsoft의 Access 설명서에 대한 몇 가지 링크입니다.
Microsoft Access 파일은 Office 파일입니다. Office 파일은 "신뢰할 수 있는 위치"에 있거나 해당 "콘텐츠를 사용하도록 설정"해야 합니다. 이러한 항목은 사용자가 만들었거나 신뢰할 수 있는 원본에서 나왔기 때문에 "안전"으로 간주됩니다. Office 파일을 열 때마다 신뢰할 수 있는 위치가 있는지 확인합니다. 여기에서 신뢰할 수 있음/사용으로 참조합니다. 참고: 새 버전의 애플리케이션이 릴리스되고 신뢰할 수 없는 위치에서 열리는 경우 콘텐츠를 사용하도록 설정하는 프로세스가 반복됩니다.
신뢰할 수 있는 위치에 대해 자세히 알아보세요.
매크로, 함수 및 Subs는 Access 데이터베이스에 비즈니스 논리를 구현하는 방법입니다. 시작하기 전에 범위 및 표시 유형을 이해하는 것이 중요합니다.
폼의 컨트롤(예: 단추, 텍스트 상자, 레이블 등)의 이벤트(예: 컨트롤 클릭)는 레코드 추가, 삭제 또는 양식 열기와 같은 다른 프로세스를 트리거합니다. 이러한 프로세스는 매크로 또는 VBA를 사용하여 구현할 수 있습니다. Northwind Starter Edition은 주로 매크로를 사용하고 매크로가 필요한 함수를 수행할 수 없는 일부 VBA를 사용합니다. Northwind Developer Edition은 주로 VBA를 사용합니다.
일부 컨트롤 형식에는 매크로를 자동으로 만드는 기본 제공 마법사가 있습니다. 예를 들어 양식에 명령 단추를 추가하면 단추에 대한 여러 가지 기능을 제공하는 마법사가 열립니다. 콤보 상자를 추가하면 양식에서 특정 레코드를 찾도록 구성할 수 있는 마법사가 열립니다.
탐색 창은 모든 데이터베이스 개체를 보고 액세스하는 기본 방법이며 기본적으로 Access 창의 왼쪽에 표시됩니다.
Northwind 탐색 창이 사용자 지정되었습니다. Northwind Starter 2.0이라는 사용자 지정 범주를 만들었습니다. 이렇게 하면 기능 영역별로 개체를 구성할 수 있습니다.Access/Office 내의 범위 및 표시 유형 에 대해 알아보는 것이 중요합니다. 여기에서 시작할 수 있습니다.
생성된 개체가 scope 벗어나면 변수가 존재해야 하는 경우가 있습니다. 위의 범위 및 표시 유형을 참조하세요. 이 작업을 수행하는 세 가지 기본 방법은 Public Variables, TempVars 및 로컬 테이블에 값 저장입니다. 많은 개발자가 이러한 혼합을 사용합니다. 각각에는 장단점이 있습니다. 자세한 내용은 여기를 참조하세요.
VBA 모듈 퍼블릭 변수:
TempVars:
로컬 테이블에 값 저장
-
현재 세션에 대한 공용 변수 및 TempVars가 존재하며 애플리케이션이 닫혀 있으면 scope 닫힙니다. 그러나 세션 간에 사용자별 변수를 유지하려면 어떻게 해야 할까요? 이러한 형식의 값을 로컬 테이블에 저장할 수 있습니다. Northwind 2.0에서는 SystemSettings라는 테이블에 이러한 변수가 저장됩니다. 테이블의 값은 ShowWelcome입니다. 이 값은 로그인할 때마다 시작 화면을 표시하려는 경우 Access에 지시합니다.
개발자는 종종 한 폼에서 다른 폼으로 또는 폼에서 보고서로 매개 변수를 전달해야 합니다. 이러한 매개 변수는 호출된 함수가 자체 구성에 사용할 중요한 정보를 전달합니다. 두 번째 폼이나 보고서에서 첫 번째 양식에서 정보를 가져오는 방법에는 여러 가지가 있습니다. 다음과 같은 몇 가지 방법이 있습니다.
-
두 번째 폼은 첫 번째 폼을 "뒤로"하여 표시되거나 보이지 않는 컨트롤에서 일부 값을 선택할 수 있습니다. 예: lngCustomerID = Forms!FirstForm!cboCustomerID
-
첫 번째 폼은 값을 전역 변수 또는 TempVars에 저장할 수 있습니다. 예: g_lngUserID = Me.cboUserID TempVars.Add "UserID", Me.cboUserID
Northwind Developer Edition과 전문 생활에서 자주 사용되는 방법은 DoCmd.OpenForm 또는 OpenReport의 OpenArgs 인수를 사용하는 것입니다. 예: DoCmd.OpenForm "frmCompanyDetail", OpenArgs:=StringFormat("CompanyID={0} &CompanyTypeID={1}", Me.VendorID, ctVendor)
여기서는 (1) OpenArgs를 사용하여 VendorID 및 VendorType을 전달하는 방법과 (2) StringFormat() 함수를 사용하여 다음 문자열을 만드는 두 가지 기술을 결합합니다.
CompanyID=5&CompanyTypeID=2
이 문자열은 브라우저에서 사용되는 것처럼 쿼리 문자열과 매우 유사합니다. 앰퍼샌드 문자로 구분된 하나 이상의 "이름/값 쌍"이 포함됩니다.
name1=value1&name2=value2
이러한 문자열의 장점은 각 값에 이름이 있다는 것입니다. OpenArgs만 "5,2"로 설정하는 간단한 접근 방식과 비교합니다. 이러한 경우 각 값이 무엇을 나타내는지 알아내는 데 노력이 필요합니다. 각 값의 이름을 지정하면 쿼리 문자열을 "자체 설명"하는 것이 좋습니다.
DoCmd.OpenForm의 수신 끝에서는 일반적으로 Form_Open 또는 Form_Load 이벤트에 있으며 OpenArgs 문자열을 해당 구성 요소로 구문 분석하려고 합니다.
Northwind에서는 StringToDictionary 함수를 사용하여 이 작업을 수행할 수 있습니다. 쿼리 문자열과 유사한 함수를 사용하여 해당 구성 요소로 구문 분석합니다. 그런 다음 이러한 구성 요소는 Scripting.Dictionary 개체에 저장됩니다. 이렇게 하려면 도구 > 참조를 사용하고 Microsoft Scripting Runtime (scrrun.dll)에 대한 참조를 설정해야 합니다.
Dictionary 개체의 기능 및 이점은 다음과 같습니다.
-
요소의 순서는 중요하지 않습니다.
-
컬렉션의 요소를 추가하고 제거하는 간단한 함수
-
컬렉션에 무엇이 있는지 알 수 있도록 컬렉션을 반복하는 함수
-
특정 요소를 사용할 수 있는지 테스트할 수 있도록 Exists 함수
사전 개체의 사용은 Northwind 전체에 표시됩니다. 예를 들어 frmGenericDialog의 Form_Load 이벤트입니다.
Access에서 제어 마법사를 사용하여 만든 매크로에는 오류 처리가 거의 포함되지 않습니다. 제어 마법사를 사용하여 만든 VBA는 일반 MsgBox Err.Description으로 제한될 수 있습니다.
Northwind 2.0에서는 VBA 코드를 사용할 때 더 잘 수행하는 방법을 보여 드립니다. 전역 오류 처리기라고 하는 것을 구현했습니다. 모든 프로시저에서 발생하는 오류는 전역 수준에서 함수를 호출하여 오류를 표시합니다. 여기서 가장 큰 장점은 오류 처리가 일관적이라는 것입니다. 또한 메시지를 변경해야 하는 경우(예: 오류 번호를 추가로 표시하거나 파일에 오류를 기록하려면) 한 곳에서만 수행해야 합니다.
clsErrorHandler 는 오류 처리 코드를 구현하는 클래스 모듈입니다. 클래스 모듈은 모든 기본 및 도우미 함수를 한 단위로 유지하므로 코드를 캡슐화합니다.
AutoExec 매크로는 modStartup에서 시작 함수를 호출합니다. Starter Edition에서 함수는 clsErrorHandler의 instance 만들고 애플리케이션 전체에서 사용할 수 있는 전역 변수로 저장합니다. Dev Edition에서는 정적 클래스가 사용됩니다. 클래스 모듈의 맨 위에 있는 주석을 참조하세요.
실제로 프로시저의 오류 처리 코드는 매우 일관적이어서 각 프로시저에 적절한 오류 처리기를 적용한 특정 VBA 코드를 사용하여 5분 이내에 모든 코드를 만들 수 있었습니다. (템플릿에 포함되지 않은 코드). Northwind 2.0 Starter 및 Developer 템플릿 버전은 모두 처음에 이 오류 처리 방법을 사용했습니다.
'향상된 오류 처리
Northwind Developer Edition 버전 2.2부터 Access 커뮤니티의 피드백 덕분에 오류 처리기가 개선되었습니다. 스타터 버전은 변경되지 않습니다.
기본적으로 이전 버전(2.0 - 2023년 4월에 릴리스됨)의 오류 처리기는 다음과 같습니다.
Public Sub HandleError(…) MsgBox Err.DescriptionEnd Sub
버전 2.2에서는 다음으로 업그레이드됩니다.
Public Sub HandleError (…, Optional ByVal IsEventProcedure As Boolean = False) If Not IsEventProcedure Then Err.Raise lngError, strErrSource End If MsgBox Err.DescriptionEnd Sub
이 변경이 수행된 이유를 이해하려면 먼저 코드를 실행하는 이유를 이해해 보겠습니다.
-
AutoExec 매크로는 시작 프로시저를 호출합니다. 이 프로시저는 첫 번째 양식을 열기 전에 몇 가지 초기화를 수행합니다.
-
사용자가 폼을 열거나 단추를 클릭하는 등 애플리케이션과 상호 작용하여 Form_Load 및 cmdPrintInvoice_Click 같은 이벤트 프로시저가 발생합니다.
'
이벤트 프로시저 외에도 애플리케이션에는 주로 모듈에 하위 경로 및 함수가 있으며 해당 코드는 이벤트 프로시저에서 호출됩니다. 이를 "표준" 프로시저라고 합니다.
Northwind 버전 2.0에서는 표준 프로시저가 메시지로 자체 오류를 처리하지만 어떻게든 호출 이벤트 프로시저에 오류가 발생했음을 알리지 않습니다. 이벤트 프로시저에 호출된 프로시저에서 처리한 이전 오류와 관계없이 실행해야 하는 후속 코드가 있는 경우 이 문제는 잘못될 수 있습니다. 물론 서브루틴을 성공 또는 실패를 반환하는 함수로 바꾸고 그에 따라 이벤트 프로시저를 코딩할 수 있지만 항상 옵션이 아닌 것은 아닙니다.
Northwind 버전 2.2에서 표준 프로시저는 오류 메시지를 처리하지 않고 Err.Raise를 사용하여 호출 이벤트 프로시저에 다시 보고합니다. 그런 다음 호출 이벤트 프로시저는 발생한 오류를 표시하고 Exit_Handler 다시 시작합니다. 호출 프로시저가 정상적으로 결론을 내릴 수 있기 때문에 더 좋습니다.
Northwind 버전 2.2 코드를 사용하려면 이벤트 프로시저가 호출자가 이벤트 프로시저임을 나타내는 세 번째 인수를 HandleError 에 전달해야 합니다. Northwind Dev Edition이 업데이트되었습니다.
훨씬 더 강력한 오류 처리기 모듈은 "스택"(배열)에서 "푸시 및 터지는" 프로시저를 지원합니다. 첫 번째 요소는 항상 이벤트 프로시저이므로 추가 인수가 필요하지 않습니다. 이 구현은 Northwind Dev Edition의 목표를 초과합니다.
MRU 또는 가장 최근에 사용한 항목은 최근에 사용한 주문 및 구매 주문 목록입니다. 자주 이러한 상태로 돌아가서 다음 상태에 넣을 수 있습니다. MRU 목록은 Office 제품에서 다시 열 수 있는 최근에 사용한 파일 목록으로 표시되는 경우가 많습니다.
Northwind Dev Edition에서 MRU 기능(Starter 버전에 없음)을 구현하려면 먼저 다음 항목을 설정해야 합니다.
-
MRU 정보를 저장할 테이블입니다.
-
PO(주문 또는 구매 주문)가 열릴 때 테이블을 업데이트하는 코드입니다.
-
리본에서 MRU 드롭다운을 업데이트하는 코드입니다.
-
리본에서 MRU 항목을 선택할 때 항목을 로드하는 코드입니다.
이러한 각 내용을 자세히 살펴보겠습니다.
1. MRU 정보를 저장할 테이블입니다.
테이블 MRU의 디자인은 특히 인덱스를 검토할 가치가 있습니다. 리본 드롭다운 목록에서 MRU 항목을 빠르게 정렬하는 데 도움이 되는 중복 인덱 스 SortIdx 와 각 사용자에 대해 항목이 한 번만 발생할 수 있는 비즈니스 규칙을 적용하는 고유한 인덱스가 있습니다. 예를 들어 동일한 순서를 두 번 열면 MRU 테이블에 두 개의 레코드가 만들어지지 않습니다.
이 테이블은 데이터베이스의 모든 MRU 관련 PK(기본 키) 필드가 AutoNumber이므로 PKValue에 Long 정수 데이터 형식을 사용할 수 있다는 사실을 활용합니다.
2. 주문 또는 P.O.가 열릴 때 테이블을 업데이트하는 코드입니다.
NW2에서는 기존 레코드를 다시 업데이트할 때가 아니라 새 레코드를 만든 경우에만 MRU 목록에 추가하도록 선택했습니다. 이를 지원하기 위해 AddToMRU 호출을 Form_AfterInsertForm_AfterUpdate 이동할 수 있습니다.
AddToMRU 및 DeleteFromMRU 프로시저는 모든 양식에서 공용 프로시저를 볼 수 있는 표준 모듈인 modGlobal에서 구현됩니다.
AddToMRU (이름에서 설명한 대로)는 새 항목을 MRU 테이블에 추가한 다음 필요에 따라 다시 트리밍하여 최대 크기(MAX_MRU_COUNT)를 초과한 경우 가장 오래된 레코드를 삭제합니다. 마지막 단계는 Access 개발자에게 가장 잘 알려지지 않은 단계입니다. 리본 드롭다운을 새로 고쳐야 하며 InvalidateControl을 호출하여 수행됩니다. 이는 초기화 프로세스를 다시 실행하기 위한 리본 메뉴의 신호입니다.
3. 리본에서 MRU 드롭다운을 업데이트하는 코드입니다.
시작 시 및 InvalidateControl 이 호출된 후 복잡한 함수 집합이 실행되어 리본 메뉴를 채웁니다. 이러한 프로시저는 테이블 uSysRibbons 의 Ribbon XML에 의해 호출됩니다.
<group id="gCurrentStatus" label="MRU">
<box id="bxMRU" boxStyle="vertical">
<dropDown id="ddMRU"
getItemCount="ddMRU_GetItemCount"
getItemLabel="ddMRU_GetItemLabel"
getSelectedItemIndex="ddMRU_GetSelectedItemIndex"
getItemID="ddMRU_GetItemID"
onAction="ddMRU_OnAction"
screentip="Most Recently Used Objects">
</dropDown>
</box>
</group>
이러한 4개의 콜백 함수는 드롭다운을 채웁니다. 이는 표준 콤보박스에 대해 여기에 설명된 것과 매우 동일합니다.
modRibbonCallback에서 Debug.Print 줄의 주석 처리를 제거하고 애플리케이션을 다시 시작하면 직접 실행 창에 다음과 같은 시퀀스가 표시됩니다.
ddMRU_GetItemCount ddMRU 6
ddMRU_GetItemLabel ddMRU 0 Order 60, Proseware, Inc.
ddMRU_GetItemID ddMRU 0 2
ddMRU_GetItemLabel ddMRU 1 Order 62, Best For You Organics Company
ddMRU_GetItemID ddMRU 1 4
ddMRU_GetItemLabel ddMRU 2 Order 63, Wide World Importers
ddMRU_GetItemID ddMRU 2 5
ddMRU_GetItemLabel ddMRU 3 Order 66, Proseware, Inc.
ddMRU_GetItemID ddMRU 3 8
ddMRU_GetItemLabel ddMRU 4 Order 67, Best For You Organics Company
ddMRU_GetItemID ddMRU 4 9
ddMRU_GetItemLabel ddMRU 5 Order 68, Adatum Corporation
ddMRU_GetItemID ddMRU 5 10
ddMRU_GetSelectedItemIndex ddMRU 0
여기서 Access는 먼저 ddMRU_GetItemCount ByRef 인수에 로드할 항목 수를 반환하는 프로시저를 호출하는 것을 볼 수 있습니다. 또한 MRU 테이블에서 쿼리를 열고 여러 번 사용하려고 하므로 캐시하는 시간이기도 합니다.
그런 다음 리본은 두 개의 프로시저를 반복적으로 호출하여 두 열 드롭다운의 ID 및 레이블 값을 가져옵니다.
마지막으로 선택해야 하는 항목을 해제하는 프로시저를 호출합니다. (이 경우 첫 번째 항목입니다.)
4. 리본에서 MRU 항목을 선택할 때 항목을 로드하는 코드입니다.
다른 리본 항목과 마찬가지로 리본 XML의 OnAction 속성은 작업을 수행하는 데 사용할 콜백 함수를 지정합니다.
onAction="ddMRU_OnAction"
이 절차는 modRibbonCallback에서 구현됩니다. 이미 열려 있는 레코드 집합을 다시 사용하여 선택한 항목이 있는 레코드를 찾은 다음 필요한 TableName에 따라 해당 양식을 열고 로드할 PK 값을 전달합니다.
-
Northwind 2.0 Developer Edition: Template-Tutorial
-
Northwind 2.0 Developer Edition: All topics