Hướng dẫn này sẽ giải thích Mảng VBA, các loại mảng khác nhau, mảng biến thể và phương pháp mảng với sự trợ giúp của các ví dụ lập trình:
Biến VBA thông thường là trình giữ chỗ lưu trữ giá trị của một dữ liệu duy nhất. Nó có mối quan hệ 1-1, tức là 1 biến cho 1 giá trị.
Bây giờ, hãy tưởng tượng việc lưu trữ nhiều giá trị cùng loại. Thay vì tạo nhiều biến, bạn chỉ có thể tạo một biến và lưu trữ tất cả các loại giá trị giống nhau. Biến này được gọi là Mảng.
Trong hướng dẫn này, bạn sẽ biết thế nào là mảng VBA, mảng một chiều và mảng hai chiều cùng với các loại mảng khác nhau như Cố định và Động. Chúng ta cũng sẽ hiểu các phương thức mảng khác nhau được sử dụng trong VBA.
Mảng VBA
Mảng là một loại biến đặc biệt có thể lưu trữ nhiều giá trị của cùng một kiểu dữ liệu .
Ví dụ nếu bạn có tên của 100 nhân viên thì thay vì tạo 100 biến kiểu dữ liệu chuỗi, bạn chỉ cần tạo 1 biến mảng kiểu chuỗi và gán 100 giá trị đến cùng một biến mảng.
Mảng một chiều
Mảng có tất cả các phần tử trong một hàng hoặc trong một cột được gọi là mảng một chiều. Liệt kê tên của tất cả các sinh viên trong lớp trong một cột duy nhất là một ví dụ về mảng một chiều. Nó được khai báo như hìnhmảng được khai báo như hình bên dưới.
Dim ArrayName(FirstIndex To LastIndex, FirstIndex To LastIndex) dưới dạng Kiểu dữ liệu.
Ví dụ: Dimmark(1 To 3 , 0 đến 2) Là số nguyên
Hỏi #3) Làm cách nào để chuyển đổi Phạm vi thành Mảng?
Trả lời: Chúng ta có thể sử dụng hàm Chuyển vị để chuyển đổi phạm vi thành một mảng. Mã này sẽ tạo Mys[10]
Sub Example() Dim Mys As Variant Mys = Application.Transpose(Range("A1:A10")) End Sub
Q #4) Biến thể mảng trong VBA là gì?
Trả lời: Một mảng biến thể sẽ chấp nhận tất cả các loại kiểu dữ liệu cho chỉ mục của nó, tức là bạn có thể lưu trữ các loại giá trị khác nhau trong một mảng.
Ví dụ:
Dim arrayData(3) As Variant
arrayData(0) = “Vikas Vipal”
arrayData(1) = 411234567890#
Các cách thay đổi kích thước mảng trong khi thời gian chạy và cũng bảo toàn các giá trị bằng cách sử dụng bảo toàn redim đã được thảo luận với các ví dụ. Cuối cùng, chúng ta đã học được các phương thức Mảng sẽ giúp chúng ta thực hiện một số thao tác.
bên dưới.Dim arrayname(lowerbound to UpperBound) Là kiểu dữ liệu
Có nhiều cách để khai báo một mảng. Dưới đây là một số ví dụ.
Ví dụ:
#1) Dim MyArrayExample(0 To 3) As Integer
Tạo một mảng có vị trí 0,1,2,3 sẽ chấp nhận các giá trị Số nguyên.
#2) Dim MyArray2(3) As String
Mặc định từ 0 thành 3 và tạo một mảng có vị trí 0,1,2,3 sẽ chấp nhận các giá trị Chuỗi.
#3) Dim MyArray2(13 to 15) As Double
Tạo một mảng bắt đầu từ 13 tức là 13, 14 và 15 và chấp nhận các giá trị Double. Chúng ta đã đề cập đến giới hạn dưới là 13, vì vậy mảng sẽ bắt đầu phân bổ giá trị từ vị trí 13 thay vì 0.
Hãy tạo một đoạn mã đơn giản và hiểu tất cả 3 cách khai báo mảng.
Lưu ý: Để viết Mã VB Mở Microsoft Excel (các phiên bản được hỗ trợ là Excel 2007, 2010, 2013, 2016, 2019). Điều hướng đến Tab Nhà phát triển -> Visual Basic (Hoặc sử dụng phím tắt Alt+F11). Trong trình soạn thảo VB, nhấp vào Chèn -> Mô-đun và dán mã bên dưới.
Hãy xem xét quy trình bên dưới hiển thị các loại khai báo khác nhau.
Private Sub arrayExample1() Dim firstQuarter(0 To 2) As String ‘creates array with index 0,1,2 firstQuarter(0) = "Jan" firstQuarter(1) = "Feb" firstQuarter(2) = "Mar" MsgBox "First Quarter in calendar " & " " & firstQuarter(0) & " " & firstQuarter(1) & " " & firstQuarter(2) End Sub Private Sub arrayExample2() Dim secondQuarter(2) As String ‘creates array with index 0,1,2 secondQuarter(0) = "April" secondQuarter(1) = "May" secondQuarter(2) = "June" MsgBox "Second Quarter in calendar " & " " & secondQuarter(0) & " " & secondQuarter(1) & " " & secondQuarter(2) End Sub Private Sub arrayExample3() Dim thirdQuarter(13 To 15) As String ‘creates array with index 13,14,15 thirdQuarter(13) = "July" thirdQuarter(14) = "Aug" thirdQuarter(15) = "Sep" MsgBox "Third Quarter in calendar " & " " & thirdQuarter(13) & " " & thirdQuarter(14) & " " & thirdQuarter(15) End Sub
Nhấn F5 hoặc nhấn nút chạy trên thanh công cụ để thực thi mã.
Biến thông thường Vs Biến mảng
Bây giờ chúng ta đã biết cách hoạt động của mảng một chiều. Vì vậy, hãy dành một chút thời gian để hiểu tại sao mảng lại rất quan trọng trongngôn ngữ lập trình.
Giả sử bạn cần nhập mức lương của 5 nhân viên. Để đạt được điều này bằng cách sử dụng một biến thông thường, bạn cần tạo 5 biến.
Public Sub RegularVariable() Dim shet As Worksheet Set shet = ThisWorkbook.Worksheets("Sheet1") ' Declare variable for each student Dim Emp1 As String Dim Emp2 As String Dim Emp3 As String Dim Emp4 As String Dim Emp5 As String ' Read student marks from cell Emp1 = shet.Range("A" & 2).Value Emp2 = shet.Range("A" & 3).Value Emp3 = shet.Range("A" & 4).Value Emp4 = shet.Range("A" & 5).Value Emp5 = shet.Range("A" & 6).Value ' Print student marks Debug.Print "Emp Name" Debug.Print Emp1 Debug.Print Emp2 Debug.Print Emp3 Debug.Print Emp4 Debug.Print Emp5 End Sub
Bây giờ, hãy tạo mã tương tự bằng cách sử dụng biến Mảng.
Option Explicit Public Sub ArrayVarible() Dim shet As Worksheet Set shet = ThisWorkbook.Worksheets("Sheet1") Dim Employee(1 To 6) As String Dim i As Integer For i = 1 To 6 Employee(i) = shet.Range("A" & i).Value Debug.Print Employee(i) Next i End Sub
Ở đây, chúng ta vừa sử dụng một biến mảng sẽ lưu trữ tất cả tên nhân viên. Giả sử bạn cần thêm 100 tên nhân viên thì bạn chỉ cần thay đổi kích thước mảng và không phải tạo biến mới.
Điều này sẽ giảm số dòng trong mã và do đó dễ dàng thực hiện dễ hiểu và dễ đọc.
Mảng hai chiều
Mảng 2 chiều có 2 chỉ mục – chỉ mục đầu tiên sẽ đại diện cho các hàng và chỉ mục thứ 2 sẽ đại diện cho cột. Mảng này có nhiều hàng và cột và thường được biểu diễn ở định dạng bảng.
Khai báo mảng 2 mờ như sau:
Dim ArrayName(FirstIndex To LastIndex, FirstIndex To LastIndex) dưới dạng DataType.
Hãy xem xét một ví dụ về lưu trữ điểm của 2 học sinh đạt được trong 3 môn học. Vì vậy, chúng ta sẽ tạo một mảng 2 chiều có 2 hàng và 3 cột.
Chúng ta sẽ bắt đầu mảng từ hàng 1 đến hàng 2 và cột 1 đến cột 3.
Sub Twodim() Dim totalMarks(1 To 2, 1 To 3) As Integer totalMarks(1, 1) = 23 totalMarks(2, 1) = 34 totalMarks(1, 2) = 33 totalMarks(2, 2) = 55 totalMarks(1, 3) = 45 totalMarks(2, 3) = 44 Msgbox “Total Marks in Row 2 and column 2 is “ &totalMarks(2,2) Msgbox “Total Marks in Row 1 and column 3 is “ &totalMarks(1,3) End Sub
Nhấn F5 hoặc Nhấn nút chạy trên thanh công cụ để thực thi mã.
Hàng 2 và Cột 2
Hàng 1 và Cột 3
Mảng cố định
Mảng cố định còn gọi là Mảng tĩnhMảng có giới hạn dưới và giới hạn trên cố định và không thể thay đổi kích thước này trong thời gian chạy. Kích thước của mảng được chỉ định trong quá trình khai báo trong dấu ngoặc đơn. Tất cả các ví dụ trên đều là mảng Cố định vì chúng tôi đã đề cập đến kích thước của nó trong quá trình khai báo.
Mảng cố định thường được sử dụng khi bạn chắc chắn về kích thước của mảng. Ví dụ: số ngày trong một tuần, bạn có thể tạo một mảng có cận dưới 0 và cận trên 6 và đảm bảo rằng bạn sẽ không bao giờ thay đổi kích thước của nó.
Mảng động
Mảng động cho phép chúng ta thay đổi kích thước mảng trong thời gian chạy. Đây là hữu ích khi bạn không chắc chắn về kích thước của mảng. Giả sử trong tuyển sinh đại học, bạn có thể không chắc chắn có bao nhiêu sinh viên thực sự sẽ được nhận vào học, vì vậy bạn không thể xác định quy mô tại thời điểm thiết kế hoặc khai báo.
Khai báo mảng Động cũng tương tự như mảng Tĩnh mảng có dấu ngoặc đơn trống.
Dim Employee() As String
REDIM
Khi muốn thay đổi kích thước, chúng ta cần sử dụng REDIM , chúng ta cần lưu ý rằng không thể thay đổi cận dưới, chúng ta chỉ có thể thay đổi cận trên của mảng.
Sub dynamicArray() Dim dynArray() As String Dim curdate As Date curdate = Now ReDim dynArray(2) ‘ Redim will help to change the array size during runtime dynArray(0) = "John" dynArray(1) = "Tom" dynArray(2) = "Tonny" MsgBox "Students Enrolled after " & curdate & " are “ & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) End Sub
Bây giờ, chúng ta biết mình có thể thay đổi kích thước của mảng trong thời gian chạy, do đó chúng ta có thể sử dụng câu lệnh ReDim bất cứ khi nào chúng ta cần tăng chiều dài của một mảng. Hãy thử Tăng kích thước mảng một lần nữa và thêm một mảng mớitên sinh viên.
Sub RedimExample() Dim dynArray() As String Dim curdate As Date curdate = Now Dim size As Integer ReDim dynArray(2) dynArray(0) = "John" dynArray(1) = "Tom" dynArray(2) = "Tonny" MsgBox "Students Enrolled untill " & curdate & " are " & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) ReDim dynArray(3) ‘ Redim will reinitialise the array and destroy the old values dynArray(3) = "John" MsgBox "Students Enrolled untill " & curdate & " are " & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) & " , " & dynArray(3) End Sub
Bạn sẽ thấy rằng kết quả không hiển thị tên của các sinh viên đã thêm trước đó, nó cho giá trị null. Đó là bởi vì câu lệnh Redim sẽ tạo ra một mảng mới với kích thước mới và hủy các giá trị cũ.
ReDim Preserve
Câu lệnh Represerve giúp chúng ta khắc phục hạn chế của ReDim bằng cách bảo tồn các giá trị cũ và do đó làm tăng kích thước của mảng.
Hãy viết lại đoạn mã trên bằng ReDim Preserve.
Sub preserveExample() Dim dynArray() As String Dim curdate As Date curdate = Now Dim size As Integer ReDim dynArray(2) dynArray(0) = "John" dynArray(1) = "Tom" dynArray(2) = "Tonny" MsgBox "Students Enrolled untill " & curdate & " are " & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) ReDim preserve dynArray(3) ‘ Redim preserve will retain the old values dynArray(3) = "John" MsgBox "Students Enrolled untill " & curdate & " are " & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) & " , " & dynArray(3) End Sub
Như chúng ta đã sử dụng từ khóa bảo toàn, các giá trị đã nhập trước đó sẽ không bị mất và giá trị mới được thêm thành công.
Mảng biến thể
Cho đến bây giờ chúng ta đã thấy một mảng chấp nhận cùng loại giá trị. Bây giờ, hãy khai báo mảng dưới dạng biến thể và lưu trữ các loại dữ liệu khác nhau như Chuỗi, Ngày, Dài, Số nguyên trong một mảng.
Ví dụ:
Sub arrayVariant() Dim arrayData(3) As Variant arrayData(0) = "Vikram Vikrant" arrayData(1) = 411234567890# arrayData(2) = 38 arrayData(3) = "06-09-1972" MsgBox "Details of person " & arrayData(0) & " is " & " Phone No " & arrayData(1) & " ,Id " & arrayData(2) & " ,DOB " & arrayData(3) End Sub
Các phương thức mảng VBA
Có một số phương thức trong mảng VBA sẽ giúp chúng ta thực hiện các chức năng khác nhau, như được đề cập bên dưới.
Sl. STT | Tên | Cú pháp | Mô tả |
---|---|---|---|
1 | Mảng | Mảng(arglist) | Chuyển đổi một biến thể thông thường thành một Mảng. |
2 | Xóa | Xóa tên mảng | Được sử dụng để xác định lại mảng có kích thước cố định và giải phóng bộ nhớ cho Độngmảng. |
3 | IsArray | IsArray (tên biến) | Xác định xem một biến là một mảng. |
4 | Lbound | LBound( ArrayName, [Dimension] ) | Trả về chỉ số dưới thấp nhất của một mảng. |
5 | Ubound | UBound( ArrayName , [Thứ nguyên] ) | Trả về chỉ số dưới cao nhất của một mảng. |
6 | Tách | Split(biểu thức, [ delimiter, [ limit, [ so sánh ]]]) | Tính năng này chia một chuỗi thành nhiều chuỗi con và trả về một mảng dựa trên số 0. |
7 | Tham gia | Tham gia(sourcearray, [ delimiter ]) | Nối nhiều chuỗi con trong một mảng và trả về một giá trị chuỗi . |
8 | Bộ lọc | Bộ lọc(mảng nguồn, khớp, [ bao gồm, [ so sánh ]]) | Bộ lọc sẽ cho phép chúng tôi tìm kiếm kết quả phù hợp được chỉ định từ một mảng. |
Hãy thảo luận chi tiết về từng bộ lọc bằng một ví dụ.
#1) Mảng
Hãy khai báo một biến biến thể thông thường và sử dụng nó như một mảng. Khi bạn muốn thay đổi một biến biến thể thông thường thành một mảng, chúng ta cần sử dụng hàm ARRAY như trong ví dụ bên dưới.
Hàm mảng chấp nhận đối số chứa các giá trị được phân tách bằng dấu phẩy . Các giá trị này được gán như một phần tử của mảng.
Sub variantArray() Dim varData As Variant varData = Array("Mon Bel", "+61 112334123", 567, "06-09-1972") MsgBox "Details of person " & varData(0) & " is " & " Phone No " & varData(1) & " ,Id " & varData(2) & " ,DOB " & varData(3) End Sub
Bạn phải xác định một biến mảng bằng chỉ mục,do đó trong ví dụ trên, các giá trị được truy xuất dưới dạng varData(0) varData(2) varData(3).
#2) Erase
Hàm này sẽ xóa tất cả các giá trị đã nhập cho một mảng có kích thước cố định và sẽ giải phóng không gian bộ nhớ cho một mảng động.
Cú pháp: Xóa tên mảng
Xóa có hành vi khác nhau đối với các loại dữ liệu khác nhau như đã cho bên dưới.
- Đối với một số cố định: Tất cả các giá trị được đặt lại về 0.
- Đối với loại dữ liệu chuỗi cố định: Tất cả các giá trị được đặt lại về độ dài bằng 0.
- Đối với mảng động: Giải phóng bộ nhớ mà mảng sử dụng.
Ví dụ :
Sub eraseExample() Dim NumArray(3) As Integer Dim decArray(2) As Double Dim strArray(2) As String NumArray(0) = 12345 decArray(1) = 34.5 strArray(1) = "Erase Function" Dim DynaArray() ReDim DynaArray(3) MsgBox " Values before Erase " & (NumArray(0)) & "," & (decArray(1)) & " , " & (strArray(1)) Erase NumArray Erase decArray Erase strArray Erase DynaArray ' Free the memory ' All values are erased. MsgBox " Values after Erase " & NumArray(0) & "," & decArray(1) & " , " & strArray(1) End Sub
Kết quả trước khi sử dụng chức năng Xóa
Kết quả sau khi sử dụng chức năng Xóa
#3) IsArray
Hàm này được sử dụng để xác định xem biến đầu vào đã cho có phải là một mảng hay không. Nó trả về true nếu biến được nhập là true, ngược lại nó trả về false.
Cú pháp : IsArray (tên biến)
Ví dụ:
Sub isArrayTest() Dim arr1, arr2 As Variant arr1 = Array("Jan", "Feb", "Mar") arr2 = "12345" MsgBox ("Is arr1 an Array : " & IsArray(arr1)) MsgBox ("Is arr2 an Array : " & IsArray(arr2)) End
Kết quả từ hộp thư thứ nhất
Kết quả từ hộp thư thứ hai
#4) Lbound
Nó trả về chỉ số dưới thấp nhất của mảng được chỉ định làm đối số cho hàm Lbound.
Cú pháp: LBound( ArrayName, [Thứ nguyên] )
ArrayName là tên của mảng.
Thứ nguyên là giá trị số nguyên tùy chọn, nếu mảng có nhiều thứ nguyên thì bạn có thể chỉ định thànhthứ nguyên nào bạn muốn xác định Lbound.
Ví dụ:
Sub lboundTest() Dim Result1, Result2, Result3 Dim ArrayValue(1 To 10, 5 To 15, 10 To 20) ' Declare array variables. Dim Arraywithoutlbound(10) Result1 = LBound(ArrayValue, 1) ' Returns 1. Result2 = LBound(ArrayValue, 3) ' Returns 10. Result3 = LBound(Arraywithoutlbound) MsgBox "Lowest subscript in first array " & Result1 & " lowest subscript in 3rd array " & Result2 & " Lowest subscript in Arraywithoutlbound " & Result3 End Sub
#5) Ubound
It trả về chỉ số dưới của mảng được chỉ định làm đối số trong hàm Ubound.
Cú pháp: UBound( ArrayName, [Dimension] )
ArrayName là tên của mảng.
Thứ nguyên là giá trị số nguyên tùy chọn, nếu mảng có nhiều thứ nguyên thì bạn có thể chỉ định thứ nguyên nào bạn muốn xác định Ubound.
Ví dụ:
Sub UboundTest() Dim Result1, Result2, Result3 Dim ArrayValue(1 To 10, 5 To 15, 10 To 20) ' Declare array variables. Dim ArraywithoutUbound(10) Result1 = UBound(ArrayValue, 1) Result2 = UBound(ArrayValue, 3) Result3 = UBound(ArraywithoutUbound) MsgBox "Lowest subscript in first array " & Result1 & " lowest subscript in 3rd array " & Result2 & " Lowest subscript in Arraywithoutlbound " & Result3 End Sub
#6) Tách
Nó trả về một mảng với một số chuỗi con được lấy từ toàn bộ chuỗi đã cho.
Cú pháp: Split(biểu thức, [ dấu phân cách, [ giới hạn, [ so sánh ]]])
- Biểu thức: Đây là toàn bộ chuỗi sẽ được sử dụng để tạo chuỗi con.
- Dấu phân cách: Sử dụng dấu phân cách đã chỉ định, chuỗi con sẽ được tạo. Nếu điều này không được đề cập thì khoảng trắng được coi là dấu phân cách.
- Giới hạn: Số chuỗi con được trả về.
- So sánh: Sau dấu chuỗi con được tạo, bạn có thể sử dụng các tùy chọn so sánh khác nhau để kiểm tra kết quả.
Ví dụ: Trong ví dụ bên dưới, chúng tôi đang sử dụng dấu phân cách là – và giới hạn là 3.
Do đó hàm split sẽ tách toàn bộ chuỗi thành các chuỗi con dựa trên dấu phân cách. Nhưng chúng tôi cũng đã đề cập đến giới hạn là 3 nên các chuỗi con sẽ không được hình thành sau giới hạn 3. Do đó, dấu phân cách cuối cùng –sẽ bị bỏ qua.
Sub splitExample() Dim MyString As String Dim Result() As String Dim DisplayText As String MyString = "This is the example for-VBA-Split-Function" Result = Split(MyString, "-",3) MsgBox Result(0) & vbNewLine & Result(1) & vbNewLine & Result(2) & vbNewLine & Result(3) End Sub
#7) Tham gia
Đây chỉ là mặt trái của tách, Tham gia sẽ tạo một chuỗi bằng cách kết hợp nhiều chuỗi con.
Cú pháp: Join(sourcearray, [ delimiter ])
Sourcearray: Mảng một chiều gồm các chuỗi mà bạn muốn nối thành một.
Dấu phân cách: Dấu phân cách được chỉ định sẽ được thêm sau mỗi chuỗi khi tham gia.
Ví dụ:
Sub joinExample() Dim Result As String Dim dirarray(0 To 2) As String dirarray(0) = "D:" dirarray(1) = "SoftwareTestingHelp" dirarray(2) = "Arrays" Result = Join(dirarray, "\") MsgBox "Date after joining " & Result End Sub
Tất cả 3 giá trị là đã tham gia và \ được đặt ở giữa mỗi từ, như chúng tôi đã đề cập \ là dấu phân cách.
#8) Bộ lọc
Bộ lọc sẽ cho phép chúng tôi tìm kiếm một trận đấu được chỉ định từ một mảng. Dựa trên tiêu chí lọc, tập hợp con của một mảng chuỗi sẽ được trả về.
Cú pháp: Filter(sourcearray, match, [ include, [ compare ]])
Ví dụ:
Sub filterExample() Dim Mystring As Variant Mystring = Array("Software Testing", "Testing help", "Software help") filterString = Filter(Mystring, "help") MsgBox "Found " & UBound(Mystring) - LBound(Mystring) + 1 & " words matching the criteria " End Sub
Ví dụ này sẽ tìm kiếm từ “trợ giúp” trong tất cả các chuỗi mảng bằng chức năng lọc.
Câu hỏi thường gặp
Hỏi #1) Làm cách nào để lấy độ dài của một mảng trong VBA?
Trả lời: Để lấy độ dài của một mảng mảng, chúng ta sử dụng hàm Ubound. Hàm này sẽ cung cấp cho chúng ta một chỉ số trên của một mảng được chỉ định.
Hỏi #2) Làm cách nào để khai báo một mảng trong VBA?
Trả lời: Một- mảng chiều được khai báo như hình bên dưới.
Dim arrayname(lowerbound To UpperBound) As DataType
Ví dụ: Dim Myarray(0 To 2) As Integer
Hai chiều