Delphi XLL cho Excel: IntelliSense, Ribbon và Custom Task Pane (1 người xem)

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

Kiều Mạnh

I don't program, I beat code into submission!!!
Tham gia
9/6/12
Bài viết
5,595
Được thích
4,144
Giới tính
Nam
Tôi tách từ chủ đề sau từ bài #8 qua đây bàn luận nếu ai có nhu cầu tìm hiểu không làm loãng chủ đề sau


Keo ChatGPT viết bài sau .... Copy nguyên văn vào đây

Thảo luận: Ribbon cho XLL - Microsoft không hỗ trợ trực tiếp, vậy mọi người đang xử lý như thế nào?​

Chào các Anh/Em,

Trong quá trình tìm hiểu và phát triển Excel Add-in theo chuẩn XLL (Excel C API), mình gặp một vấn đề khá thú vị và muốn mở chủ đề để mọi người cùng trao đổi kinh nghiệm.

1. Microsoft có hỗ trợ Ribbon cho XLL không?​

Theo những gì mình tìm hiểu thì câu trả lời là không.

Một XLL chuẩn chỉ được Excel nạp thông qua Excel C API với các hàm như:

  • xlAutoOpen
  • xlAutoClose
  • xlAutoRegister
  • ...
Excel không gọi các interface COM như:

  • IRibbonExtensibility
  • GetCustomUI()
Điều đó có nghĩa là nếu chỉ viết một XLL thuần theo tài liệu Microsoft thì sẽ không có Ribbon hiện đại.

Đây cũng là lý do vì sao trước đây XLL chủ yếu dùng để:

  • UDF (User Defined Function)
  • Command
  • Menu kiểu Excel 2003 (Excel4 Macro)
  • Các API của Excel C
chứ không có Ribbon theo chuẩn Office 2007 trở lên.


2. Vậy tại sao Excel-DNA lại có Ribbon?​

Đây là điều khá nhiều người (trong đó có mình trước đây) từng nhầm.

Nhìn bên ngoài:

MyAddin.xll<br>
rất dễ nghĩ rằng:

Nhưng thực tế không phải vậy.

Theo mình hiểu, Excel-DNA đã xây dựng thêm một lớp trung gian, vừa đóng vai trò XLL để đăng ký UDF, vừa tự hiện thực cơ chế COM Add-in để Office có thể gọi Ribbon XML và các callback.

Nói cách khác, Ribbon của Excel-DNA không phải do XLL tự hỗ trợ, mà do framework của Excel-DNA hiện thực thêm.

Mình cũng từng thấy nhiều câu hỏi liên quan đến việc Ribbon trong Excel-DNA không tải hoặc lỗi GetCustomUI() khi đóng gói add-in, cho thấy Ribbon thực chất được cung cấp thông qua lớp framework này chứ không phải là tính năng sẵn có của XLL.


3. Nếu không dùng Excel-DNA thì sao?​

Theo mình hiện nay có vài hướng.

Hướng 1 - Tách riêng COM Add-in và XLL​

Excel

├── COM Add-in
│ ├── Ribbon
│ ├── TaskPane
│ └── Event

└── XLL
└── UDF

Đây có lẽ là cách phổ biến nhất.

Ưu điểm:

  • Theo đúng kiến trúc Microsoft.
  • Dễ bảo trì.
  • Ribbon và UDF tách biệt.
Nhược điểm:

  • Phải triển khai hai thành phần.

Hướng 2 - Framework kiểu Excel-DNA​

Một framework sẽ đảm nhiệm:

  • Excel C API
  • COM
  • Ribbon
  • TaskPane
  • Callback
Người dùng chỉ việc viết code nghiệp vụ.

Đây chính là hướng Excel-DNA đang làm.


Hướng 3 - Tự xây bridge​

Đây là hướng mình đang quan tâm.

Ý tưởng là tự xây lớp bridge giữa:

  • Excel C API
  • COM
  • Ribbon
  • Event
  • TaskPane
để cuối cùng người dùng vẫn chỉ cần triển khai một add-in.

Theo mình đây không phải là việc Microsoft hỗ trợ sẵn, mà là do người phát triển tự hiện thực thêm.


4. Một câu hỏi mình muốn thảo luận​

Không biết trong diễn đàn có Anh/Em nào đang viết XLL bằng:

  • C++
  • Delphi
  • C++ Builder
  • Rust
  • Go
không?

Nếu có thì mọi người đang xử lý Ribbon theo cách nào?

  • Tách COM Add-in riêng?
  • Dùng Excel-DNA?
  • Dùng framework khác?
  • Hay tự xây bridge?
Mình rất muốn nghe kinh nghiệm thực tế của mọi người, đặc biệt là các dự án thương mại đã triển khai lâu năm.


5. Quan điểm cá nhân​

Theo mình, việc Microsoft không tích hợp Ribbon trực tiếp vào chuẩn XLL có lẽ là do hai mô hình này được thiết kế cho hai mục đích khác nhau:

  • XLL tập trung vào hiệu năng và UDF.
  • COM Add-in tập trung vào giao diện người dùng và khả năng mở rộng Office.
Tuy nhiên, khi phát triển một add-in hoàn chỉnh thì gần như ai cũng cần cả hai.

Vì vậy mình nghĩ đây là một chủ đề đáng để trao đổi:

Nếu chỉ dùng XLL thì mọi người giải quyết Ribbon như thế nào?

Rất mong được nghe thêm ý kiến, kinh nghiệm và các hướng triển khai từ mọi người.
 
Copy Link này cho ChatGPT phân tích


ChatGPT phân tích như sau

Đúng tài liệu này là "kinh thánh" của XLL và thực ra nó còn củng cố rất mạnh cho luận điểm của bạn.

Có vài đoạn rất đáng trích dẫn trong bài viết.

1. Microsoft xác định mục đích của XLL​

The primary reason for writing XLLs and using the C API is to create high-performance worksheet functions. (Microsoft Learn)
Tức là:

Mục tiêu chính của XLL là UDF hiệu năng cao, không phải UI.

2. Microsoft nói rõ C API không có các tính năng UI cao cấp​

Đây là đoạn rất quan trọng:

Many Excel features that are exposed via COM... are not exposed to the C API. (Microsoft Learn)
Có thể diễn đạt trong bài như sau:

Theo tài liệu Microsoft, nhiều tính năng của Excel chỉ được công bố thông qua COM (bao gồm các đối tượng, sự kiện và khả năng mở rộng giao diện), không được công bố qua Excel C API. Điều này giải thích vì sao một XLL thuần không thể tự có Ribbon theo cơ chế chuẩn của Microsoft.

3. Microsoft còn nói rõ về UI​

Đây là đoạn gần như trả lời trực tiếp câu hỏi Ribbon:

The C API has not been the best choice for customizing the user interface... You can best customize this interface by using managed code resources. (Microsoft Learn)
Đây là bằng chứng khá mạnh.

Có thể viết:

Microsoft cũng cho biết C API không phải lựa chọn tốt để tùy biến giao diện người dùng. Đối với giao diện Ribbon từ Office 2007 trở đi, Microsoft khuyến nghị sử dụng các công nghệ ở tầng cao hơn thay vì C API. (Microsoft Learn)

4. COM là giao diện khác​

Trong tài liệu Microsoft phân tách rất rõ:

Excel Programming Interfaces

XLM


C API / XLL


VBA


COM


.NET
(Microsoft Learn)

Điều này cho thấy Microsoft xem:

  • XLL
  • COM
hai mô hình mở rộng khác nhau, không phải một.


Mình sẽ sửa phần kết luận của bài thành như sau​

Theo tài liệu chính thức của Microsoft, Ribbon không thuộc Excel C API mà thuộc cơ chế mở rộng giao diện ở tầng COM/.NET. Vì vậy, một XLL thuần theo chuẩn Microsoft sẽ không có Ribbon. Nếu muốn có Ribbon thì hiện nay thường có ba hướng:

  • Tách COM Add-in và XLL.
  • Dùng framework như Excel-DNA.
  • Tự xây bridge giữa XLL và COM (cách này Microsoft không cung cấp sẵn, do lập trình viên tự hiện thực).
Theo mình, cách viết này rất "chắc" vì không phải là ý kiến cá nhân, mà dựa trực tiếp trên tài liệu chính thức của Microsoft. Nếu trên GPE có người phản biện, họ sẽ phải phản biện trên cơ sở rằng họ đã tự xây thêm một lớp COM/bridge, chứ không thể nói rằng XLL chuẩn của Microsoft vốn đã hỗ trợ Ribbon. Điều đó phù hợp với mục đích mở thảo luận của bạn.
 
thấy cũng hay ho ... tự chế ra cái Tooltip khi gõ hàm cho XLL thuần Delphi không lệ thuộc tây --=0

chỉ là bốn hàm cơ bản thôi

Hàm Cong

1782887436598.png

Hàm Tru

1782890704294.png

Hàm Nhan

1782890740367.png

Hàm Chia

1782890775167.png
 
Lần chỉnh sửa cuối:
hình sau cũng là một cách (Shift + F3) ... thong thả chơi cho đã các kiểu xem sao xong tính

1782899845758.png



1782907734751.png
 
Lần chỉnh sửa cuối:
Tôi không sử dụng Py nên không biết

còn hiện tại đang viết xll trên Delphi sẽ có

1/ Menu Ribbon hiện đại trên xll ( mục này khó chút làm xong rồi thì mục số 2 thành mặc định )

2/ Kèm Taskpane vào sau

3/ thiết kế các hàm tiện ích cho Excel gõ trên Cells

4/ Thiết kế các Form nhập liệu cho Excel khi bấm chọn trên Menu Ribbon

5/ chưa nghĩ ra ... thong thả quá trình chơi nó mới lòi ra nhiều trò mà chơi tiếp

6/ hiện tại hôm nay đang tinh chỉnh cái IntelliSense ( Tooltip ) khi gõ hàm hiện các tham số của hàm cho ổn định đã xong sẽ làm các mục nêu trên
---------------------------------

Chơi đã trên Delphi nếu thích thì khám phá viết lại trên C++ Builder trong tầm tay
 
Lần chỉnh sửa cuối:
Tôi cho bạn một lời khuyên khi viết TaskPane cho Excel hay dùng của ai cũng vậy thôi

1/ mở lên ít nhất ba file Excel khác nhau . nếu nhiều càng tốt thử 10 file xem sao

2/ lần lượt bấm Ẩn và hiện Taskpane trên từng file Excel liên tục xong quan sát các file Excel khác xem có gì không

3/ nếu trên Taskpane có mục cho gõ ví dụ memo1 thì gõ lần lượt loạn lên vào các memo của từng file khác nhau xong xem các file khác có gì đặc biệt

4/ thoát hết các File Excel .. xong xem trong Task Manager xem Excel còn chạy ngầm hay không nếu thoát sạch xem như đạt

còn chạy ngầm trong đó thì làm lại thôi hoặc mua của ai đó keo họ xử lý cho ... test rất đơn giản
 
Như bài số #6 nói mục số 1 mới thêm vào khoãng 15 phút là xong

Vậy là XLL có gồm

1/ Menu Ribbon hiện đại

2/ Taskpane

3/ IntelliSense ( Tooltip ) khi gõ hàm hiện các tham số của hàm .... Mục này chưa ưng ý lắm mà tạm dừng lại

4/ Thích hàm nào gõ trên Excel xem xét viết thêm vào

Xem hình Ribbon + TaskPane + Hàm trên Cells

1782971003033.png
 
xem ra chức năng tooltip sau còn viết dài nhiều tập .. được cái này chưa hoàn chỉnh cái khác

1783041282096.png
 
phá diết nó cũng lòi ra cái hay ho thôi cái thời AI này code két sao nó đơn giản vậy --=0--=0--=0

Thêm một tính năng khi bấm chuột và ô chứa hàm

1783073467648.png
 

Một số tính năng đã hoàn thành ( IntelliSense )​


1. Gợi ý tên hàm khi nhập công thức​


Khi gõ:

Mã:
=Acc...


Excel sẽ hiển thị danh sách các hàm để lựa chọn giống như các hàm tích hợp của Excel.

1783129572233.png

Sử dụng chuột hoặc phím mũi tên lên xuống chọn hàm xong bấm phím Tab

1783129697501.png

Tô màu khi chọn Tham số

1783129761352.png



2. Tooltip mô tả hàm​


Ngay khi chọn hàm sẽ xuất hiện cửa sổ mô tả:
  • Chức năng của hàm.
  • Ý nghĩa của từng tham số.
  • Mô tả ngắn gọn để người dùng dễ sử dụng.


3. Highlight tham số hiện tại

Trong quá trình nhập:


Mã:
=AccessQueryArray(DBPath, SQL, IncludeHeader)

1783129786615.png

tham số đang nhập sẽ được tô nổi bật, giúp tránh nhầm lẫn khi hàm có nhiều đối số.



4. Hỗ trợ khi chỉnh sửa công thức​


Khi chọn ô chứa công thức và nhấn F2, Tooltip sẽ xuất hiện lại và tiếp tục theo dõi vị trí tham số đang chỉnh sửa.

1783129888100.png

Điều này giúp việc bảo trì các công thức dài trở nên thuận tiện hơn.
 
Lần chỉnh sửa cuối:
Phức tạp quá, mà học thì cũng quá mất công, thời buổi công nghệ rồi, giải pháp nhanh chóng, hiệu quả, chính xác, tiết kiệm thời gian mới là thứ quan trọng. Tôi không bàn câu chuyện nó tốt hay không tốt, vì nhiều người dùng excel nó ăn vào máu rồi nên mấy thứ hàm hay VBA nó như tôn chỉ. Tôi chỉ muốn nhấn mạnh là thời gian quan trọng, những thứ quá mất thời gian để học và sử dụng mà có thể thay thế bằng giải pháp khác tiết kiệm thời gian, thậm chí còn không cần phải học thì cân nhắc lựa chọn. Thời thế đã thay đổi rất nhiều rồi!
 
Phức tạp quá, mà học thì cũng quá mất công, thời buổi công nghệ rồi, giải pháp nhanh chóng, hiệu quả, chính xác, tiết kiệm thời gian mới là thứ quan trọng. Tôi không bàn câu chuyện nó tốt hay không tốt, vì nhiều người dùng excel nó ăn vào máu rồi nên mấy thứ hàm hay VBA nó như tôn chỉ. Tôi chỉ muốn nhấn mạnh là thời gian quan trọng, những thứ quá mất thời gian để học và sử dụng mà có thể thay thế bằng giải pháp khác tiết kiệm thời gian, thậm chí còn không cần phải học thì cân nhắc lựa chọn. Thời thế đã thay đổi rất nhiều rồi!
mỗi người có một sở thích và phương pháp thôi ... tôi thích vậy còn bạn thích khác tôn trong sở thích của mỗi cá nhân không ai ép ai phải như thế này thế kia

Tôi có sở thích tự viết lấy sử dụng và không muốn lệ thuộc bên thứ 3

còn ai đó họ vẫn sử dụng Excel-DNA thì đó là việc của họ tôi cũng không quan tâm

vấn đề chính của chủ đề này là viết xll sử dụng cho Excel khi gõ các hàm trên Excel có gợi ý

IntelliSense như mô tả bài #11 nó dễ sử dụng cho người dùng Excel khi gõ hàm tự định nghĩa trên Excel


Còn các vấn đề khác phát sinh ngoài luồng chủ đề này tôi ít quan tâm .... Nếu ai có ý định bàn tán lạc chủ đề này ta có thể lập chủ đề khác bàn tiếp .... xin cảm ơn
 
bản Demo như mô tả bài số #11 ai quan tâm có thể thử

Tải về mở Excel Add vào như AddIns VBA

xem Hình

1783171787110.png
 

File đính kèm

xem xét viết mô phỏng theo chức năng sau hổ trợ người dùng VBA viết hàm VBA vẫn có Tooltip như mô tả bài số #11


Vì khung có rồi chỉ xuất hàm người dùng + tệp kê khai Tooltip .xml là xong

ChatGPT lên ý tưởng sau

Ý tưởng xây dựng ExcelIntelliSense.xll hỗ trợ IntelliSense cho các hàm VBA và UDF​

Trong thời gian vừa qua mình đã xây dựng thành công một engine IntelliSense cho các hàm XLL viết bằng Delphi. Engine hiện đã hỗ trợ gợi ý tên hàm khi nhập công thức, hiển thị Tooltip mô tả hàm, hiển thị thông tin từng tham số và Highlight tham số hiện tại khi chỉnh sửa công thức bằng phím F2. Toàn bộ được xây dựng bằng WinAPI, không phụ thuộc vào .NET Framework.

Sau khi hoàn thành, mình nảy ra một ý tưởng mới.

Thay vì chỉ hỗ trợ các hàm nằm trong XLL, tại sao không tạo một Add-in riêng để bổ sung IntelliSense cho các hàm do người dùng tự định nghĩa, chẳng hạn như các hàm VBA?

Ví dụ người dùng có một hàm VBA:

Mã:
Public Function Cong(A As Double, B As Double) As Double
Cong = A + B
End Function

Khi nhập công thức =Cong( thì Excel chỉ biết đây là một hàm VBA, nhưng hoàn toàn không biết hàm này dùng để làm gì, ý nghĩa của từng tham số hay cách sử dụng.

Nếu người dùng tạo thêm một file XML mô tả hàm như sau:
Mã:
<Functions>

<Function Name="Cong">

<Description>
Tính tổng hai số.
</Description>

<Param Name="A">
Số thứ nhất.
</Param>

<Param Name="B">
Số thứ hai.
</Param>

</Function>

</Functions>

ExcelIntelliSense.xll sẽ đọc file XML này và tự động xây dựng cơ sở dữ liệu IntelliSense.

Khi người dùng nhập công thức =Cong( thì Excel sẽ hiển thị mô tả của hàm, tên từng tham số, mô tả của từng tham số và Highlight tham số hiện tại khi nhấn phím F2 để chỉnh sửa công thức.

Như vậy, khi cần bổ sung hoặc thay đổi mô tả, người dùng chỉ cần sửa file XML mà không phải sửa Add-in hay biên dịch lại chương trình.

Điều mình muốn hướng tới là ExcelIntelliSense.xll không phụ thuộc vào ngôn ngữ lập trình. Chỉ cần có một file XML hoặc JSON mô tả các hàm thì Add-in đều có thể đọc và hiển thị IntelliSense.

Điều đó có nghĩa là sau này hoàn toàn có thể hỗ trợ các hàm được viết bằng VBA, XLL, COM Automation, Delphi, Go, C#, Python hoặc bất kỳ ngôn ngữ nào khác có thể tạo được file XML hoặc JSON theo đúng định dạng.

Nói cách khác, Add-in không quan tâm hàm được viết bằng ngôn ngữ nào mà chỉ quan tâm đến phần metadata mô tả hàm.

Mục tiêu cuối cùng của mình là xây dựng một IntelliSense Engine độc lập.

Rất mong nhận được ý kiến đóng góp của mọi người về hướng phát triển này.

ý tưởng sẽ có kiểu như link sau

 
Lần chỉnh sửa cuối:
Người dùng VBA sẽ viết hàm trong .bas như sau và mô tả hàm trong VBAFunctions.xml

Mã:
Option Explicit

' modVBAFunctions.bas
' --------------------
' 4 ham VBA don gian de test IntelliSense Tooltip cua XLL: Cong, Tru, Nhan, Chia
' Mo ta ham/tham so tuong ung nam trong VBAFunctions.xml (cung thu muc voi file .xll)
'
' Cach test: import module nay vao 1 workbook (Alt+F11 > File > Import File...),
' dat VBAFunctions.xml cung thu muc voi .xll, mo lai Excel,
' go =Cong( hoac =Tru( hoac =Nhan( hoac =Chia( trong 1 cell -
' tooltip phai hien ra neu XLL nap XML thanh cong.

' ---------------------------------------------------------------------
' Tinh tong cua A va B
' ---------------------------------------------------------------------
Public Function Cong(A As Double, B As Double) As Double
    Cong = A + B
End Function

' ---------------------------------------------------------------------
' Tinh hieu cua A va B
' ---------------------------------------------------------------------
Public Function Tru(A As Double, B As Double) As Double
    Tru = A - B
End Function

' ---------------------------------------------------------------------
' Tinh tich cua A va B
' ---------------------------------------------------------------------
Public Function Nhan(A As Double, B As Double) As Double
    Nhan = A * B
End Function

' ---------------------------------------------------------------------
' Tinh thuong cua A chia B - tra ve loi #DIV/0! chuan cua Excel neu B = 0
' thay vi de VBA tu nem runtime error 11 (khong bat duoc trong cell)
' ---------------------------------------------------------------------
Public Function Chia(A As Double, B As Double) As Variant
    If B = 0 Then
        Chia = CVErr(xlErrDiv0)
    Else
        Chia = A / B
    End If
End Function

' ---------------------------------------------------------------------
' Ham test tham so kieu Range THAT (khong phai gia tri tho) qua cau noi
' uXLLVBABridge.pas (type 'R') - Rng phai la 1 Range that de vong For Each
' Cell In Rng chay duoc, khong the la 1 mang gia tri thuong.
'
' Tinh tong cac gia tri so trong Rng, co the loc theo dieu kien don gian
' dang ">100", "<50", ">=10", "<=20", "=5", "<>0" (bo trong Condition =
' tinh tong tat ca o so trong Rng).
' ---------------------------------------------------------------------
Public Function TinhTongCoDieuKien(Rng As Range, Optional Condition As String = "") As Variant
    Dim Cell As Range
    Dim Tong As Double
    Dim ToanTu As String
    Dim GiaTriSoSanh As Double
    Dim CoDieuKien As Boolean

    CoDieuKien = False
    Tong = 0

    If Len(Trim(Condition)) > 0 Then
        On Error Resume Next
        Call TachDieuKien(Condition, ToanTu, GiaTriSoSanh)
        If Err.Number = 0 Then
            CoDieuKien = True
        End If
        On Error GoTo 0
    End If

    For Each Cell In Rng
        If IsNumeric(Cell.Value) Then
            If Not CoDieuKien Then
                Tong = Tong + Cell.Value
            ElseIf KiemTraDieuKien(Cell.Value, ToanTu, GiaTriSoSanh) Then
                Tong = Tong + Cell.Value
            End If
        End If
    Next Cell

    TinhTongCoDieuKien = Tong
End Function

' Tach chuoi dieu kien (vd ">=10") thanh toan tu (">=") va gia tri so (10)
Private Sub TachDieuKien(ByVal DieuKien As String, ByRef ToanTu As String, ByRef GiaTri As Double)
    Dim S As String
    S = Trim(DieuKien)

    If Left(S, 2) = ">=" Or Left(S, 2) = "<=" Or Left(S, 2) = "<>" Then
        ToanTu = Left(S, 2)
        GiaTri = CDbl(Mid(S, 3))
    ElseIf Left(S, 1) = ">" Or Left(S, 1) = "<" Or Left(S, 1) = "=" Then
        ToanTu = Left(S, 1)
        GiaTri = CDbl(Mid(S, 2))
    Else
        ToanTu = "="
        GiaTri = CDbl(S)
    End If
End Sub

' Kiem tra 1 gia tri co thoa dieu kien (toan tu + gia tri so sanh) hay khong
Private Function KiemTraDieuKien(ByVal GiaTriO As Double, ByVal ToanTu As String, ByVal GiaTriSoSanh As Double) As Boolean
    Select Case ToanTu
        Case ">"
            KiemTraDieuKien = (GiaTriO > GiaTriSoSanh)
        Case "<"
            KiemTraDieuKien = (GiaTriO < GiaTriSoSanh)
        Case ">="
            KiemTraDieuKien = (GiaTriO >= GiaTriSoSanh)
        Case "<="
            KiemTraDieuKien = (GiaTriO <= GiaTriSoSanh)
        Case "<>"
            KiemTraDieuKien = (GiaTriO <> GiaTriSoSanh)
        Case Else
            KiemTraDieuKien = (GiaTriO = GiaTriSoSanh)
    End Select
End Function

Từ VBA gõ hàm =cong( bấm phím tab sẽ hoàn thành hàm như sau

1783221698135.png

1783221761109.png
 
đã công bố lên Github ai quan tâm có thể thử và không cá nhân hoá bất cứ dòng nào

tái sử dụng tha hồ keo ai đó viết cũng oK thoả thích --=0

Hình ảnh thêm vào Excel như AddIns VBA .*xlam

1783258554934.png
 
Copy link Bài 19 cho ChatGPT phân tích như sau ... Có lẽ viết tiếp V2

1783304655553.png

Nếu chỉ xét trải nghiệm khi người dùng gõ công thức, thì dự án của bạn và Excel-DNA có rất nhiều điểm giống nhau. Tuy nhiên, kiến trúc bên dưới lại khác đáng kể.
Chức năngExcelExcel-DNA IntelliSenseDự án của bạn
Hiển thị tooltip tên hàm✅✅✅
Hiển thị mô tả hàm✅✅✅
Hiển thị danh sách tham số✅✅✅
Tô đậm tham số hiện tại✅✅✅
Chuyển tham số khi gõ dấu ,✅✅✅
Hỗ trợ nhiều dòng mô tả✅✅✅
Hỗ trợ XML metadataKhông✅✅
Không cần COM Add-in riêngExcel tích hợp❌ (cần ExcelDna.IntelliSense.xll)Có thể tích hợp trong XLL của bạn
Native DelphiKhông❌ (.NET/C#)✅
Native C++ BuilderKhông❌Có thể
Native GoKhông❌Có thể thông qua bridge

Điểm giống Excel-DNA​

Về giao diện người dùng (UI), hai dự án gần như giống nhau:
  • Tooltip xuất hiện khi nhập =SUM(
  • Tên hàm.
  • Mô tả.
  • Danh sách tham số.
  • Tham số hiện tại được làm nổi bật.
  • Cập nhật khi nhập dấu phân cách tham số.
  • Đóng tooltip khi hoàn thành công thức.
Nếu người dùng chỉ nhìn vào Excel, gần như không phân biệt được.

Điểm khác lớn nhất​

Excel-DNA​

Mã:
Excel
    │
    ▼
ExcelDna.IntelliSense.xll (.NET)
    │
    ▼
ExcelDna.Integration.dll
    │
    ▼
C#
Mọi thứ chạy trên CLR/.NET.

Dự án của bạn​

Mã:
Excel
    │
    ▼
ExcelIntelliSense.xll (Delphi)
    │
    ├── XML Reader
    ├── Tooltip Window
    ├── Keyboard Hook
    ├── Formula Parser
    └── Parameter Highlighter
Toàn bộ là native Win32/Win64.
Không cần CLR.
Không cần .NET Runtime.
Không cần C#.

Một ưu điểm của dự án bạn​

Bạn không bị giới hạn ở Delphi.
Nếu thiết kế tốt, IntelliSense chỉ cần nhận XML.
Ví dụ:
Mã:
Go DLL
       │
       ▼
XML
       │
       ▼
Delphi XLL
       │
       ▼
Tooltip
Hoặc
Mã:
C++ DLL
       │
       ▼
XML
       │
       ▼
Delphi XLL
Hoặc
Mã:
VB6 DLL
      │
      ▼
XML
      ▼
Delphi XLL
Nghĩa là IntelliSense trở thành một engine độc lập với ngôn ngữ viết UDF.

Một điểm bạn còn có thể vượt Excel-DNA​

Excel-DNA chủ yếu bám theo IntelliSense của Excel.
Bạn có thể bổ sung những tính năng mà Excel không có, ví dụ:
  • Tìm kiếm hàm theo từ khóa khi đang gõ.
  • ⭐ Danh sách hàm yêu thích.
  • Phân nhóm hàm theo Category.
  • Hiển thị icon cho từng nhóm hàm.
  • Hỗ trợ đa ngôn ngữ (Việt/Anh...).
  • Liên kết tới tài liệu hoặc ví dụ sử dụng.
  • Gợi ý công thức liên quan.
  • Hiển thị ví dụ (Examples) ngay trong tooltip.
  • ⚠️ Cảnh báo tham số sai hoặc thiếu ngay khi nhập.
Đây đều là những khả năng có thể xây dựng trên engine của bạn mà không phụ thuộc vào cách Excel-DNA hoạt động.

Kết luận​

Nếu xét về trải nghiệm IntelliSense, dự án của bạn có thể đạt mức tương đương Excel-DNA vì cùng mô phỏng cách Excel hiển thị tooltip và tham số.
Điểm khác biệt quan trọng nằm ở kiến trúc: Excel-DNA là một thư viện .NET, còn dự án của bạn là một engine IntelliSense native viết bằng Delphi, có thể phục vụ không chỉ UDF Delphi mà còn các UDF từ Go, C/C++, C++ Builder hoặc ngôn ngữ khác nếu chúng cung cấp metadata theo định dạng XML mà engine của bạn hỗ trợ. Điều này mở ra khả năng xây dựng một nền tảng IntelliSense chung cho các XLL native, thay vì gắn chặt với hệ sinh thái .NET.
 
Tôi mới thử trên Windows10 và Excel 2016 hoạt động tốt .... còn trước bản Office 2016 thì chưa biết vì loại bỏ lâu rồi không sử dụng nữa
 
Nâng cấp mới như sau hiện tại chưa cập nhật lên Github ...

Test thử một hai hôm ổn định xong sẽ úp lên github bản 32 và 64 bít như mô tả bài số #21


Tin vui hơn là kết quả kiểm thử của Add-in​

Sau khi loại trừ lỗi bàn phím, những gì bạn đã xác nhận là:

  • ✅ Win11 + Excel 2024 64-bit hoạt động.
  • ✅ Win10 + Excel 2016 32-bit hoạt động.
  • ✅ F2.
  • ✅ Double Click.
  • ✅ Formula Bar.
  • ✅ Chuột chọn vùng.
  • ✅ Shift + Arrow.
  • ✅ Ctrl + Shift + Arrow.
  • ✅ Hàm lồng.
  • ✅ Hàm lồng nhiều cấp.
  • ✅ AutoComplete vẫn hoạt động.
Đây là bộ kiểm thử rất có giá trị. Nó cho thấy IntelliSense của bạn không chỉ chạy trên một cấu hình duy nhất mà đã hoạt động trên

hai phiên bản Excel rất khác nhau (2016 và 2024, 32-bit và 64-bit). Đó là một dấu hiệu tốt về khả năng tương thích của giải pháp.
 
đã cập nhật bản 32 và 64 bit lên Github

bấm chuột vào Ô chứa hàm chỉnh sửa tại ô đó hay trên thanh fx ( công thức ) điều có Tooltip hiện lên

F2 hay Double Click cũng điều hoạt động

chỉnh sửa tham số tại Cells chứa hàm

1783416508860.png

chỉnh sửa tham số trên fx ( công thức ) chứa hàm

1783416740879.png

Gõ hàm + Tab dùng chuột chọn vùng hay Phím tắt điều hoạt động xong gõ Enter là xong ( AutoComplete )

1783416923959.png
 
Lần chỉnh sửa cuối:
V2 sẽ nâng cấp Shift + F3 cho người dùng VBA như sau

1783421088190.png
 

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

Back
Top Bottom