VNFastSearch – DLL tìm kiếm tiếng Việt tốc độ cao cho Excel VBA (4 người xem)

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
225
Được thích
226
# VNFastSearch – DLL tìm kiếm tiếng Việt tốc độ cao cho Excel VBA

## Giới thiệu

Khi làm việc với dữ liệu lớn trong Excel (vài nghìn đến hàng chục nghìn dòng), việc tìm kiếm chuỗi **tiếng Việt không phân biệt dấu** bằng VBA thuần hoặc ADODB (SQL LIKE) thường gặp các vấn đề:

* Tốc độ chậm, lag khi gõ tìm realtime
* Không xử lý tốt tiếng Việt có dấu
* UserForm / TextBox dễ làm Excel bị đơ
* Code VBA phức tạp, khó tối ưu

**VNFastSearch.dll** được xây dựng để giải quyết các vấn đề trên bằng cách đưa phần tìm kiếm sang **DLL C++**, còn VBA chỉ đóng vai trò giao tiếp.

---

## Nguyên lý hoạt động

1. Excel chuyển dữ liệu Range → chuỗi Unicode
(phân tách cột bằng Tab, dòng bằng CRLF)
2. DLL:

* Tách dòng / cột
* Chuẩn hoá tiếng Việt (bỏ dấu + lowercase)
* Cache dữ liệu vào RAM
3. Khi tìm kiếm:

* VBA chỉ truyền keyword
* DLL trả về index các dòng phù hợp
4. VBA lấy lại dữ liệu gốc từ Sheet theo index

DLL **không thay đổi dữ liệu Excel**, chỉ dùng để tìm kiếm.

---

## Khai báo API DLL trong VBA

Tạo một **Module VBA** và khai báo:

Mã:
Option Explicit

Public Declare PtrSafe Sub LoadVNCache Lib "VNFastSearch.dll" ( _
ByVal txtPtr As LongPtr, _
ByVal colCount As Long _
)

Public Declare PtrSafe Function FindVNRows Lib "VNFastSearch.dll" ( _
ByVal keyPtr As LongPtr, _
ByVal colMask As Long, _
ByRef rows As Long, _
ByVal maxCount As Long _
) As Long

Public Declare PtrSafe Function FindVNRowsExRange Lib "VNFastSearch.dll" ( _
ByVal keyPtr As LongPtr, _
ByVal colMask As Long, _
ByVal rowStart As Long, _
ByVal rowEnd As Long, _
ByRef rows As Long, _
ByVal maxCount As Long _
) As Long

Public Declare PtrSafe Function IsVNCacheReady Lib "VNFastSearch.dll" () As Long

Public Declare PtrSafe Function CountVNRows Lib "VNFastSearch.dll" ( _
ByVal keyPtr As LongPtr, _
ByVal colMask As Long _
) As Long

Public Declare PtrSafe Sub ClearVNCache Lib "VNFastSearch.dll" ()

---

## Hàm hỗ trợ: chuyển Range sang Unicode Text

Mã:
Public Function RangeToUnicodeText(rg As Range) As String
Dim arr As Variant
Dim r As Long, c As Long
Dim sb As String

```
arr = rg.Value

For r = 1 To UBound(arr, 1)
    For c = 1 To UBound(arr, 2)
        sb = sb & CStr(arr(r, c))
        If c < UBound(arr, 2) Then sb = sb & vbTab
    Next c
    sb = sb & vbCrLf
Next r

RangeToUnicodeText = sb
```

End Function

---

## Load cache (chỉ cần gọi 1 lần)

Mã:
Public Sub InitVNCacheOnce()
If IsVNCacheReady() <> 0 Then Exit Sub

```
Dim rg As Range
Set rg = Sheets("Data").Range("A1").CurrentRegion

LoadVNCache StrPtr(RangeToUnicodeText(rg)), rg.Columns.Count
```

End Sub

---

## Ví dụ tìm kiếm và ghi kết quả ra Sheet

Mã:
Public Sub VN_Search_ToSheet( _
ByVal keyword As String, _
ByVal outCell As Range)

```
Dim idx(1 To 1000) As Long
Dim found As Long
Dim i As Long
Dim src As Range

Call InitVNCacheOnce

If Trim$(keyword) = "" Then
    outCell.Resize(1000, 50).ClearContents
    Exit Sub
End If

found = FindVNRows(StrPtr(keyword), 0, idx(1), 1000)
If found <= 0 Then Exit Sub

Set src = Sheets("Data").Range("A1").CurrentRegion
outCell.Resize(1000, src.Columns.Count).ClearContents

For i = 1 To found
    outCell.Offset(i - 1, 0).Resize(1, src.Columns.Count).Value = _
        Application.Index(src.Value, idx(i), 0)
Next i
```

End Sub

---

## Ví dụ dùng với TextBox trên Sheet

Mã:
Private Sub TextBox1_Change()
VN_Search_ToSheet Me.TextBox1.Text, Me.Range("E3")
End Sub

* Gõ tới đâu → lọc tới đó
* Không lag
* Không phân biệt dấu tiếng Việt

---

## Lọc theo cột (Column Mask)

* bit 0 = cột A
* bit 1 = cột B
* bit 2 = cột C

Ví dụ chỉ tìm trong cột A và C:

Mã:
found = FindVNRows(StrPtr("lan"), 5, idx(1), 1000)

(1 + 4 = 5)

---

## Đếm nhanh số dòng phù hợp

Không cần mảng, rất nhanh:

Mã:
Dim n As Long
n = CountVNRows(StrPtr("an"), 0)
Debug.Print n

---

## Khi nào nên dùng VNFastSearch

* Dữ liệu lớn (≥ vài nghìn dòng)
* Tìm kiếm realtime khi gõ
* UserForm / TextBox
* Cần tìm tiếng Việt không phân biệt dấu
* VBA thuần hoặc ADODB bị chậm

---

## Kết luận

VNFastSearch giúp:

* Tìm kiếm tiếng Việt **rất nhanh**
* Giảm tải VBA
* Tránh lag / crash Excel
* Code VBA gọn, dễ tái sử dụng

Phù hợp cho các file Excel cần tìm kiếm dữ liệu lớn và giao diện thân thiện.

---

đang rảnh viết chơi tí buổi sáng Úp cho ai cần thì dùng ... bản xem trước rảnh test lại úp file Excel sau ... Nó tìm kiếm siêu nhanh



Đúng rồi — về mặt trải nghiệm sử dụng thì nó rất giống Google Search, nhưng về kỹ thuật bên trong thì đơn giản hơn Google rất nhiều. Mình nói rõ để bạn nắm bản chất nhé.

Giống Google ở điểm nào?​

1️⃣ Tìm khi đang gõ (realtime)​

  • Gõ tới đâu → kết quả lọc tới đó
  • Không cần nhấn Enter
  • TextBox_Change là ra kết quả ngay
Cảm giác dùng giống Google Search / Excel filter nâng cao

2️⃣ Không phân biệt dấu tiếng Việt​

Ví dụ người dùng gõ:
  • an
  • ăn
  • Ân
  • AN
Đều tìm ra:
  • An
  • Ân
  • Ăn
  • Nguyễn Văn An
Giống cách Google xử lý tiếng Việt.

3️⃣ Tìm gần đúng (substring)​

  • Không cần gõ đúng toàn bộ từ
  • Chỉ cần một phần chuỗi
Ví dụ dữ liệu:
Mã:
Nguyễn Văn An
Trần Minh Anh
Phan Văn Long
Gõ:
  • an → ra cả 3 dòng
  • min → ra Minh
  • van → ra Văn
Đây chính là kiểu contains giống Google.

Nhưng KHÔNG phải Google thật​

❌ Không có xếp hạng thông minh​

Google có:
  • Ưu tiên từ khoá ở đầu
  • Học hành vi người dùng
  • NLP, AI, semantic search
VNFastSearch thì:
  • Chỉ check find() chuỗi
  • Dòng nào match trước → trả trước
  • Không có ranking

❌ Không sửa lỗi chính tả​

Google:
  • nguen van an
  • Gợi ý: “Bạn có muốn tìm Nguyễn Văn An?”
VNFastSearch:
  • Không có sửa lỗi
  • Gõ sai → không ra
(Cái này có thể mở rộng sau)

Bản chất kỹ thuật (nói gọn)​

VNFastSearch hoạt động kiểu:
  1. Chuẩn hoá toàn bộ dữ liệu:
    Mã:
    Nguyễn Văn An → nguyen van an
  2. Chuẩn hoá keyword:
    Mã:
    Ân → an
  3. So sánh:
    Mã:
    if cell.find(keyword) != npos → MATCH
Rất nhanh vì:
  • Không truy cập Sheet khi tìm
  • Chỉ tìm trên RAM
  • Không xử lý Excel Object Model trong vòng lặp

So với ADODB LIKE​

Tiêu chíVNFastSearchADODB LIKE
Tốc độ Rất nhanh Chậm khi lớn
Realtime✅ Rất mượt❌ Lag
Không dấu✅❌ Không
VBA đơn giản✅❌
SQL❌✅

Nếu muốn giống Google hơn nữa thì có thể làm gì?​

Có thể mở rộng DLL thêm:
  • ✅ Ưu tiên match đầu chuỗi
  • ✅ Ưu tiên cột chính (VD: Tên)
  • ✅ Tách từ (token search)
  • ✅ Gợi ý từ khoá
  • ✅ Highlight keyword trong kết quả
Nền tảng hiện tại đã rất tốt để phát triển tiếp.

Tóm lại (1 câu)​

Về cách người dùng cảm nhận: đúng là giống Google Search.
Về kỹ thuật: là “Google-style search đơn giản, cực nhanh, chạy trong Excel”.
 

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

Back
Top Bottom