Bỏ qua để tới nội dung chính
Đăng nhập với Microsoft
Đăng nhập hoặc tạo một tài khoản.
Xin chào,
Chọn một tài khoản khác.
Bạn có nhiều tài khoản
Chọn tài khoản bạn muốn đăng nhập.

Nội dung ở đây có thể áp dụng cho Northwind 2.0 Developer Edition và Starter Edition. 

VBA (phiên bản Visual Basic for Applications) là ngôn ngữ lập trình được sử dụng trong tất cả các Sản phẩm Office. Tìm hiểu VBA cho phép bạn làm việc với tất cả các sản phẩm Office (không chỉ Access).
Khi tìm kiếm "hướng dẫn", hãy nhớ tìm kiếm các ví dụ cụ thể về Access và đưa Microsoft Access vào tìm kiếm. Thường thì các giải pháp cho các sản phẩm Office khác sẽ hoạt động - nhưng không có đảm bảo. Microsoft Access là một sản phẩm dành cho người lớn; điều đó có nghĩa là có rất nhiều ví dụ trên đó; đó là tuyệt vời cho bạn! 

Điều đó cũng có nghĩa là bạn vẫn có thể xem các sách cũ hơn về lập trình Access. Nhiều cuốn sách cũ vẫn còn có sẵn trên các trang web sách được sử dụng với một phần nhỏ chi phí ban đầu của họ. Kiểm tra trang web của Microsoft để xác định những phiên bản Access nào vẫn đang được hỗ trợ và đi kèm với các phiên bản đó.

Tài nguyên kết thúc hỗ trợ dành cho Office - Triển khai Office | Microsoft Learn  

Dưới đây là một số liên kết đến tài liệu Access tại Microsoft.

Tệp Microsoft Access là các tệp Office. Các tệp Office phải nằm ở "Vị trí Tin cậy" hoặc "được bật nội dung". Các mục này được coi là "an toàn" vì bạn đã tạo chúng hoặc chúng đến từ một nguồn đáng tin cậy. Kiểm tra Vị trí Tin cậy xuất hiện mỗi khi bạn mở bất kỳ Tệp văn phòng nào. Từ đây, chúng tôi sẽ gọi đây là Tin cậy/Đã bật. LƯU Ý: Nếu một phiên bản mới của ứng dụng được phát hành và mở ra từ một vị trí không tin cậy quá trình cho phép nội dung sẽ lặp lại.

Tìm hiểu thêm về Vị trí Tin cậy.: 

Macro, Hàm và Con là cách bạn triển khai lô-gic kinh doanh vào cơ sở dữ liệu Access. Điều quan trọng là bạn phải hiểu rõ Phạm vi và Khả năng hiển thị trước khi bắt đầu.


Các sự kiện (như bấm vào điều khiển) trên Điều khiển trên biểu mẫu (ví dụ: nút, hộp văn bản, nhãn, v.v.) kích hoạt các quy trình khác, chẳng hạn như thêm, xóa bản ghi hoặc mở biểu mẫu. Các quy trình này có thể được thực thi bằng cách sử dụng macro hoặc VBA. Northwind Starter Edition sử dụng chủ yếu macro và một số VBA trong đó macro không thể thực hiện các hàm cần thiết. Northwind Developer Edition chủ yếu sử dụng VBA. 

Một số loại điều khiển có trình hướng dẫn tích hợp sẵn để tự động tạo macro. Ví dụ: việc thêm nút lệnh vào biểu mẫu sẽ mở ra một trình hướng dẫn cung cấp một số lựa chọn chức năng cho nút. Việc thêm hộp tổ hợp sẽ mở ra một trình hướng dẫn có thể được cấu hình để tìm một bản ghi cụ thể trên biểu mẫu. 

Ngăn Dẫn hướng là cách chính để bạn xem và truy nhập vào tất cả các đối tượng cơ sở dữ liệu của mình và nó hiển thị ở bên trái cửa sổ Access theo mặc định. 
Ngăn Dẫn hướng Northwind đã được tùy chỉnh. Chúng tôi đã tạo một thể loại tùy chỉnh có tên là Northwind Starter 2.0. Điều này cho phép chúng tôi sắp xếp các đối tượng theo khu vực chức năng.

Đôi khi bạn cần một biến để tồn tại sau khi các đối tượng đã tạo ra nó đi ra khỏi phạm vi. Xem mục Phạm vi và Khả năng hiển thị ở trên. Có ba cách chính để thực hiện việc này: Biến Công cộng, TempVars và Lưu trữ các giá trị trong bảng cục bộ. Nhiều nhà phát triển sử dụng kết hợp của những. Mỗi loại đều có ưu điểm và như thế.  Tìm hiểu thêm về từng loại tại đây: 

Biến số Công khai của Mô-đun VBA: 

TempVars: 

Lưu trữ các giá trị trong bảng cục bộ

  • Biến công cộng và TempVars tồn tại cho phiên hiện tại và đi ra khỏi phạm vi khi ứng dụng được đóng. Nhưng điều gì sẽ xảy ra nếu bạn muốn giữ các biến cụ thể của người dùng trên các phiên? Bạn có thể lưu trữ các loại giá trị này trong bảng cục bộ. Trong Northwind 2.0, một biến số như vậy được lưu trong bảng được gọi là SystemSettings. Giá trị trong bảng là ShowWelcome. Giá trị này cho Access biết bạn có muốn nhìn thấy màn hình Chào mừng mỗi lần bạn đăng nhập hay không.

Các nhà phát triển thường cần truyền các tham số từ biểu mẫu này sang biểu mẫu khác hoặc từ biểu mẫu sang báo cáo. Những tham số này truyền tải thông tin quan trọng, mà sau đó hàm được gọi là sẽ sử dụng để cấu hình chính nó. Có một vài cách để biểu mẫu hoặc báo cáo thứ hai lấy thông tin từ biểu mẫu đầu tiên. Dưới đây là một số cách sau: 

  1. Biểu mẫu thứ hai có thể "nhìn lại" vào biểu mẫu đầu tiên để chọn một số giá trị, có thể trong điều khiển nhìn thấy được hoặc vô hình.  Ví dụ:lngCustomerID = Forms!FirstForm!cboCustomerID 

  2. Biểu mẫu đầu tiên có thể lưu các giá trị vào các biến toàn cục hoặc vào TempVars. Ví dụ:g_lngUserID = Me.cboUserID 

    TempVars.Add "UserID", Me.cboUserID 

Phương pháp thường được sử dụng trong Northwind Developer Edition cũng như trong cuộc sống chuyên nghiệp của chúng tôi là sử dụng tham đối OpenArgs của DoCmd.OpenForm hoặc OpenReport. Ví dụ:DoCmd.OpenForm "frmCompanyDetail", OpenArgs:=StringFormat("CompanyID={0} &CompanyTypeID={1}", Me.VendorID, ctVendor)

Chúng tôi đang kết hợp hai kỹ thuật ở đây: (1) việc sử dụng OpenArgs để truyền trong VendorID và VendorType và (2) sử dụng hàm StringFormat() để tạo, ví dụ: chuỗi này: 

CompanyID=5&CompanyTypeID=2 

Chuỗi này trông rất giống một chuỗi truy vấn như được sử dụng trong trình duyệt. Nó chứa một hoặc nhiều "cặp tên/giá trị" được phân tách bởi ký tự dấu và: 

name1=value1&name2=value2


Ưu điểm của chuỗi như vậy là mỗi giá trị có một tên. So sánh điều này với một cách tiếp cận đơn giản hơn mà bạn sẽ đặt OpenArgs chỉ là "5,2".  Trong trường hợp đó, sẽ mất nỗ lực để tìm ra ý nghĩa của mỗi giá trị. Việc đặt tên cho mỗi giá trị sẽ làm cho chuỗi truy vấn "tự mô tả" là một cách thực hành lập trình tốt.

Khi nhận doCmd.OpenForm , chúng tôi thường tham gia sự kiện Form_Open hoặc Form_Load và muốn phân tích chuỗi OpenArgs thành các cấu phần của chuỗi.

Trong Northwind, bạn có thể thực hiện điều này với hàm StringToDictionary . Hàm này cần có một hàm giống như truy vấn và phân tích nó thành các cấu phần của nó. Các cấu phần này sau đó được lưu trữ trong đối tượng Scripting.Dictionary . Lưu ý rằng khi thực hiện điều này, bạn phải sử dụng Công cụ > References và đặt tham chiếu đến Microsoft Scripting Runtime (scrrun.dll).

Các tính năng và lợi ích của đối tượng Từ điển bao gồm:  

  • Thứ tự của các phần tử không quan trọng

  • Các hàm đơn giản để thêm và loại bỏ các thành phần của tuyển tập

  • Các hàm để di chuyển vòng lặp qua bộ sưu tập, để bạn có thể biết nội dung trong bộ sưu tập

  • Một hàm Exists để bạn có thể kiểm tra xem một thành phần nhất định có sẵn hay không

Việc sử dụng đối tượng từ điển sẽ xuất hiện khắp Northwind. Ví dụ: sự Form_Load sự kiện trong frmGenericDialog.

Macro được tạo bằng Trình hướng dẫn Điều khiển trong Access hiếm khi bao gồm xử lý lỗi; VBA được tạo bằng Trình hướng dẫn Điều khiển có thể giới hạn ở một MsgBox Err.Description chung.

Trong Northwind 2.0, chúng tôi hướng dẫn bạn cách thực hiện tốt hơn khi sử dụng mã VBA. Chúng tôi đã triển khai công thức gọi là Trình xử lý Lỗi Toàn cầu. Lỗi xảy ra trong bất kỳ thủ tục nào gọi hàm ở cấp độ toàn cầu để hiển thị lỗi. Ưu điểm lớn ở đây là xử lý lỗi nhất quán. Và nếu thông báo cần thay đổi (ví dụ: để hiển thị thêm số lỗi hoặc ghi nhật ký lỗi vào tệp), thì thông báo chỉ cần được thực hiện ở một nơi. 

clsErrorHandler là Mô-đun Lớp thực thi mã xử lý lỗi. Một mô-đun lớp giữ tất cả các chức năng chính và helper của nó với nhau trong một đơn vị, do đó đóng gói mã.

Macro AutoExec gọi hàm Startup trong modStartup. Trong Phiên bản Starter, hàm tạo ra một phiên bản của clsErrorHandler và lưu nó như một biến toàn cầu có sẵn để sử dụng trong suốt ứng dụng. Trong phiên bản Dev, một lớp tĩnh được sử dụng – xem các nhận xét ở đầu mô-đun lớp.

Trên thực tế, mã xử lý lỗi trong các thủ tục nhất quán đến mức chúng tôi có thể tạo tất cả trong vòng chưa đến năm phút bằng cách sử dụng mã VBA cụ thể trang bị mỗi thủ tục với trình xử lý lỗi thích hợp. (Mã không được bao gồm trong mẫu). Cả Hai phiên bản mẫu Northwind 2.0 Starter và Developer ban đầu được trang bị với phương pháp xử lý lỗi này. 
'

XỬ LÝ LỖI ĐƯỢC CẢI THIỆN

Bắt đầu từ phiên bản 2.2 của Northwind Developer Edition, bộ xử lý lỗi đã được cải thiện nhờ phản hồi từ cộng đồng Access. Phiên bản Starter không thay đổi. 

Về bản chất, trình xử lý lỗi trong phiên bản trước (2.0 - phát hành vào tháng 4 năm 2023) là:

Public Sub HandleError(…)
    MsgBox Err.Description
End Sub


Trong phiên bản 2.2, phiên bản này được nâng cấp lên:

Public Sub HandleError (…, Optional ByVal IsEventProcedure As Boolean = False)
    If Not IsEventProcedure Then
        Err.Raise lngError, strErrSource
    End If
    MsgBox Err.Description
End Sub


Để tìm hiểu lý do tại sao thực hiện thay đổi này, trước tiên hãy hiểu điều gì khiến cho mã chạy:

  • Macro AutoExec gọi thủ tục Khởi động, thực hiện một số khởi tạo trước khi mở biểu mẫu đầu tiên.

  • Người dùng tương tác với ứng dụng, chẳng hạn như mở một biểu mẫu hoặc bấm vào một nút, khiến các thủ tục sự kiện kích hoạt chẳng hạn như Form_LoadcmdPrintInvoice_Click.
    '

Ngoài các thủ tục sự kiện, các ứng dụng có các định tuyến con và chức năng--chủ yếu là trong các mô-đun--và mã đó được gọi từ các thủ tục sự kiện. Những thủ tục này được gọi là "tiêu chuẩn".

Trong phiên bản 2.0 của Northwind, các quy trình tiêu chuẩn sẽ xử lý lỗi của riêng họ với thư, nhưng bằng cách nào đó họ sẽ không thông báo cho thủ tục sự kiện gọi rằng đã xảy ra lỗi. Điều này có thể không hợp lệ nếu thủ tục sự kiện có mã tiếp theo sẽ chạy bất kể lỗi trước đó được xử lý theo quy trình được gọi. Chắc chắn, chúng ta có thể thay thế thủ tục con bằng một hàm trả về thành công hoặc thất bại, và mã hóa thủ tục sự kiện cho phù hợp, nhưng đó không phải là luôn luôn là một lựa chọn.

Trong Northwind phiên bản 2.2, các thủ tục tiêu chuẩn không xử lý thông báo lỗi mà đúng hơn là sử dụng Err.Raise, báo cáo chúng trở lại thủ tục sự kiện gọi. Sau đó, thủ tục sự kiện gọi sẽ hiển thị lỗi được nêu ra và tiếp tục Exit_Handler. Điều này là tốt hơn, bởi vì nó cho phép các thủ tục gọi điện để kết thúc gracefully.

Để sử dụng mã Northwind phiên bản 2.2, thủ tục sự kiện phải chuyển vào HandleError đối số thứ ba cho biết người gọi là một thủ tục sự kiện. Northwind Dev Edition đã được cập nhật để thực hiện việc này.

Mô-đun bộ xử lý lỗi mạnh mẽ hơn nữa sẽ hỗ trợ cho các thủ tục "đẩy và popping" trên một "chồng" (mảng). Phần tử đầu tiên sẽ luôn là thủ tục sự kiện, vì vậy không cần tham đối bổ sung. Việc triển khai này nằm ngoài mục tiêu của Northwind Dev Edition.

MRU hoặc Sử dụng Gần đây Nhất là danh sách Đơn hàng và Đơn đặt hàng đã sử dụng gần đây. Bạn có thể muốn thường xuyên quay lại những mục này để đặt chúng vào Trạng thái tiếp theo. Danh sách MRU thường được hiển thị trong các sản phẩm Office dưới dạng danh sách các tệp sử dụng gần đây mà bạn có thể muốn mở lại.

trong phiên bản Northwind Dev, để triển khai tính năng MRU (không tồn tại trong phiên bản Starter), trước tiên, bạn phải thiết lập các mục sau: 

  1. Bảng để lưu trữ thông tin MRU.

  2. Mã để cập nhật bảng khi mở một đơn đặt hàng hoặc đơn đặt hàng (PO).

  3. Mã để cập nhật danh sách thả xuống MRU trong dải băng.

  4. Mã để tải mục khi một mục MRU được chọn từ dải băng.

Hãy xem từng câu trong số này chi tiết hơn. 


1. Bảng để lưu trữ thông tin MRU.

Thiết kế của bảng MRU rất đáng để xem xét, đặc biệt là các chỉ mục của nó. Lưu ý rằng có một chỉ mục trùng lặp SortIdx để hỗ trợ sắp xếp nhanh các mục MRU trong danh sách thả xuống của ribbon, cũng như một chỉ mục duy nhất để thực thi quy tắc kinh doanh mà đối với mỗi người dùng một mục có thể chỉ xảy ra một lần. Ví dụ: việc mở cùng một đơn hàng hai lần sẽ không tạo ra hai bản ghi trong bảng MRU.


Bảng tận dụng lợi thế của thực tế là tất cả các trường PK liên quan đến MRU (khóa chính) trong cơ sở dữ liệu đều là Số Tự động, vì vậy kiểu dữ liệu Số nguyên Dài có thể được sử dụng cho PKValue.

2. Mã để cập nhật bảng khi một đơn đặt hàng hoặc P.O. được mở.

Trong NW2, chúng tôi đã chọn thêm vào danh sách MRU chỉ khi một bản ghi mới được tạo, chứ không phải khi bản ghi hiện có được cập nhật lại. Chúng tôi chắc chắn có thể di chuyển cuộc gọi AddToMRU từ thiết Form_AfterInsert này Form_AfterUpdate hỗ trợ điều đó.

AddToMRUDeleteFromMRU thủ tục được thực hiện trong modGlobal, đó là một mô-đun tiêu chuẩn có thủ tục công cộng có thể nhìn thấy từ bất kỳ hình thức.

AddToMRU (như tên gợi ý) thêm mục mới vào bảng MRU, rồi tùy ý cắt nó lại, xóa bản ghi cũ nhất, nếu nó đã phát triển vượt quá kích thước tối đa (MAX_MRU_COUNT). Bước cuối cùng có lẽ là ít được biết đến với các nhà phát triển Access: trình thả xuống ribbon phải được làm mới và được thực hiện bằng cách gọi InvalidateControl. Đây là tín hiệu cho dải băng để chạy lại quy trình khởi tạo. 

3. Mã để cập nhật trình đơn thả xuống MRU trong dải băng. 

Vào thời điểm khởi động và sau khi invalidateControl được gọi, một tập hợp phức hợp các hàm được thực thi để điền dải băng.  Các quy trình này được gọi bằng Ribbon XML trong bảng uSysRibbons có nội dung như sau:

<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>

Bốn hàm gọi lại này điền vào danh sách thả xuống. Lưu ý rằng đây là ý tưởng rất giống như được mô tả ở đây cho comboboxes tiêu chuẩn.

Nếu bạn bỏ nhận thấy các dòng Debug.Printtrong modRibbonCallback và khởi động lại ứng dụng, các Cửa sổ ngay lập tức sẽ trình bày một trình tự như thế này: 

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


Chúng ta có thể thấy ở đây rằng Access trước tiên sẽ gọi một thủ tục trả về số lượng mục cần tải trong đối số ByRef của ddMRU_GetItemCount. Đây cũng là lúc chúng tôi mở truy vấn trên bảng MRU và lưu vào bộ đệm ẩn vì truy vấn sắp được sử dụng nhiều lần. 

Dải băng sau đó liên tục gọi hai thủ tục để lấy các giá trị ID và Nhãn cho danh sách thả xuống hai cột. 

Cuối cùng, nó gọi là một thủ tục disover mục nào nên được chọn. (Trong trường hợp của chúng tôi, đó là lần đầu tiên.) 

4. Mã để tải một mục khi mục MRU được chọn từ dải băng.

Giống như bất kỳ mục ribbon nào khác, thuộc tính OnAction trong Ribbon XML xác định hàm gọi lại được sử dụng để thực hiện hành động:

onAction="ddMRU_OnAction"

Quy trình này được thực hiện trong modRibbonCallback. Nó tái sử dụng tập bản ghi đã mở để tìm bản ghi với mục đã chọn, sau đó, tùy thuộc vào TableName cần thiết, mở biểu mẫu tương ứng, truyền trong giá trị PK sẽ được tải.

Bạn cần thêm trợ giúp?

Bạn muốn xem các tùy chọn khác?

Khám phá các lợi ích của gói đăng ký, xem qua các khóa đào tạo, tìm hiểu cách bảo mật thiết bị của bạn và hơn thế nữa.

Cộng đồng giúp bạn đặt và trả lời các câu hỏi, cung cấp phản hồi và lắng nghe ý kiến từ các chuyên gia có kiến thức phong phú.

Thông tin này có hữu ích không?

Bạn hài lòng đến đâu với chất lượng dịch thuật?
Điều gì ảnh hưởng đến trải nghiệm của bạn?
Khi nhấn gửi, phản hồi của bạn sẽ được sử dụng để cải thiện các sản phẩm và dịch vụ của Microsoft. Người quản trị CNTT của bạn sẽ có thể thu thập dữ liệu này. Điều khoản về quyền riêng tư.

Cảm ơn phản hồi của bạn!

×