Mảng trong Visual Basic for Application

Mảng trong Visual Basic for Application là cấu trúc thường lưu trữ các tập hợp các biến có liên quan cùng kiểu. Các mục nhập mảng được truy cập bằng chỉ mục số của chúng.

Ví dụ, có một nhóm gồm 20 người có tên cần được lưu lại để sử dụng sau này trong mã VBA. Người ta có thể chỉ cần khai báo 20 biến để giữ mỗi tên, như sau:

Dim Team_Member1 As String Dim Team_Member2 As String ... Dim Team_Member20 As String

Nhưng bạn có thể sử dụng một cách đơn giản và có tổ chức hơn nhiều - lưu trữ danh sách tên các thành viên trong nhóm trong một mảng gồm 20 biến như Chuỗi:

Dim Team_Members (1 đến 20) dưới dạng chuỗi

Trong dòng hiển thị ở trên, chúng ta đã khai báo một mảng. Bây giờ, hãy viết một giá trị cho mỗi phần tử của nó, như sau:

Team_Members (1) = "John Smith"

Một lợi thế bổ sung của việc lưu trữ dữ liệu trong một mảng, so với việc sử dụng các biến riêng biệt, trở nên rõ ràng khi cần thực hiện cùng một hành động trên mỗi phần tử của mảng. Nếu tên của các thành viên trong nhóm được lưu trữ trong 20 biến riêng biệt, thì sẽ cần 20 dòng mã để viết mỗi lần để thực hiện cùng một hành động đối với mỗi người trong số họ. Tuy nhiên, nếu các tên được lưu trữ trong một mảng, thì bạn có thể thực hiện hành động mong muốn với mỗi tên bằng một vòng lặp đơn giản.

Cách nó hoạt động được minh họa dưới đây với một ví dụ mã in tên của từng thành viên trong nhóm tuần tự trong các ô cột. A trang tính Excel đang hoạt động.

Đối với i = 1 đến 20 ô (i, 1) .Value = Team_Members (i) Tiếp theo i

Rõ ràng, làm việc với một mảng lưu trữ 20 tên sẽ ít rườm rà và chính xác hơn nhiều so với việc sử dụng 20 biến riêng biệt. Nhưng nếu những cái tên này không phải là 20, mà là 1000? Và nếu, ngoài ra, bắt buộc phải giữ họ và tên viết tắt riêng biệt ?! Rõ ràng là sẽ sớm trở nên hoàn toàn không thể xử lý khối lượng dữ liệu như vậy trong mã VBA mà không có sự trợ giúp của một mảng.

Mảng đa chiều trong Excel Visual Basic

Các mảng Visual Basic được thảo luận ở trên được coi là một chiều. Điều này có nghĩa là họ lưu trữ một danh sách tên đơn giản. Tuy nhiên, mảng có thể có nhiều thứ nguyên. Ví dụ, một mảng hai chiều có thể được so sánh với một lưới các giá trị.

Giả sử bạn muốn lưu số liệu bán hàng hàng ngày trong tháng 5 cho 5 nhóm khác nhau. Điều này sẽ yêu cầu một mảng hai chiều bao gồm 31 bộ số liệu trong XNUMX ngày. Hãy khai báo một mảng như thế này:

Dim Jan_Sales_Figures (1 to 31, 1 to 5) Dưới dạng tiền tệ

Để truy cập các phần tử mảng Jan_Sales_Số liệu, bạn cần sử dụng hai chỉ mục cho biết ngày trong tháng và số lệnh. Ví dụ: địa chỉ của một phần tử chứa số liệu bán hàng cho 2-ô đội cho ngày 15 Tháng Giêng sẽ được viết như thế này:

Jan_Sales_Figures (15, 2)

Theo cách tương tự, bạn có thể khai báo một mảng có 3 thứ nguyên trở lên - chỉ cần thêm các thứ nguyên bổ sung vào khai báo mảng và sử dụng các chỉ số bổ sung để tham chiếu đến các phần tử của mảng này.

Khai báo mảng trong Excel Visual Basic

Trước đó trong bài viết này, chúng ta đã xem xét một số ví dụ về khai báo mảng trong VBA, nhưng chủ đề này đáng được xem xét kỹ hơn. Như được hiển thị, một mảng một chiều có thể được khai báo như thế này:

Dim Team_Members (1 đến 20) dưới dạng chuỗi

Một khai báo như vậy cho trình biên dịch VBA biết rằng mảng Thành viên của nhóm bao gồm 20 biến có thể được truy cập tại các chỉ số từ 1 đến 20. Tuy nhiên, chúng ta có thể nghĩ đến việc đánh số các biến mảng của mình từ 0 đến 19, trong trường hợp đó mảng nên được khai báo như thế này:

Dim Team_Members (0 đến 19) dưới dạng chuỗi

Trên thực tế, theo mặc định, việc đánh số các phần tử của mảng bắt đầu từ 0 và trong khai báo mảng, chỉ số ban đầu có thể không được chỉ định, như thế này:

Dim Team_Members (19) Dưới dạng chuỗi

Trình biên dịch VBA sẽ coi một mục nhập như khai báo một mảng gồm 20 phần tử với các chỉ số từ 0 đến 19.

Các quy tắc tương tự cũng được áp dụng khi khai báo mảng Visual Basic nhiều chiều. Như đã được trình bày trong một trong các ví dụ, khi khai báo một mảng hai chiều, các chỉ số của các kích thước của nó được phân tách bằng dấu phẩy:

Dim Jan_Sales_Figures (1 to 31, 1 to 5) Dưới dạng tiền tệ

Tuy nhiên, nếu bạn không chỉ định chỉ mục bắt đầu cho cả hai chiều của mảng và khai báo nó như thế này:

Dim Jan_Sales_Figures (31, 5) Dưới dạng tiền tệ

thì mục nhập này sẽ được coi là một mảng hai chiều, chiều đầu tiên chứa 32 phần tử có chỉ số từ 0 đến 31 và chiều thứ hai của mảng chứa 6 phần tử có chỉ số từ 0 đến 5.

Mảng động

Tất cả các mảng trong các ví dụ trên đều có một số kích thước cố định. Tuy nhiên, trong nhiều trường hợp, chúng ta không biết trước kích thước mảng của chúng ta nên là bao nhiêu. Chúng ta có thể thoát khỏi tình huống này bằng cách khai báo một mảng lớn, kích thước của mảng đó chắc chắn sẽ lớn hơn mức cần thiết cho nhiệm vụ của chúng ta. Nhưng một giải pháp như vậy sẽ đòi hỏi rất nhiều bộ nhớ bổ sung và có thể làm chậm chương trình. Có một giải pháp tốt hơn. Chúng ta có thể sử dụng một mảng động - đây là một mảng có kích thước có thể được đặt và thay đổi bất kỳ số lần nào trong quá trình thực thi macro.

Một mảng động được khai báo với các dấu ngoặc đơn trống, như sau:

Dim Team_Members () As String

Tiếp theo, bạn sẽ cần khai báo kích thước của mảng trong quá trình thực thi mã bằng cách sử dụng biểu thức ReDim:

ReDim Team_Members (1 đến 20)

Và nếu trong quá trình thực thi mã, bạn cần thay đổi lại kích thước của mảng, thì bạn có thể sử dụng lại biểu thức ReDim:

If Team_Size> 20 then ReDim Team_Members (1 To Team_Size) Kết thúc Nếu

Hãy nhớ rằng việc thay đổi kích thước một mảng động theo cách này sẽ dẫn đến việc mất tất cả các giá trị được lưu trữ trong mảng. Để lưu trữ dữ liệu đã có trong mảng, bạn cần sử dụng từ khóa Bảo quảnnhư hình dưới đây:

If Team_Size> 20 then ReDim Preserve Team_Members (1 To Team_Size) Kết thúc Nếu

Thật không may là từ khóa Bảo quản chỉ có thể được sử dụng để thay đổi giới hạn trên của một thứ nguyên mảng. Giới hạn dưới của một mảng không thể được thay đổi theo cách này. Ngoài ra, nếu mảng có nhiều thứ nguyên, thì sử dụng từ khóa Bảo quản, chỉ có thể thay đổi kích thước cuối cùng của mảng.

Bình luận