Đỗ Thúy Quỳnh
Đỗ Thúy Quỳnh
Thảo luận 0 thảo luận
Vỗ tay 0 vỗ tay
Lượt xem 2672 lượt xem

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

Dec 04 2020

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:

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

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.

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

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

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

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)

Cùng tham gia cộng đồng hỏi đáp về chủ đề VBA

Thảo luận 0 câu trả lời
Lượt xem 2672 lượt xem
Vỗ tay vỗ tay

0 Bình 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