Thư viện DLL viết trên C++ Builder tăng tốc xử lý chuỗi và mảng trong 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 hoạt động
Tham gia
25/10/19
Bài viết
183
Được thích
198
1/ Nội dung bài Viết và hổ trợ viết Mã C++ Builder trên Delphi 12 được hổ trợ bởi ChatGPT

2/ Chủ đề này tôi sẽ giới thiệu tới ai đó một bộ siêu tập hàm viết bằng C++ Builder và thuần C++ cho ai cần sử dụng nó ... sẽ úp dần dần theo thời gian vừa học vừa viết + Úp

hiện tại trong File có rất nhiều hàm mai mốt rảnh chỉ dẫn hàng loạt hàm khác ....

3/ quá trình sử dụng phát sinh lỗi nếu có và có như cầu cần tùy chỉnh hay viết thêm vui lòng mô tả tại chủ đề này nếu khả năng có thể tôi sẽ xử lý




Thư viện DLL viết trên C++ Builder tăng tốc xử lý chuỗi và mảng trong VBA​


Trong quá trình làm việc với Excel VBA, chắc hẳn nhiều người gặp vấn đề hiệu năng khi xử lý chuỗi hoặc mảng dữ liệu lớn. VBA vốn chậm và hạn chế trong việc thao tác chuỗi, đặc biệt là khi phải nối hàng nghìn dòng dữ liệu, chuyển đổi chữ hoa/thường, hoặc thay thế văn bản trong toàn bộ mảng.


Để khắc phục, tôi đã viết một thư viện DLL bằng C++ Builder (Delphi 12), biên dịch riêng cho 32-bit64-bit, có thể gọi trực tiếp từ VBA cũng như từ các ngôn ngữ lập trình khác (VB6, VB.NET, C#, Python …).




Các hàm chính trong thư viện​


1.​


Ghép nhiều phần tử trong mảng thành một chuỗi duy nhất, có hỗ trợ delimiter, prefixsuffix.
Tương tự Join, nhưng nhanh hơn nhiều lần và linh hoạt hơn.


Mã:
result = StringBuilderFast(Array("A", "B", "C"), ", ", "[", "]")
' Kết quả: [A, B, C]




2.​


Ghép mảng thành chuỗi với một delimiter đơn giản.


Mã:
result = JoinArray(Array("John", "Jane", "Tom"), "; ")
' Kết quả: John; Jane; Tom




3.​


Xóa khoảng trắng dư thừa trong toàn bộ mảng chuỗi.


Mã:
arr = Array("  Hello ", "World  ")
result = TrimAll(arr)
' Kết quả: Array("Hello", "World")




4.​


Chuyển toàn bộ chuỗi trong mảng thành chữ hoa.


Mã:
result = ToUpperArray(Array("excel", "vba", "dll"))
' Kết quả: Array("EXCEL", "VBA", "DLL")




5.​


Thay thế chuỗi con trong toàn bộ mảng.


Mã:
result = ReplaceInArray(Array("cat", "dog", "bird"), "a", "@")
' Kết quả: Array("c@t", "dog", "bird")




Cách khai báo trong VBA​


Thư viện hỗ trợ cả Excel 32-bitExcel 64-bit:


Mã:
#If VBA7 And Win64 Then
Public Declare PtrSafe Function StringBuilderFast Lib "MyLibrary64.dll" _
(ByVal varArray As Variant, ByVal delimiter As Variant, _
ByVal prefix As Variant, ByVal suffix As Variant) As Variant
#Else
Public Declare PtrSafe Function StringBuilderFast Lib "MyLibrary32.dll" _
(ByVal varArray As Variant, ByVal delimiter As Variant, _
ByVal prefix As Variant, ByVal suffix As Variant) As Variant
#End If


Tương tự cho các hàm JoinArray, TrimAll, ToUpperArray, ReplaceInArray.




Ứng dụng ngoài VBA​


Do viết dưới dạng DLL xuất hàm chuẩn stdcall, thư viện này có thể gọi được từ:


  • VB6, VB.NET: sử dụng Declare Function hoặc P/Invoke.
  • C#: [DllImport] để gọi hàm.
  • Python: sử dụng ctypes hoặc pywin32.
  • C/C++: load DLL trực tiếp bằng LoadLibrary và GetProcAddress.

Điều này giúp thư viện có tính đa nền tảng trong hệ sinh thái Windows.




Ưu điểm nổi bật​


  • Tốc độ cao: viết bằng C++ Builder, xử lý mảng/chuỗi nhanh gấp nhiều lần so với VBA thuần.
  • Dễ sử dụng: chỉ cần khai báo 1 lần trong VBA, dùng như hàm bình thường.
  • ⚖️ Tương thích: hỗ trợ cả 32-bit và 64-bit.
  • Mở rộng: có thể dùng trong nhiều ngôn ngữ lập trình khác, không chỉ Excel VBA.



Kết luận​


Nếu bạn thường xuyên phải xử lý dữ liệu lớn trong Excel, đặc biệt là chuỗi và mảng, thì việc tích hợp DLL này sẽ giúp tăng tốc đáng kể.
Thay vì viết vòng lặp VBA chậm chạp, bạn có thể tận dụng sức mạnh native code để tiết kiệm thời gian và tài nguyên.


Đây là một giải pháp nhẹ, dễ triển khai, nhưng mang lại hiệu quả cao.




PassWord WinRaR là: 123

Tôi úp lên đây là bản 64 bít nếu ai dùng 32 bít thì báo tôi úp thêm
 

File đính kèm

Ứng dụng linh hoạt của hàm​


Trong thư viện DLL viết bằng C++ Builder, hàm StringBuilderFast là một công cụ mạnh mẽ để ghép chuỗi từ nhiều phần tử với hiệu năng vượt trội so với các cách nối chuỗi thông thường trong VBA.

Điểm đặc biệt của hàm là:
  • Hỗ trợ delimiter (chuỗi ngăn cách giữa các phần tử).
  • Hỗ trợ prefixsuffix (chuỗi bao quanh mỗi phần tử).
  • Có thể nhận trực tiếp ParamArray từ VBA, giúp tùy biến theo nhiều tình huống.

Điều này giúp StringBuilderFast không chỉ dùng để nối văn bản thông thường, mà còn ứng dụng được trong tạo HTML, XML, danh sách, báo cáo, cấu trúc dữ liệu




Cách khai báo trong VBA​

Mã:
Private Declare PtrSafe Function StringBuilderFast Lib "MyLibrary64.dll" ( _
ByVal arr As Variant, _
ByVal delimiter As Variant, _
ByVal prefix As Variant, _
ByVal suffix As Variant) As Variant


Public Function JoinNativeFull(delimiter As Variant, prefix As Variant, suffix As Variant, _
ParamArray args() As Variant) As String
JoinNativeFull = CStr(StringBuilderFast(args, delimiter, prefix, suffix))
End Function




Ví dụ ứng dụng​

1. Nối chuỗi thông thường​

Mã:
Sub TestStringBuilderFast()
Dim result As String
result = JoinNativeFull(" | ", "[", "]", "Hello", "World", 123, #9/17/2025#, True)
Debug.Print result
' Kết quả:
' [Hello] | [World] | [123] | [17/09/2025] | [True]
End Sub




2. Tạo danh sách HTML​

Mã:
Sub Example_HTMLList()
Dim items As String
items = JoinNativeFull(vbCrLf, "", "", "Apple", "Banana", "Cherry")


Dim html As String<br>html = "&lt;ul&gt;" &amp; vbCrLf &amp; items &amp; vbCrLf &amp; "&lt;/ul&gt;"<br><br>Debug.Print html<br>' &lt;ul&gt;<br>' &lt;li&gt;Apple&lt;/li&gt;<br>' &lt;li&gt;Banana&lt;/li&gt;<br>' &lt;li&gt;Cherry&lt;/li&gt;<br>' &lt;/ul&gt;<br>

End Sub




3. Xuất dữ liệu XML dạng bảng​

Mã:
Sub Example_XMLTable()
Dim rows As String
rows = JoinNativeFull(vbCrLf, "", "", "Alice", "Bob", "Charlie")


Dim xml As String<br>xml = "&lt;table&gt;" &amp; vbCrLf &amp; rows &amp; vbCrLf &amp; "&lt;/table&gt;"<br><br>Debug.Print xml<br>' &lt;table&gt;<br>' &lt;row&gt;&lt;col&gt;Alice&lt;/col&gt;&lt;/row&gt;<br>' &lt;row&gt;&lt;col&gt;Bob&lt;/col&gt;&lt;/row&gt;<br>' &lt;row&gt;&lt;col&gt;Charlie&lt;/col&gt;&lt;/row&gt;<br>' &lt;/table&gt;<br>

End Sub




4. Sinh thẻ​

Mã:
Sub Example_HTMLSelect()
Dim options As String
options = JoinNativeFull(vbCrLf, "", "", "Red", "Green", "Blue")


Dim html As String<br>html = "&lt;select&gt;" &amp; vbCrLf &amp; options &amp; vbCrLf &amp; "&lt;/select&gt;"<br><br>Debug.Print html<br>' &lt;select&gt;<br>' &lt;option&gt;Red&lt;/option&gt;<br>' &lt;option&gt;Green&lt;/option&gt;<br>' &lt;option&gt;Blue&lt;/option&gt;<br>' &lt;/select&gt;<br>

End Sub




Kết luận​


Hàm StringBuilderFast có thể coi như một công cụ "dao đa năng" trong xử lý chuỗi của VBA:


  • Nối văn bản theo nhiều định dạng.
  • Tạo HTML, XML nhanh chóng.
  • Xây dựng báo cáo hoặc cấu trúc dữ liệu.
  • Giúp code VBA gọn hơn, chạy nhanh hơn.

Đây là một trong những ví dụ điển hình của việc kết hợp VBA + DLL native code để vượt qua giới hạn tốc độ của VBA thuần.



Mã:
Private Declare PtrSafe Function StringBuilderFast Lib "MyLibrary64.dll" ( _
    ByVal arr As Variant, _
    ByVal delimiter As Variant, _
    ByVal prefix As Variant, _
    ByVal suffix As Variant) As Variant

Public Function JoinNativeFull(delimiter As Variant, prefix As Variant, suffix As Variant, _
                               ParamArray args() As Variant) As String
    JoinNativeFull = CStr(StringBuilderFast(args, delimiter, prefix, suffix))
End Function


Sub TestStringBuilderFast()
    Dim result As String

    result = JoinNativeFull(" | ", "[", "]", "Hello", "World", 123, #9/17/2025#, True, Null, Empty)
    Debug.Print result
    Range("A1").Value = result
End Sub

Sub Example8_HTMLList()
    Dim items As String
    items = JoinNativeFull(vbCrLf, "<li>", "</li>", "Apple", "Banana", "Cherry")

    Dim html As String
    html = "<ul>" & vbCrLf & items & vbCrLf & "</ul>"

    Debug.Print html
    ' ??
    ' <ul>
    ' <li>Apple</li>
    ' <li>Banana</li>
    ' <li>Cherry</li>
    ' </ul>
End Sub

Sub Example9_XMLTable()
    Dim rows As String
    rows = JoinNativeFull(vbCrLf, "<row><col>", "</col></row>", "Alice", "Bob", "Charlie")

    Dim xml As String
    xml = "<table>" & vbCrLf & rows & vbCrLf & "</table>"

    Debug.Print xml
    ' ??
    ' <table>
    ' <row><col>Alice</col></row>
    ' <row><col>Bob</col></row>
    ' <row><col>Charlie</col></row>
    ' </table>
End Sub

Sub Example10_HTMLSelect()
    Dim options As String
    options = JoinNativeFull(vbCrLf, "<option>", "</option>", "Red", "Green", "Blue")

    Dim html As String
    html = "<select>" & vbCrLf & options & vbCrLf & "</select>"

    Debug.Print html
    ' ??
    ' <select>
    ' <option>Red</option>
    ' <option>Green</option>
    ' <option>Blue</option>
    ' </select>
End Sub
 
Lần chỉnh sửa cuối:

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

Back
Top Bottom