Giới thiệu COM DLL ListCollection.dll – Quản lý danh sách thông minh cho VBA (2 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Tôi tuân thủ nội quy khi đăng bài

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

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

2️⃣ **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.

3️⃣ **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.

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

5️⃣ **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.

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

7️⃣ **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")`

8️⃣ **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"`

9️⃣ **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"

1️⃣1️⃣ **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)`

1️⃣2️⃣ **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`

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

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

1️⃣5️⃣ **_NewEnum()**
➤ 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.
1759724653147.png
---
thong thả và thư giản tạo github úp file sau
 
Lần chỉnh sửa cuối:

Bài viết mới nhất

Back
Top Bottom