Trong các bài viết trước chúng ta đã tìm hiểu về cách khai báo mảng trong VBA. Nhưng trong quá trình làm việc kích thước mảng có thể bị thay đổi (mảng động), khi đó bạn có thể sử dụng từ khóa ReDim để tái phân bổ lại kích thước của mảng. Trong bài viết này chúng ta hãy cùng Gitiho tìm hiểu cách sử dụng khai báo ReDim trong VBA nhé:
Trong VBA từ khóa ReDim được sử dụng trong cú pháp sau:
ReDim [Preserve] arrayName(new_size)
Trong đó:
Để hiểu rõ hơn cách dùng ReDim, chúng ta hãy theo dõi ví dụ dưới đây:
Tiếp theo chúng ta vào trong cửa sổ VBA, tạo 1 Module và đặt vào trong Module các dòng lệnh sau đây:
1. Tạo cú pháp khai báo các biến liên quan tới mảng
Đầu tiên ta khai báo tên mảng động là các số. Ngoài ra khai báo 2 biến kiểu Integer. Một cái đặt tên là Size và một cái đặt tên là i.
Dim numbers() As Integer, size As Integer, i As Integer
Trong đó các biến có mục đích như sau:
2. Tiếp theo chúng ta xác định kích thước của mảng.
Hãy hình dung bạn có thể nhập thêm hoặc xóa bớt các phần tử trong cột A (các phần tử trong mảng sẽ thay đổi), khi đó để có thể biết cột A có mấy phần tử thì chúng ta dùng hàm COUNTA trong VBA như sau:
size = WorksheetFunction.CountA(Worksheets(1).Columns(1))
Trong đó:
Khi đó size sẽ nhận giá trị là kết quả của hàm COUNTA, tức là đếm xem có bao nhiêu ô không phải ô trống trong cột A. Đây chính là kích thước của mảng cần xác định.
3. Sử dụng cú pháp ReDim để xác định kích thước cho mảng
Chúng ta viết như sau:
ReDim numbers(size)4. Tiếp theo ta tạo từng phần tử của mảng bằng cách sử dụng một vòng lặp.
For i = 1 To size
numbers(i) = Cells(i, 1).Value
Next i
Như vậy từng giá trị trong cột A sẽ được nạp vào trong mảng
Câu lệnh hoàn chỉnh như sau:
Sub Test_Array_01()
Dim numbers() As Integer, size As Integer, i As Integer
size = WorksheetFunction.CountA(Worksheets(1).Columns(1))
ReDim numbers(size)
For i = 1 To size
numbers(i) = Cells(i, 1).Value
Next i
End Sub
Tuy nhiên trong câu lệnh này chúng ta chỉ biết VBA đã ghi nhận mảng, nhưng không hiển thị bất kỳ nội dung nào trên màn hình khi chạy Sub trên.
Một số câu lệnh sau đây sẽ giúp bạn nhận được kết quả của mảng thông qua MsgBox:
5. Hiển thị phần tử cuối củng của mảng bằng MsgBox.
MsgBox numbers(size)
Đưa câu lệnh này vào trong Sub Test_Array_01 chúng ta có:
Sub Test_Array_01()
Dim numbers() As Integer, size As Integer, i As Integer
size = WorksheetFunction.CountA(Worksheets(1).Columns(1))
ReDim numbers(size)
For i = 1 To size
numbers(i) = Cells(i, 1).Value
Next i
MsgBox numbers(size)
End Sub
Chạy sub này (có thể gán macro vào trong Command button rồi bấm nút để chạy sub) chúng ta có kết quả là:
Bây giờ hãy thêm một số nội dung khác vào cột A:
Nhấn vào Command Button một lần nữa chúng ta có kết quả là:
Bạn có thể thấy kích thước mảng đã thay đổi và giá trị phần tử cuối cùng trong mảng đã khác. Như vậy VBA đã tự động cập nhật lại mảng thành công.
6. Bây giờ hãy thử xóa dòng lệnh ở mục 5 ( MsgBox numbers(size) ), đặt câu lệnh sau đây vào bên dưới
ReDim numbers(3)
MsgBox numbers(1)
Câu lệnh này có ý nghĩa là: Đặt lại mảng với kích thước là 3 phần tử, nhưng không xác định cụ thể là phần tử nào.
Câu lệnh đầy đủ:
Sub Test_Array_01()
Dim numbers() As Integer, size As Integer, i As Integer
size = WorksheetFunction.CountA(Worksheets(1).Columns(1))
ReDim numbers(size)
For i = 1 To size
numbers(i) = Cells(i, 1).Value
Next i
ReDim numbers(3)
MsgBox numbers(1)
End Sub
Khi gọi MsgBox thể hiện giá trị thứ 1 trong mảng, chúng ta có kết quả là:
điều này có nghĩa là mảng đang trống, phần tử thứ nhất đang là 0 (không nhận giá trị trong cột A như ở trên nữa).
Như vậy cú pháp ReDim thứ hai đã xóa bỏ kích thước và giá trị bên trong mảng, đồng thời đặt lại mảng theo kích thước mới và không có phần tử nào trong mảng. Thật tuyệt diệu phải không.
VBA có thể còn làm bạn bất ngờ hơn nữa trong việc xử lý dữ liệu phức tạp, tự động hóa quy trình lặp lại, giúp bạn gia tăng hiệu suất và tiết kiệm thời gian đáng kể. Khám phá ngay những lợi ích tuyệt vời mà VBA có thể mang lại cho công việc thông qua các khóa học VBA Excel online của Gitiho dưới đây:
7. Thay vì sử dụng ReDim đặt lại toàn bộ mảng mà không có sẵn giá trị bên trong, chúng ta có thể sử dụng cú pháp sau đây để đặt lại mảng mà vẫn giữ lại các giá trị có sẵn (phần in chữ màu đỏ):
Sub Test_Array_01()
Dim numbers() As Integer, size As Integer, i As Integer
size = WorksheetFunction.CountA(Worksheets(1).Columns(1))
ReDim numbers(size)
For i = 1 To size
numbers(i) = Cells(i, 1).Value
Next i
ReDim Preserve numbers(3)
MsgBox numbers(1)
End Sub
Khi chạy lệnh này chúng ta thu được kết quả là:
Như vậy dù đặt lại mảng với cú pháp ReDim nhưng chúng ta thấy các phần tử có sẵn bên trong mảng cũ vẫn được giữ lại trong mảng mới. Số 5 chính là phần tử đầu tiên trong mảng (tương ứng với giá trị trong ô A1)
Tài liệu kèm theo bài viết
Nếu công việc của bạn liên quan nhiều đến quản lý, phân tích dữ liệu và làm báo cáo trên bảng tính thì giỏi Excel thôi chưa đủ. Nếu biết thêm về VBA sẽ giúp bạn tiết kiệm tối đa thời gian làm việc nhờ làm báo cáo tự động, phân tích và xử lý số liệu chính xác tuyệt đối, đặc biệt công cần lọ mọ sửa thủ công,…
Tất tần tật những kiến thức từ cơ bản đến nâng cao về cách sử dụng VBA trong Excel sẽ được đề cập trong khóa học VBAG01: Tuyệt đỉnh VBA - Tự động hóa Excel với lập trình VBA tại Gitiho
Hãy nhấn vào Học thử hoặc Đăng ký ngay!