VBA - Khai báo (Dim), Tạo và Khởi tạo Biến mảng

Hướng dẫn này sẽ trình bày cách Khai báo (Dim), Tạo và Khởi tạo các biến mảng trong VBA

Biến mảng VBA là gì?

Một biến mảng VBA có thể được coi là một nhóm các biến, được lưu trữ dưới cùng tên và có cùng kiểu dữ liệu. Một mảng có thể lưu trữ văn bản, số hoặc đối tượng.

Bạn tham chiếu đến một phần tử trong một mảng bằng cách sử dụng số chỉ mục của nó.

Bạn có thể khai báo một biến mảng giống như cách bạn khai báo bất kỳ biến nào khác bằng cách sử dụng từ khóa Dim, Static, Public hoặc Private.

Mảng tĩnh

Có 2 loại mảng - Tĩnh và Động. Một mảng tĩnh được khai báo với kích thước được chỉ định khi bạn khai báo mảng ban đầu. Nó còn được gọi là Mảng cố định.

1 Dim INTA (4) là số nguyên

Mảng trên được khai báo bằng câu lệnh Dim ở cấp Thủ tục hoặc Mô-đun và kích thước của mảng là 5 vì chúng ta chưa khai báo giá trị LBound của mảng.

Không, đó không phải là lỗi đánh máy! Kích thước mảng là 5, mặc dù nhập 4 vào mảng. Điều này là do các chỉ mục mảng tự động bắt đầu từ 0.

Chỉ mục mảng

Chỉ mục mảng tự động bắt đầu từ 0 trừ khi Tùy chọn Cơ sở 1 được khai báo ở đầu mô-đun mã của bạn.

Nếu như Tùy chọn Cơ sở 1 được khai báo thì mảng sẽ tự động bắt đầu từ 1.

Tuy nhiên, tôi thấy việc khai báo các biến theo cách như vậy là có vấn đề. Người đánh giá mã có thể không biết rằng các mảng bắt đầu từ 0 hoặc khai báo Cơ sở 1 của Tùy chọn

Thay vào đó, tôi muốn khai báo rõ ràng vị trí bắt đầu và kết thúc của mảng:

1 Dim intA (2 đến 5) dưới dạng số nguyên

Lưu ý rằng khi bạn làm như vậy, bạn có thể bắt đầu mảng ở bất kỳ số nào (không chỉ 1 hoặc 0).

Mảng động

Biến Mảng động là một mảng có thể thay đổi kích thước trong thời gian chạy. Bạn khai báo các biến động mà không có một kích thước.

1 Dim intA () dưới dạng số nguyên

Bạn có thể sử dụng câu lệnh ReDim để chỉ định kích thước của Mảng sau khi mảng đã được tạo.

1 ReDim intA (2)

Bạn có thể thay đổi kích thước một mảng động bất kỳ lúc nào. Tuy nhiên, khi sử dụng Câu lệnh ReDim, tất cả các giá trị hiện có sẽ bị xóa. Để bảo toàn các giá trị mảng hiện có, hãy sử dụng Bảo tồn ReDim thay thế.

1 ReDim Bảo tồn intA (2)

Bạn có thể khai báo một mảng động ở cấp Thủ tục, Mô-đun hoặc Toàn cục, nhưng bạn chỉ có thể sử dụng câu lệnh ReDim trong một Thủ tục.

Mảng biến thể

Mảng biến thể là mảng Động dễ làm việc hơn.

1 Dim varNames ()

Lưu ý rằng bạn không cần chỉ định kiểu dữ liệu (nó được giả định là biến thể) hoặc kích thước mảng.

Như chúng ta sẽ thấy bên dưới, bạn có thể khởi tạo các mảng biến thể bằng cách sử dụng Hàm mảng (trước tiên không cần thay đổi kích thước mảng)!

Khai báo module & Công Mảng

Như được hiển thị ở trên, các mảng có thể được khai báo trong các thủ tục, để sử dụng trong thủ tục đó:

1234 Sub StaticArray ()'khai báo mảng với giá trị LBound là 1 và giá trị UBound là 4Dim IntA (1 đến 4) dưới dạng Số nguyênKết thúc Sub

Nhưng chúng cũng có thể được khai báo ở cấp độ Mô-đun hoặc Toàn cục.

1234567 Tùy chọn rõ ràng'khai báo mảng với giá trị LBound là 1 và giá trị UBound là 4Dim IntA (1 đến 4) dưới dạng Số nguyênSub StaticArray ()Kết thúc Sub

Trong ví dụ này, biến mảng có thể được gọi ở bất kỳ đâu trong mô-đun mã này. Thay vào đó, bạn có thể khai báo một mảng công khai có thể được sử dụng trong suốt Dự án VBA của bạn (xem phần tiếp theo).

Khai báo một mảng công khai

Bạn khai báo một mảng Public Static như bạn sẽ khai báo một Biến công khai.

1 StrNames công khai (3) dưới dạng chuỗi

Khai báo này sẽ cần ở đầu mô-đun của bạn, bên dưới Tùy chọn rõ ràng. Sau đó, nó có thể được sử dụng trong suốt dự án VBA của bạn trong bất kỳ mô-đun hoặc thủ tục nào.

Nếu bạn khai báo Mảng ở đầu mô-đun, nhưng với từ khóa Dim, thì việc sử dụng mảng đó bị hạn chế đối với mô-đun riêng lẻ đó. Cố gắng sử dụng Mảng trong một mô-đun riêng biệt sẽ dẫn đến lỗi.

Khởi tạo mảng

Bạn có thể gán giá trị cho một mảng tĩnh theo cách sau.

1234567891011 Sub StaticArray ()'khai báo mảng với giá trị LBound là 1 và giá trị UBound là 4Dim IntA (1 đến 4) dưới dạng Số nguyên'khởi tạo mảngIntA (1) = 10IntA (2) = 20IntA (3) = 30IntA (4) = 40'hiển thị kết quả của vị trí 2 của mảng trong cửa sổ ngay lập tứcDebug.Print IntA (2)Kết thúc Sub

Nếu bạn chạy quy trình trên, giá trị 20 sẽ được hiển thị trong cửa sổ ngay lập tức.

Bạn cũng có thể gán các giá trị cho Mảng động theo cùng một kiểu

12345678910111213 Sub DynamicArray ()'khai báo một mảng động nhưng bỏ qua các giá trị bị ràng buộcDim INTA () như Integer'khởi tạo mảngReDim IntA (1 đến 4)IntA (1) = 10IntA (2) = 20IntA (3) = 30IntA (4) = 40'hiển thị kết quả của vị trí 2 của mảng trong cửa sổ ngay lập tứcDebug.PrintIntA (2)Kết thúc Sub

Hàm mảng

Tuy vậy, chỉ với mảng biến thể, bạn có thể sử dụng Hàm mảng có thể dễ dàng hơn so với sử dụng phương pháp tiêu chuẩn.

12 'điền vào mảngintA () = Mảng (10, 20, 30, 40)

Điền mảng bằng vòng lặp

Bạn cũng có thể điền các mảng bằng cách lặp qua một loạt các ô trong Excel

1234567891011121314151617 Kiểm tra phụDynamicArrayFromExcel ()'khai báo mảngDim strNames () Dưới dạng chuỗi'khai báo một số nguyên để đếm các hàng trong một phạm viDim n As Integer'khai báo một số nguyên cho vòng lặpDim i As Integer'Đếm các hàng trong một phạm vin = Range ("A1", Range ("A1"). End (xlDown)). Rows.Count'redim mảng đến số lượng hàng trong phạm vi.ReDim strNames (n)Đối với i = 0 Đến nstrNames (i) = Range ("A1"). Offset (i + 1, 0)Tiếp theo tôi'hiển thị các giá trị trong mảngMsgBox Tham gia (strNames ())Kết thúc Sub

Khởi tạo lại Mảng

Bạn có thể khởi tạo lại mảng của mình ở bất kỳ giai đoạn nào của mã, nhưng sau đó bạn sẽ mất giá trị ban đầu có ở vị trí đó trong mảng của bạn.

1234567891011121314 Sub StaticArray ()'khai báo mảng với giá trị LBound là 1 và giá trị UBound là 4Dim IntA (1 đến 4) dưới dạng Số nguyên'khởi tạo mảngIntA (1) = 10IntA (2) = 20IntA (3) = 30IntA (4) = 40'hiển thị kết quả của vị trí 2 của mảng trong cửa sổ ngay lập tứcDebug.Print IntA (2)'khởi tạo lại mảngintA (2) = 200Debug.Print IntA (2)Kết thúc Sub

Trong ví dụ trên, mảng Static sẽ giữ tất cả các giá trị, ngoại trừ giá trị ở vị trí 2 - giá trị đó sẽ thay đổi thành 200.

Sử dụng ReDim

Nếu bạn đang sử dụng Mảng Động, câu lệnh ReDim được sử dụng để đặt kích thước Mảng của bạn. Sau đó, bạn có thể sử dụng câu lệnh ReDim trong mã của mình để thay đổi kích thước của Mảng nhiều lần nếu bạn cần. Dòng mã bên dưới sẽ khởi tạo lại Mảng intA để có kích thước là 2 (Hãy nhớ - chỉ mục Mảng bắt đầu bằng 0!)

1 ReDim intA (1) dưới dạng Số nguyên

Vì vậy, mã bao gồm câu lệnh ReDim sẽ giống như ví dụ bên dưới.

1234567891011121314151617 Sub TestDynamicArray ()'khai báo mảngDim INTA () As IntegerReDim INTA (2)'Cư mảng với những con sốintA (0) = 2intA (1) = 5INTA (2) = 9'hiển thị số ở vị trí 1Debug.Print intA (1)'ReDim mảng để thay đổi kích thướcReDim intA (3)intA (0) = 6intA (1) = 8'Hiển thị số ở vị trí 1 thời gian nàyDebug.Print intA (1)Kết thúc Sub

Nếu bạn chạy quy trình trên, giá trị 5 sẽ được hiển thị trong cửa sổ ngay lập tức và sau đó giá trị 8 sẽ được hiển thị khi chúng ta đã thay đổi kích thước mảng bằng cách sử dụng ReDim và mô phỏng lại nó. Tuy nhiên, vì chúng tôi chưa điền IntA (2) và chúng tôi không sử dụng Re-Dim Preserve, giá trị ở vị trí đó trong mảng sẽ bị xóa và cả vị trí 3 và 4 trong mảng sẽ bằng không.

Sử dụng ReDim Preserve

Nếu chúng ta sử dụng ReDim Preserve, nó sẽ giữ nguyên các giá trị ban đầu có trong mảng.

1234567891011121314151617 Sub TestDynamicArray ()'khai báo mảngDim INTA () As IntegerReDim intA (2)'điền vào mảng bằng các sốintA (0) = 2intA (1) = 5intA (2) = 9'hiển thị số ở vị trí 2Debug.Print intA (2)'redim mảngReDim intA (3)intA (0) = 6intA (1) = 8'hiển thị lại số ở vị trí 2Debug.Print intA (2)Kết thúc Sub

Trong cả hai hộp thông báo hiển thị ở trên, số 9 sẽ xuất hiện dưới dạng câu lệnh ReDim Preserve đã giữ giá trị đó ở vị trí đó.

Bạn sẽ giúp sự phát triển của trang web, chia sẻ trang web với bạn bè

wave wave wave wave wave