- Tham gia
- 13/6/06
- Bài viết
- 4,776
- Được thích
- 10,289
- Giới tính
- Nam
- Nghề nghiệp
- Giáo viên, CEO tại Bluesofts
LẬP TRÌNH HÀM MẢNG TRONG EXCEL CÙNG ADD-IN A-TOOLS
Bài viết này tôi trình bày với các bạn kiến thức cũng như phương pháp tạo ra hàm mảng, làm việc với mảng giá trị. Cùng với các ví dụ minh họa tôi sẽ cùng các bạn tạo ra những hàm hữu dụng cho người dùng, ví dụ như tạo hàm DVLOOKUP trả về mảng giá trị thỏa mãn, không như hàm VLOOKUP của Excel chỉ trả về duy nhất một giá trị.
Đây và ví dụ về hàm mảng BS_SQL() của A-Tools. Chúng ta sẽ tạo ra những hàm chạy được như thế này:
Trong A-Tools cung cấp hàm BS_SQL(), truy vấn CSDL các loại và trả về một mảng giá trị. Hàm này được dùng để tạo ra các loại sổ sách rất linh hoạt. Để tìm hiểu cách dùng hàm BS_SQL bạn mở các file trong thu mục cài đặt “C:\A-Tools\HELP & DEMOS”, đặc biệt file “SoketoanSQL.xls” là một ví dụ điển hình về việc dùng hàm BS_SQL để tạo ra một sổ kế toán động cho một doanh nghiệp với tốc độ nhanh và linh hoạt.
A-Tools là công cụ mở cho phép nhà phát triển lập trình để tạo ra các hàm với đặc tính giống như hàm BS_SQL(). Để tạo được hàm mảng, chúng ta thực hiện những phần sau:
1. Nhúng file thư viện “addinatools.dll” vào file Excel của bạn
Mở file Excel. Nhấn ALT+F11 để vào môi trường lập trình VBE (Visual Basic Editor). Vào menu A-Tools->References…, khi hiện ra hộp thoại bạn hãy chọn mục Add-In A-Tools, nếu không thấy hãy chọn nút “Browse…” và chọn file ở đường dẫn “C:\Windows\System32\addinatools.dll”. Kết quả bạn thực hiện được như hình dưới đây:
2. Tạo hàm mảng cùng đối tượng BSFormulaArray
a. Thế nào là một hàm mảng
Hàm mảng là hàm trả về một mảng giá trị, mảng có thể là 1 hoặc 2 chiều. Trong Excel có một hàm mảng tên là Table(), trong A-Tools là BS_SQL().
Ví dụ về một hàm mảng:
[GPECODE=vb]Function GetArr() As Variant
Dim Arr(2, 1)
Arr(0, 0) = "Q1": Arr(0, 1) = 1
Arr(1, 0) = "Q2": Arr(1, 1) = 2
Arr(2, 0) = "Q3": Arr(2, 1) = 3
GetArr = Arr
End Function
[/GPECODE]
(trong lập trình VB, nếu không muốn xuống dòng ta gõ dấu “:” ngay ở đầu đoạn code.)
Trong bảng tính bạn đặt công thức: =GetArr() rồi ENTER theo cách làm thông thường thì kết quả chỉ trả về phần tử đầu tiên của mảng giá trị là “Q1”. Muốn nó trả về một mảng giá trị thì phải làm như sau:
Bôi đen/chọn vùng ô gồm 3 dòng và 2 cột (Vì mảng trên là gồm 3 dòng và 2 cột (mảng 2 chiều: dòng & cột, phần tử chạy từ 0), sau đó gõ hàm
=GetArr() rồi nhấn CTRL + SHIFT + ENTER kết quả sẽ trả về toàn bộ mảng như hình dưới đây:
Nếu vùng chọn mà số dòng hoặc số cột lớn hơn số phần tử của mảng kết quả thì các ô thừa đó sẽ có giá trị “#N/A”, nếu vùng chọn thiếu so với số phần tử của mảng thì thì kết quả thiếu giá trị. Vậy theo cách làm thông thường của Excel chúng ta phải chọn vùng đặt công thức với số dòng và cột phải đúng bằng số phần tử dòng và cột của mảng trả về. Đây là một sự cứng nhắc và người dùng khó mà tuân thủ đúng, vì mảng kết quả trả về của hàm với số phần tử sẽ thay đổi tùy thuộc vào hoàn cảnh nào đó, ví dụ hàm trả về danh sách nhân viên của một phòng, nếu phòng A thì danh sách là 10, phòng B thì danh sách là 5…
Add-in A-Tools cung cấp đối tượng BSFormulaArray để làm việc này một cách linh hoạt và dễ dàng. Chỉ cần đặt công thức, nhấn ENTER là kết quả trả về cả mảng đủ với số phần tử của mảng. Với đối tượng BSFormulaArray nhà phát triển có thể tạo ra bất kể hàm mảng nào một cách thuận tiện, có thể truy vấn dữ liệu từ nhiều loại CSDL như Excel, Access, Foxpro, MySQL, MS SQL Server,….
b. Các thành phần của đối tượng BSFormulaArray
Để tìm hiểu các thành phần của A-Tools, trong VBE nhấn F2 để mở cửa sổ quản lý đối tượng “Object Browser”. Khi cửa sổ hiện lên, góc đỉnh bên trái bạn chọn AddinATools trong combo box.
Các thành phần của đối tượng BSFormulaArray như hình dưới đây:
Giải thích các thành phần chính:
+ Begin()
Loại: Hàm, giá trị trả về là kiểu Boolean.
Ứng dụng: dùng để kiểm tra hàm của người dùng có phải trạng thái bắt đầu chạy hay không. Nếu kết quả là TRUE tức là bắt đầu và bạn hãy viết các đoạn code cho hàm và nạp thông tin về hàm cùng mảng kết qủa vào hàm Add(). Hàm này bắt buộc chạy lúc ban đầu.
+ Add()
Loại: Hàm, giá trị trả về là kiểu Variant chứa mảng kết quả.
Ứng dụng: dùng để nạp thông tin về hàm của bạn và kết quả cần trả về của hàm. Chạy sau hàm Begin().
+ Result
Loại: Thuộc tính, giá trị trả về là kiểu Variant chứa mảng kết quả mà hàm cần trả về bảng tính.
Ứng dụng: dùng để trả về hàm của gọi. Nó được dùng khi hàm Begin() = FALSE.
c. Cấu trúc hàm mảng
Là một hàm mảng, bạn bắt buộc làm theo cấu trúc dưới đây:
[GPECODE=vb]Function YourFunc() As Variant
Dim fa As New BSFormulaArray
Dim fi As New BSFormulaInfo
On Error GoTo lbEndFunc
If fa.Begin Then
Dim Result 'It is an array, SQL statement or Recordset
'Fill value to Result
‘Các đoạn code để tạo ra mảng kết quả của bạn
YourFunc = fa.Add(fi, Result)
Else
YourFunc = fa.Result
End If
lbEndFunc:
Set fi = Nothing
Set fa = Nothing
If Err <> 0 Then
'MsgBox Err.Description, vbCritical
End If
End Function
[/GPECODE]
d. Các ví dụ tạo hàm mảng
Các ví dự dưới đây đều nằm trong file “BSFormulaArray.xls” tại đường dẫn “C:\A-Tools\HELP & DEMOS\A-Tools VBA Programming”. Để xem và chạy thử bạn hãy mở file này ra.
+ Hàm GetArray() - Ví dụ đơn giản hàm trả về mảng gồm 3 dòng và 2 cột.
[GPECODE=vb]Function GetArray() As Variant
Dim fa As New BSFormulaArray
Dim fi As New BSFormulaInfo
On Error GoTo lbEndFunc
If fa.Begin Then
Dim Arr(2, 1)
Arr(0, 0) = "Q1": Arr(0, 1) = 1
Arr(1, 0) = "Q2": Arr(1, 1) = 2
Arr(2, 0) = "Q3": Arr(2, 1) = 3
GetArray = fa.Add(fi, Arr)
Else
GetArray = fa.Result
End If
lbEndFunc:
Set fi = Nothing
Set fa = Nothing
If Err <> 0 Then
'MsgBox Err.Description, vbCritical
End If
End Function [/GPECODE]
Bây giờ bạn ra bảng tính, gõ
=GetArray() rồi ENTER bạn sẽ thấy tự Excel điền cho bạn một mảng gồm 3 dòng và 2 cột.
+ Ví dụ hàm GetRangeValue() – Trả về một mảng giá trị, mảng này lấy từ một vùng dữ liệu nơi khác
[GPECODE=vb]Function GetRangeValue() As Variant
Dim fa As New BSFormulaArray
Dim fi As New BSFormulaInfo
On Error GoTo lbEndFunc
If fa.Begin Then
GetRangeValue = fa.Add(fi, Range("data").Value)
Else
GetRangeValue = fa.Result
End If
lbEndFunc:
Set fi = Nothing
Set fa = Nothing
If Err <> 0 Then
'MsgBox Err.Description, vbCritical
End If
End Function
[/GPECODE]
+ Ví dụ hàm DVLOOKUP() – Tìm kiếm và trả về mảng giá trị tìm được. Hàm VLOOKUP trong Excel chỉ trả về duy nhất 1 giá trị tìm được, việc tìm là tìm trên cột đầu tiên.
Hàm DVLOOKUP() tôi viết dưới đây có thể tìm giá trị “LookupValue” tại cột có vị trí “LookupColIndex” (ngầm định là 1) trong bảng “LookupTable”, nếu tìm được trả về các giá trị thỏa mãn tại cột có vị trí “ResultColIndex”,
[GPECODE=vb]Function DVLOOKUP(ByVal LookupValue As Variant, ByVal LookupTable As Range, ByVal ResultColIndex As Long, Optional ByVal LookupColIndex As Long = 1) As Variant
Dim fa As New BSFormulaArray
Dim fi As New BSFormulaInfo
Dim I As Long, LastRow As Long, ArrCount As Long
On Error GoTo lbEndFunc
ReDim Arr(0)
ArrCount = -1
If fa.Begin Then
'LastRow = LookupTable.Rows.Count
LastRow = LookupTable.Cells(LookupTable.Rows.Count + 1, LookupColIndex).End(xlUp).Row - LookupTable.Row + 1
For I = 1 To LastRow
If LookupTable.Cells(I, LookupColIndex) = LookupValue Then
ArrCount = ArrCount + 1
ReDim Preserve Arr(ArrCount)
Arr(ArrCount) = LookupTable.Cells(I, ResultColIndex)
End If
Next I
DVLOOKUP = fa.Add(fi, Arr)
Else
DVLOOKUP = fa.Result
End If
lbEndFunc:
Set fi = Nothing
Set fa = Nothing
If Err <> 0 Then
'MsgBox Err.Description, vbCritical
End If
End Function
[/GPECODE]
Tại worksheet đặt công thức:
=DVLOOKUP(G9,A4100,1,2) rồi nhấn ENTER
Kết quả sẽ trả về mảng giá trị thỏa mãn tại ô G9
Xem ví dụ trong file BSFormulaArray.xls
Bài viết tiếp theo tôi sẽ đưa ra cách khai thác dữ liệu bằng SQL, dữ liệu lấy từ các nguồn CSDL cũng như lấy từ máy chủ...
DOWNLOAD tài liệu
Bài viết này tôi trình bày với các bạn kiến thức cũng như phương pháp tạo ra hàm mảng, làm việc với mảng giá trị. Cùng với các ví dụ minh họa tôi sẽ cùng các bạn tạo ra những hàm hữu dụng cho người dùng, ví dụ như tạo hàm DVLOOKUP trả về mảng giá trị thỏa mãn, không như hàm VLOOKUP của Excel chỉ trả về duy nhất một giá trị.
Đây và ví dụ về hàm mảng BS_SQL() của A-Tools. Chúng ta sẽ tạo ra những hàm chạy được như thế này:
Trong A-Tools cung cấp hàm BS_SQL(), truy vấn CSDL các loại và trả về một mảng giá trị. Hàm này được dùng để tạo ra các loại sổ sách rất linh hoạt. Để tìm hiểu cách dùng hàm BS_SQL bạn mở các file trong thu mục cài đặt “C:\A-Tools\HELP & DEMOS”, đặc biệt file “SoketoanSQL.xls” là một ví dụ điển hình về việc dùng hàm BS_SQL để tạo ra một sổ kế toán động cho một doanh nghiệp với tốc độ nhanh và linh hoạt.
A-Tools là công cụ mở cho phép nhà phát triển lập trình để tạo ra các hàm với đặc tính giống như hàm BS_SQL(). Để tạo được hàm mảng, chúng ta thực hiện những phần sau:
1. Nhúng file thư viện “addinatools.dll” vào file Excel của bạn
Mở file Excel. Nhấn ALT+F11 để vào môi trường lập trình VBE (Visual Basic Editor). Vào menu A-Tools->References…, khi hiện ra hộp thoại bạn hãy chọn mục Add-In A-Tools, nếu không thấy hãy chọn nút “Browse…” và chọn file ở đường dẫn “C:\Windows\System32\addinatools.dll”. Kết quả bạn thực hiện được như hình dưới đây:
2. Tạo hàm mảng cùng đối tượng BSFormulaArray
a. Thế nào là một hàm mảng
Hàm mảng là hàm trả về một mảng giá trị, mảng có thể là 1 hoặc 2 chiều. Trong Excel có một hàm mảng tên là Table(), trong A-Tools là BS_SQL().
Ví dụ về một hàm mảng:
[GPECODE=vb]Function GetArr() As Variant
Dim Arr(2, 1)
Arr(0, 0) = "Q1": Arr(0, 1) = 1
Arr(1, 0) = "Q2": Arr(1, 1) = 2
Arr(2, 0) = "Q3": Arr(2, 1) = 3
GetArr = Arr
End Function
[/GPECODE]
(trong lập trình VB, nếu không muốn xuống dòng ta gõ dấu “:” ngay ở đầu đoạn code.)
Trong bảng tính bạn đặt công thức: =GetArr() rồi ENTER theo cách làm thông thường thì kết quả chỉ trả về phần tử đầu tiên của mảng giá trị là “Q1”. Muốn nó trả về một mảng giá trị thì phải làm như sau:
Bôi đen/chọn vùng ô gồm 3 dòng và 2 cột (Vì mảng trên là gồm 3 dòng và 2 cột (mảng 2 chiều: dòng & cột, phần tử chạy từ 0), sau đó gõ hàm
=GetArr() rồi nhấn CTRL + SHIFT + ENTER kết quả sẽ trả về toàn bộ mảng như hình dưới đây:
Nếu vùng chọn mà số dòng hoặc số cột lớn hơn số phần tử của mảng kết quả thì các ô thừa đó sẽ có giá trị “#N/A”, nếu vùng chọn thiếu so với số phần tử của mảng thì thì kết quả thiếu giá trị. Vậy theo cách làm thông thường của Excel chúng ta phải chọn vùng đặt công thức với số dòng và cột phải đúng bằng số phần tử dòng và cột của mảng trả về. Đây là một sự cứng nhắc và người dùng khó mà tuân thủ đúng, vì mảng kết quả trả về của hàm với số phần tử sẽ thay đổi tùy thuộc vào hoàn cảnh nào đó, ví dụ hàm trả về danh sách nhân viên của một phòng, nếu phòng A thì danh sách là 10, phòng B thì danh sách là 5…
Add-in A-Tools cung cấp đối tượng BSFormulaArray để làm việc này một cách linh hoạt và dễ dàng. Chỉ cần đặt công thức, nhấn ENTER là kết quả trả về cả mảng đủ với số phần tử của mảng. Với đối tượng BSFormulaArray nhà phát triển có thể tạo ra bất kể hàm mảng nào một cách thuận tiện, có thể truy vấn dữ liệu từ nhiều loại CSDL như Excel, Access, Foxpro, MySQL, MS SQL Server,….
b. Các thành phần của đối tượng BSFormulaArray
Để tìm hiểu các thành phần của A-Tools, trong VBE nhấn F2 để mở cửa sổ quản lý đối tượng “Object Browser”. Khi cửa sổ hiện lên, góc đỉnh bên trái bạn chọn AddinATools trong combo box.
Các thành phần của đối tượng BSFormulaArray như hình dưới đây:
Giải thích các thành phần chính:
+ Begin()
Loại: Hàm, giá trị trả về là kiểu Boolean.
Ứng dụng: dùng để kiểm tra hàm của người dùng có phải trạng thái bắt đầu chạy hay không. Nếu kết quả là TRUE tức là bắt đầu và bạn hãy viết các đoạn code cho hàm và nạp thông tin về hàm cùng mảng kết qủa vào hàm Add(). Hàm này bắt buộc chạy lúc ban đầu.
+ Add()
Loại: Hàm, giá trị trả về là kiểu Variant chứa mảng kết quả.
Ứng dụng: dùng để nạp thông tin về hàm của bạn và kết quả cần trả về của hàm. Chạy sau hàm Begin().
+ Result
Loại: Thuộc tính, giá trị trả về là kiểu Variant chứa mảng kết quả mà hàm cần trả về bảng tính.
Ứng dụng: dùng để trả về hàm của gọi. Nó được dùng khi hàm Begin() = FALSE.
c. Cấu trúc hàm mảng
Là một hàm mảng, bạn bắt buộc làm theo cấu trúc dưới đây:
[GPECODE=vb]Function YourFunc() As Variant
Dim fa As New BSFormulaArray
Dim fi As New BSFormulaInfo
On Error GoTo lbEndFunc
If fa.Begin Then
Dim Result 'It is an array, SQL statement or Recordset
'Fill value to Result
‘Các đoạn code để tạo ra mảng kết quả của bạn
YourFunc = fa.Add(fi, Result)
Else
YourFunc = fa.Result
End If
lbEndFunc:
Set fi = Nothing
Set fa = Nothing
If Err <> 0 Then
'MsgBox Err.Description, vbCritical
End If
End Function
[/GPECODE]
d. Các ví dụ tạo hàm mảng
Các ví dự dưới đây đều nằm trong file “BSFormulaArray.xls” tại đường dẫn “C:\A-Tools\HELP & DEMOS\A-Tools VBA Programming”. Để xem và chạy thử bạn hãy mở file này ra.
+ Hàm GetArray() - Ví dụ đơn giản hàm trả về mảng gồm 3 dòng và 2 cột.
[GPECODE=vb]Function GetArray() As Variant
Dim fa As New BSFormulaArray
Dim fi As New BSFormulaInfo
On Error GoTo lbEndFunc
If fa.Begin Then
Dim Arr(2, 1)
Arr(0, 0) = "Q1": Arr(0, 1) = 1
Arr(1, 0) = "Q2": Arr(1, 1) = 2
Arr(2, 0) = "Q3": Arr(2, 1) = 3
GetArray = fa.Add(fi, Arr)
Else
GetArray = fa.Result
End If
lbEndFunc:
Set fi = Nothing
Set fa = Nothing
If Err <> 0 Then
'MsgBox Err.Description, vbCritical
End If
End Function [/GPECODE]
Bây giờ bạn ra bảng tính, gõ
=GetArray() rồi ENTER bạn sẽ thấy tự Excel điền cho bạn một mảng gồm 3 dòng và 2 cột.
+ Ví dụ hàm GetRangeValue() – Trả về một mảng giá trị, mảng này lấy từ một vùng dữ liệu nơi khác
[GPECODE=vb]Function GetRangeValue() As Variant
Dim fa As New BSFormulaArray
Dim fi As New BSFormulaInfo
On Error GoTo lbEndFunc
If fa.Begin Then
GetRangeValue = fa.Add(fi, Range("data").Value)
Else
GetRangeValue = fa.Result
End If
lbEndFunc:
Set fi = Nothing
Set fa = Nothing
If Err <> 0 Then
'MsgBox Err.Description, vbCritical
End If
End Function
[/GPECODE]
+ Ví dụ hàm DVLOOKUP() – Tìm kiếm và trả về mảng giá trị tìm được. Hàm VLOOKUP trong Excel chỉ trả về duy nhất 1 giá trị tìm được, việc tìm là tìm trên cột đầu tiên.
Hàm DVLOOKUP() tôi viết dưới đây có thể tìm giá trị “LookupValue” tại cột có vị trí “LookupColIndex” (ngầm định là 1) trong bảng “LookupTable”, nếu tìm được trả về các giá trị thỏa mãn tại cột có vị trí “ResultColIndex”,
[GPECODE=vb]Function DVLOOKUP(ByVal LookupValue As Variant, ByVal LookupTable As Range, ByVal ResultColIndex As Long, Optional ByVal LookupColIndex As Long = 1) As Variant
Dim fa As New BSFormulaArray
Dim fi As New BSFormulaInfo
Dim I As Long, LastRow As Long, ArrCount As Long
On Error GoTo lbEndFunc
ReDim Arr(0)
ArrCount = -1
If fa.Begin Then
'LastRow = LookupTable.Rows.Count
LastRow = LookupTable.Cells(LookupTable.Rows.Count + 1, LookupColIndex).End(xlUp).Row - LookupTable.Row + 1
For I = 1 To LastRow
If LookupTable.Cells(I, LookupColIndex) = LookupValue Then
ArrCount = ArrCount + 1
ReDim Preserve Arr(ArrCount)
Arr(ArrCount) = LookupTable.Cells(I, ResultColIndex)
End If
Next I
DVLOOKUP = fa.Add(fi, Arr)
Else
DVLOOKUP = fa.Result
End If
lbEndFunc:
Set fi = Nothing
Set fa = Nothing
If Err <> 0 Then
'MsgBox Err.Description, vbCritical
End If
End Function
[/GPECODE]
Tại worksheet đặt công thức:
=DVLOOKUP(G9,A4100,1,2) rồi nhấn ENTER
Kết quả sẽ trả về mảng giá trị thỏa mãn tại ô G9
Xem ví dụ trong file BSFormulaArray.xls
Bài viết tiếp theo tôi sẽ đưa ra cách khai thác dữ liệu bằng SQL, dữ liệu lấy từ các nguồn CSDL cũng như lấy từ máy chủ...
DOWNLOAD tài liệu
Lần chỉnh sửa cuối: