phuongnam366377
Thành viên thường trực




- Tham gia
- 25/10/19
- Bài viết
- 213
- Được thích
- 223
## Giới thiệu COM DLL ListCollection.dll – Quản lý danh sách thông minh cho VBA
### Tổng quan
`ListCollection.dll` là một thư viện COM được phát triển bằng **C++ Builder của Delphi**, cung cấp đối tượng `List` cho môi trường **VBA** (Visual Basic for Applications). Thư viện này giúp người dùng VBA dễ dàng thao tác với danh sách dữ liệu như thêm, xóa, truy xuất, sắp xếp, và duyệt qua các phần tử bằng cú pháp quen thuộc.
### Công nghệ sử dụng
- **Ngôn ngữ**: C++ trong môi trường Delphi
- **Mô hình COM**: Apartment Threading Model
- **Interface**: Dual Interface (hỗ trợ cả `IDispatch` và `IUnknown`)
- **Tên DLL**: `ListCollection.dll`
- **Tương thích**: Excel, Word, Access, và các ứng dụng hỗ trợ VBA
---
## Các hàm chính trong `ListCollection.List` và chức năng của chúng
**Add(Value)**
➤ Thêm một phần tử mới vào cuối danh sách.
Ví dụ: `lst.Add "Apple"`
**Remove(Index)**
➤ Xóa phần tử tại vị trí chỉ định (theo chỉ số bắt đầu từ 1).
Ví dụ: `lst.Remove 2` sẽ xóa phần tử thứ hai.
**Insert(Index, Value)**
➤ Chèn phần tử vào vị trí cụ thể trong danh sách.
Ví dụ: `lst.Insert 2, "Banana"` sẽ chèn "Banana" vào vị trí thứ hai.
**Clear()**
➤ Xóa toàn bộ danh sách, đưa danh sách về trạng thái rỗng.
Ví dụ: `lst.Clear`
**Item(Index)** hoặc `lst(Index)`
➤ Truy xuất phần tử tại vị trí chỉ định.
Ví dụ: `lst.Item(1)` hoặc `lst(1)` đều trả về phần tử đầu tiên.
**Count()**
➤ Trả về số lượng phần tử hiện có trong danh sách.
Ví dụ: `Debug.Print lst.Count`
**Contains(Value)**
➤ Kiểm tra xem phần tử có tồn tại trong danh sách hay không.
Trả về `True` hoặc `False`.
Ví dụ: `found = lst.Contains("Apple")`
**Replace(Index, NewValue)**
➤ Thay thế phần tử tại vị trí chỉ định bằng giá trị mới.
Ví dụ: `lst.Replace 1, "Mango"`
**IndexOf(Value)**
➤ Trả về vị trí của phần tử đầu tiên tìm thấy trong danh sách.
Ví dụ: `pos = lst.IndexOf("Banana")`
**IndexOfIgnoreCase(Value)**
➤ Tìm vị trí phần tử mà không phân biệt chữ hoa/thường.
Ví dụ: `lst.IndexOfIgnoreCase("banana")` sẽ tìm thấy "Banana"

**IndexOfEx(Value, IgnoreCase)**
➤ Tìm vị trí phần tử với tùy chọn có hoặc không phân biệt chữ hoa/thường.
Ví dụ: `lst.IndexOfEx("banana", True)`

**Sort(Ascending)**
➤ Sắp xếp danh sách theo thứ tự tăng (`True`) hoặc giảm (`False`).
Ví dụ: `lst.Sort True`

**ToArray()**
➤ Xuất danh sách thành mảng Variant (dùng như mảng VBA).
Ví dụ: `arr = lst.ToArray()`

**ToVariantArray()**
➤ Xuất danh sách dưới dạng mảng Variant chuẩn.
Ví dụ: `arr = lst.ToVariantArray()`

**_NewEnum()**
➤ Cho phép duyệt danh sách bằng vòng lặp `For Each` trong VBA.
Ví dụ:
### Ví dụ sử dụng trong VBA
#### 1. Thao tác đầy đủ với danh sách
---
#### 2. Duyệt danh sách bằng `For Each`
---
#### 3. Sắp xếp và tìm vị trí phần tử
---
#### 4. Thay thế phần tử
---
### Ứng dụng thực tế
- Tạo danh sách động trong Excel VBA
- Quản lý dữ liệu chuỗi, số, ngày tháng, hoặc đối tượng COM
- Duyệt danh sách bằng `For Each` như mảng thông thường
- Tích hợp vào macro xử lý dữ liệu, báo cáo, hoặc tự động hóa
---------------------------------------------------------------------
Giao diện sử dụng trong VBE (Visual Basic Editor) của Excel sẽ rất quen thuộc với người dùng VBA.

---
thong thả và thư giản tạo github úp file sau
### Tổng quan
`ListCollection.dll` là một thư viện COM được phát triển bằng **C++ Builder của Delphi**, cung cấp đối tượng `List` cho môi trường **VBA** (Visual Basic for Applications). Thư viện này giúp người dùng VBA dễ dàng thao tác với danh sách dữ liệu như thêm, xóa, truy xuất, sắp xếp, và duyệt qua các phần tử bằng cú pháp quen thuộc.
### Công nghệ sử dụng
- **Ngôn ngữ**: C++ trong môi trường Delphi
- **Mô hình COM**: Apartment Threading Model
- **Interface**: Dual Interface (hỗ trợ cả `IDispatch` và `IUnknown`)
- **Tên DLL**: `ListCollection.dll`
- **Tương thích**: Excel, Word, Access, và các ứng dụng hỗ trợ VBA
---
## Các hàm chính trong `ListCollection.List` và chức năng của chúng

➤ Thêm một phần tử mới vào cuối danh sách.
Ví dụ: `lst.Add "Apple"`

➤ Xóa phần tử tại vị trí chỉ định (theo chỉ số bắt đầu từ 1).
Ví dụ: `lst.Remove 2` sẽ xóa phần tử thứ hai.

➤ Chèn phần tử vào vị trí cụ thể trong danh sách.
Ví dụ: `lst.Insert 2, "Banana"` sẽ chèn "Banana" vào vị trí thứ hai.

➤ Xóa toàn bộ danh sách, đưa danh sách về trạng thái rỗng.
Ví dụ: `lst.Clear`

➤ Truy xuất phần tử tại vị trí chỉ định.
Ví dụ: `lst.Item(1)` hoặc `lst(1)` đều trả về phần tử đầu tiên.

➤ Trả về số lượng phần tử hiện có trong danh sách.
Ví dụ: `Debug.Print lst.Count`

➤ Kiểm tra xem phần tử có tồn tại trong danh sách hay không.
Trả về `True` hoặc `False`.
Ví dụ: `found = lst.Contains("Apple")`

➤ Thay thế phần tử tại vị trí chỉ định bằng giá trị mới.
Ví dụ: `lst.Replace 1, "Mango"`

➤ Trả về vị trí của phần tử đầu tiên tìm thấy trong danh sách.
Ví dụ: `pos = lst.IndexOf("Banana")`
**IndexOfIgnoreCase(Value)**
➤ Tìm vị trí phần tử mà không phân biệt chữ hoa/thường.
Ví dụ: `lst.IndexOfIgnoreCase("banana")` sẽ tìm thấy "Banana"


➤ Tìm vị trí phần tử với tùy chọn có hoặc không phân biệt chữ hoa/thường.
Ví dụ: `lst.IndexOfEx("banana", True)`


➤ Sắp xếp danh sách theo thứ tự tăng (`True`) hoặc giảm (`False`).
Ví dụ: `lst.Sort True`


➤ Xuất danh sách thành mảng Variant (dùng như mảng VBA).
Ví dụ: `arr = lst.ToArray()`


➤ Xuất danh sách dưới dạng mảng Variant chuẩn.
Ví dụ: `arr = lst.ToVariantArray()`


➤ Cho phép duyệt danh sách bằng vòng lặp `For Each` trong VBA.
Ví dụ:
Mã:
For Each item In lst
Debug.Print item
Next
### Ví dụ sử dụng trong VBA
#### 1. Thao tác đầy đủ với danh sách
Mã:
Sub DemoListCollection()
Dim lst As New ListCollection.List
Dim arr As Variant
Dim v As Variant
Dim i As Long
Dim found As Boolean
lst.Add "Apple"
lst.Add "Banana"
lst.Add "Cherry"
Debug.Print "Count ="; lst.Count
Debug.Print "Item(1) ="; lst.Item(1)
Debug.Print "Item(2) ="; lst(2)
For Each v In lst
Debug.Print "Value:"; v
Next
lst.Remove 2
lst.Insert 2, "NewBanana"
Debug.Print "Item(2) ="; lst(2)
found = lst.Contains("Cherry")
Debug.Print "Contains 'Cherry'?"; found
arr = lst.ToVariantArray()
For i = LBound(arr) To UBound(arr)
Debug.Print "Arr(" & i & ")=" & arr(i)
Next
lst.Clear
lst.Add "X"
lst.Add 123
lst.Add #10/3/2025#
lst.Add 45.67
For Each v In lst
Debug.Print "Type:"; TypeName(v); " Value:"; v
Next
Dim lst2 As New ListCollection.List
lst2.Add "A"
lst2.Add "B"
For Each v In lst
Dim v2 As Variant
For Each v2 In lst2
Debug.Print v, v2
Next
Next
lst.Clear
Debug.Print "Count after Clear ="; lst.Count
End Sub
---
#### 2. Duyệt danh sách bằng `For Each`
Mã:
Sub TestListEnum()
Dim lst As New ListCollection.List
Dim item
lst.Add "A"
lst.Add "B"
lst.Add "C"
For Each item In lst
Debug.Print item
Next
End Sub
---
#### 3. Sắp xếp và tìm vị trí phần tử
Mã:
Sub DemoSortAndIndex()
Dim lst As New ListCollection.List
lst.Add "Orange"
lst.Add "Apple"
lst.Add "Banana"
lst.Sort True ' Ascending
For Each v In lst
Debug.Print v
Next
Debug.Print "IndexOf 'Banana' ="; lst.IndexOf("Banana")
Debug.Print "IndexOfIgnoreCase 'apple' ="; lst.IndexOfIgnoreCase("apple")
End Sub
---
#### 4. Thay thế phần tử
Mã:
Sub DemoReplace()
Dim lst As New ListCollection.List
lst.Add "Dog"
lst.Add "Cat"
lst.Add "Bird"
lst.Replace 2, "Tiger"
For Each v In lst
Debug.Print v
Next
End Sub
---
### Ứng dụng thực tế
- Tạo danh sách động trong Excel VBA
- Quản lý dữ liệu chuỗi, số, ngày tháng, hoặc đối tượng COM
- Duyệt danh sách bằng `For Each` như mảng thông thường
- Tích hợp vào macro xử lý dữ liệu, báo cáo, hoặc tự động hóa
---------------------------------------------------------------------
Giao diện sử dụng trong VBE (Visual Basic Editor) của Excel sẽ rất quen thuộc với người dùng VBA.

---
thong thả và thư giản tạo github úp file sau
Lần chỉnh sửa cuối: