Kỹ thuật khai báo mảng động trong VBA với cú pháp ReDim

Nội dung được viết bởi Đỗ Thúy Quỳnh

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

Cách sử dụng từ khóa ReDim để khai báo mảng động trong VBA

Trong VBA từ khóa ReDim được sử dụng trong cú pháp sau:

ReDim [Preserve] arrayName(new_size)

Trong đó:

  • Preserve: sử dụng từ khóa này để giữ nguyên một số dữ liệu trong một mảng không bị mất đi khi thay đổi kích thước mảng. Đây là tham số không bắt buộc.
  • arrayName: là tên của biến mảng đã có sẵn từ trước. Đây là tham số bắt buộc phải có.
  • new_size : là kích thước mới của mảng sau khi thay đổi. Đây là tham số bắt buộc phải có.

Để hiểu rõ hơn cách dùng ReDim, chúng ta hãy theo dõi ví dụ dưới đây:

Kỹ thuật khai báo mảng động trong VBA với cú pháp ReDim

  • Sheet đang làm việc là Sheet thứ nhất trong workbook (Sheet ngoài cùng bên trái trên thanh SheetTab). Tốt nhất là chúng ta làm việc trên 1 Workbook chỉ có duy nhất 1 Sheet.
  • Cột A trong Sheet này sẽ được nhập các số nguyên bất kỳ, tùy ý. Mỗi ô nhập 1 số.
  • Đặt một nút lệnh (Command Button) vào trong Sheet.

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:

  • numbers là tên biến đại diện cho mảng, trong mảng này chứa dữ liệu kiểu số nguyên (integer)
  • size là kích thước của mảng
  • i là từng phần tử trong mảng

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 đó:

  • Worksheets(1) : Sheet thứ nhất trong Workbook đang làm việc (đã được nhắc đến trong điều kiện ở đầu bài)
  • Columns(1) : là cột thứ 1 trong Sheet (cột A)
     

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

Kỹ thuật khai báo mảng động trong VBA với cú pháp ReDim

Bây giờ hãy thêm một số nội dung khác vào cột A:

Kỹ thuật khai báo mảng động trong VBA với cú pháp ReDim

Nhấn vào Command Button một lần nữa chúng ta có kết quả là:

Kỹ thuật khai báo mảng động trong VBA với cú pháp ReDim

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.

Xóa nội dung trong mảng và đặt lại kích thước cho mả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à:

Kỹ thuật khai báo mảng động trong VBA với cú pháp ReDim

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

Giữ nguyên phần tử cũ trong mảng khi đặt lại mảng

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

Kỹ thuật khai báo mảng động trong VBA với cú pháp ReDim

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)

 

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 chỉ dùng Excel, bạn sẽ thường xuyên phải OT đến mỗi kỳ làm báo cáo, stress vì sai dữ liệu do nhập thủ công, hay gặp vấn đề các hàm load chậm do dữ liệu quá nặng,...

Có lẽ bạn đã từng nghe ở đâu đó về công cụ lập trình VBA trên Excel, 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,...

Nhưng bạn không dám nghĩ một ngày nào đó mình sẽ dùng VBA bởi vì mình không biết lập trình, sửa code và gỡ lỗi mã. Tin mình đi, bạn hoàn toàn có thể thành thạo công cụ này ngay cả khi không giỏi Excel, không biết lập trình với khóa học VBAG01: Tuyệt đỉnh VBA - Tự động hóa Excel với lập trình VBA tại Gitiho.

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 khiến mọi thao tác thủ công trên Excel gần như được loại bỏ hoàn toàn. 

Hãy nhấn vào Học thử hoặc Đăng ký ngay để cảm nhận sự “vi diệu” mà VBA mang lại cho công việc của bạn nhé!

5/5 - (1 bình chọn)

5/5 - (1 bình chọn)

0 thảo luận

@ 2020 - Bản quyền của Công ty cổ phần công nghệ giáo dục Gitiho Việt Nam
Giấy chứng nhận Đăng ký doanh nghiệp số: 0109077145, cấp bởi Sở kế hoạch và đầu tư TP. Hà Nội
Giấy phép mạng xã hội số: 588, cấp bởi Bộ thông tin và truyền thông