Mảng VBA là một phần rất quan trọng trong lập trình xử lý dữ liệu trong VBA. Sử dụng mảng trong Vba sẽ giúp bạn lưu được nhiều dữ liệu tạm vào trong một biến với kiểu dữ liệu Array.
Vì lưu trữ được nhiều dữ liệu nên xử lý dữ liệu bởi chương trình sẽ được thực thi một cách nhanh chóng. Điều này sẽ rất tối ưu trong việc đọc ghi dữ liệu giữa VBA vào bảng tính Excel.
Các dạng khai báo mảng trong VBA
Mảng có thể được khai bao theo một số cách khác nhau.
Bạn có thể khai bảo mảng không cần xác định trước số phần tử. Hoặc khai báo kèm số phần tử. Hoặc khai báo và gán các giá trị cho từng phần tử ban đầu.
Sub mangArr()
Dim mangDulieu1()
Dim mangDulieu2(3)
Dim mangDulieu3
mangDulieu3 = Array("Sheet1", "Sheet2", "Sheet3")
Dim mangDulieu4(3 to 5)
End Sub
Code language: JavaScript (javascript)
Trong ví dụ trên, bạn có thể hiểu như sau:
- mangDulieu1(): đang được khai báo không xác định số phần tử. (Đây là khai báo mảng động, bạn sẽ tìm hiểu rõ hơn trong phần sau của bài viết).
- mangDulieu2(3): ở kiểu khai báo này, mảng sẽ có kích thước gồm 3 phần tử. Phần tử đầu tiên có vị trí là 0.
- mangDulieu3: đây là kiểu khai báo mảng theo phương thức Array. Số phần tử trong Array cũng là số phần tử của mảng. Bạn có thể thay đổi giá trị của từng phần tử.
- mangDulieu4(3 to 5): với kiểu khai báo này, bạn cũng đã xác định được số phần tử của mảng. Nhưng phần tử đầu tiên sẽ có vị trí là 3.
Ngoài ra, bạn có thể định sẵn kiểu dữ liệu VBA cho phần tử trong mảng bằng kiểu khai báo như sau:
Dim mangdulieu As Integer
Code language: PHP (php)
Với kiểu khai báo trên, các phần tử trong mảng chỉ được phép là số.
Cách gán và đọc giá trị từng phần tử trong mảng
Để gán giá trị vào mảng thì ở bất kỳ kiểu khai báo nào, bạn cũng cần phải xác định số và vị trí cho từng phần tử của mảng.
Ví dụ:
Sub mangArr3()
Dim mangDulieu2(3)
mangDulieu2(0) = "Sheet1"
mangDulieu2(1) = "Sheet2"
mangDulieu2(2) = "Sheet3"
MsgBox ("Mang co: " & UBound(mangDulieu2) & " phan tu" & vbNewLine & _
"Phan tu thu 0: " & mangDulieu2(0) & vbNewLine & _
"Phan tu thu 1: " & mangDulieu2(1) & vbNewLine & _
"Phan tu thu 2: " & mangDulieu2(2))
End Sub
Code language: JavaScript (javascript)
Trong đó:
- Kiểu khai báo mảng có 3 phần tử, và thứ tự bắt đầu sẽ có vị trí là 0.
- mangDulieu2(0) = “Sheet1” : tương ứng với gán giá trị vào mảng ở vị trí thứ 0.
- Đọc giá trị của mảng thì cần xác định được vị trí phần tử trong mảng. Ví dụ lấy đọc phần tử thứ 1, bạn sử dụng mangDulieu2(1)
- Với lệnh UBound(mangDulieu2) nó sẽ giúp bạn lấy được số phần tử trong mảng.
Ví dụ 2:
Sub mangArr4()
Dim mangDulieu2(2 To 4)
mangDulieu2(2) = "Sheet1"
mangDulieu2(3) = "Sheet2"
mangDulieu2(4) = "Sheet3"
MsgBox ("Mang co: " & (UBound(mangDulieu2) - LBound(mangDulieu2)) +1 & " phan tu" & vbNewLine & _
"Phan tu thu 2: " & mangDulieu2(2) & vbNewLine & _
"Phan tu thu 3: " & mangDulieu2(3) & vbNewLine & _
"Phan tu thu 4: " & mangDulieu2(4))
End Sub
Code language: JavaScript (javascript)
Trong đó, bạn lưu ý:
- Mảng được khai báo từ vị trí bắt đầu là 2 và kết thúc là 4 => mảng sẽ có 3 phần tử tương ứng với vị trí 2,3 và 4.
- Việc gán và đọc giá trị cũng phải tương ứng với vị trí phần tử khai báo.
- UBound(mangDulieu2): xác định chỉ số lớn nhất trong mảng là 4.
- LBound(mangDulieu2): xác đinh chỉ số nhỏ nhất trong mảng là 2.
Mảng 2 chiều trong VBA
Với mảng 2 chiều, mỗi phần tử trong mảng 2 chiều, bạn sẽ cần xác định nó bằng vị trí ở hàng và cột.
Để khai báo mảng 2 chiều trong VBA bạn có thể sử dụng:
Dim mangDulieu1(3, 4)
Dim mangDulieu2(2 To 4, 1 To 4)
Trong 2 kiểu khai báo trên, chúng ta sẽ có mảng 2 chiều với 3 hàng và 4 cột.
Việc xác định vị trí ban đầu cũng tương tự như mảng 1 chiều. Nếu không chỉ số vị trí bắt đầu, thì phần tử đầu tiên sẽ bắt đầu từ hàng 0 và cột 0. Còn ở cách khải báo thứ 2, phần tử đầu tiên sẽ có hàng là 2 và cột là 1.
Vậy để gán giá trị cho 1 phần tử mảng 2 chiều, bạn sẽ cần xác định cả hàng và cột.
mangDulieu1(0,0) = "0"
mangDulieu1(1,0) = "1"
mangDulieu1(2,0) = "1"
Code language: JavaScript (javascript)
Tương tự, để đọc giá trị của 1 phần tử trong mảng.
MsgBox(mangDulieu1(1, 0))
Đối với mảng 2 chiều, sẽ rất hiệu quả nếu bạn sử dụng với vòng lặp for. Sẽ cần 2 vòng lặp lồng nhau, 1 vòng lặp cho hàng và 1 vòng lặp cho cột.
For i = 0 To 2
For j = 0 To 3
MsgBox(mangDulieu1(i, j))
Next j
Next i
Mảng động trong VBA
Mảng động là mảng mà khi khai báo bạn sẽ không khai báo số phần tử xác định cho nó.
Mà khi cần sử dụng bạn sẽ cần xác định phần tử cho nó trước thông qua câu lệnh ReDim.
Ví dụ: khai báo mảng động 1 chiều.
Dim mangDulieu1()
Với khai báo trên, bạn chưa thể gán hay đọc giá trị trong mảng được. Vì thế, khi cần sử dụng đến bạn sẽ khai báo mảng với ReDim và số phần tử cụ thể.
ReDim mangDulieu1(5)
Như thế, bạn sẽ gán và đọc giá trị cho mảng được.
Nhưng khi sử dụng mảng động, thì bạn có thể linh động hơn nếu số phần tử cần được mở rộng hơn với khai báo như sau.
ReDim Preserve mangDulieu1(10)
Như trên, bạn sẽ mổ rộng số phần tử mảng với 10 phần tử và các phần tử đã sử dụng trước đó sẽ vẫn được giữ nguyên nếu không thay đối giá trị của nó.
Bạn hãy xem ví dụ sau.
Sub mangArr6()
Dim mangDulieu1()
ReDim mangDulieu1(5)
mangDulieu1(0) = "A0"
mangDulieu1(1) = "A1"
mangDulieu1(2) = "A2"
mangDulieu1(3) = "A3"
mangDulieu1(4) = "A4"
ReDim Preserve mangDulieu1(8)
mangDulieu1(5) = "A5"
mangDulieu1(6) = "A6"
mangDulieu1(7) = "A7"
Dim str As String
For i = 0 To 7
str = str & " " & mangDulieu1(i)
Next
MsgBox (str)
End Sub
Code language: JavaScript (javascript)
Cách gán giá trị từ bảng tính Excel vào mảng VBA
Sau khi bạn tìm hiểu quả các sử dụng mảng trong VBA bạn có thể áp dụng nó để đọc dữ liệu từ 1 Range bảng tính vào mảng.
Ví dụ: đọc giá trị 1 Range chiều vào mảng 1 chiều.
Sub mangVBA()
Dim mangArr() As Variant
mangArr = Sheets("Sheet1").Range("A1:A10").Value
For pos = 1 To UBound(mangArr, 1)
MsgBox(mangArr(pos, 1))
Next pos
End Sub
Code language: PHP (php)
Ví dụ: đọc giá trị 1 Range 2 chiều vào mảng 2 chiều.
Sub mangVBA()
Dim mangArr() As Variant
mangArr = Sheets("Sheet1").Range("A1:C10").Value
For pos1 = 1 To UBound(mangArr, 1)
For pos2 = 1 To UBound(mangArr, 2)
MsgBox (mangArr(pos1, pos2))
Next pos2
Next pos1
End Sub
Code language: PHP (php)
Trong 2 ví dụ về gán giá trị từ bảng tính vào mảng VBA, bạn để ý.
- Hàng sẽ có chỉ số là 1, tương ứng là UBound(mangArr, 1)
- Cột có chỉ số là 2, tương ứng là UBound(mangArr, 2)
Kết luận
Như vậy mình vừa chia sẻ với bạn cách sử dụng mảng trong VBA. Với việc hướng dẫn bằng cách sử dụng một số ví dụ đơn giản, hy vọng bạn sẽ có thể áp dụng nó vào các bài toán sử dụng VBA trong Excel.
Ngoài ra, bạn có thể tham khảo thêm các cài viết về VBA của mình trong VBA Excel.