Chia sẻ cách tạo gợi ý cho hàm trong Excel bằng thư viện ExcelDna. (1 người xem)

Liên hệ QC

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

giaiphap

==(^o^)==
Tham gia
12/3/07
Bài viết
5,808
Được thích
6,367
Donate (Momo)
Donate
Giới tính
Nam
Chủ đề này không mới, nhưng hiện tại chưa thấy ai chia sẻ trong diễn đàn Giải pháp Excel (Hoặc có thể có rồi nhưng “tui” chưa thấy). Nay “tui” chia sẻ cách tạo gợi ý của hàm trong Excel. Như các bạn thấy khi mình gõ một hàm có sẳn trong Excel (Ví dụ Hàm VLOOKUP) thì sẽ có một gợi ý cho chúng ta biết hàm có công dụng gì, có bao nhiêu tham số, … Nhưng hàm chúng ta viết bằng VBA thì sẽ không thấy gợi ý này.
H1.png
Nếu bạn nào biết C# thì vấn đề này rất dễ dàng, nhưng bạn nào chưa biết thì có thể làm theo cách sau bằng cách sử dụng thư viện có sẳn ExcelDna:
Đầu tiên bạn vào trang web https://github.com/Excel-DNA/IntelliSense/releases và tải một trong 2 file (“tui” khoanh đỏ), tùy theo phiên bản Ofice của bạn mà tải cho phù hợp nhé.
H2.png
Sau khi tải về bạn đặt vào chung thư mục với file Excel mà mình muốn tạo hàm, sau đó mở file Excel bạn cần tạo hàm lên.

Vấn đề trước tiên là bạn sẽ tạo một Sheet mới và đặt tên cho sheet này là “_IntelliSense_” (Tên này lằ bắt buộc không được phép đặt tên khác nhé), trên Sheet này bạn nhập ô A1 là FunctionInfo ô B1 bạn gõ số 1.
H3.png
Tiếp đến bạn nhấn Alt+F11 để mở cửa sổ soạn code VBA lên.
Bạn tạo một Module mới và gõ code vào như sau:
Mã:
Option Explicit
Const xllName = "ExcelDna.IntelliSense.xll"
Const xllName64 = "ExcelDna.IntelliSense64.xll"
Public Sub DangKyDLL()
    On Error GoTo ErrorHandler
    Dim filePath As String
    If m_IsExcelx64 Then
        filePath = ThisWorkbook.Path & "\" & xllName64
    Else
        filePath = ThisWorkbook.Path & "\" & xllName
    End If
    Application.RegisterXLL filePath
    DoEvents
    Exit Sub
ErrorHandler:
    Debug.Print Err.Number, Err.Description
End Sub
Function m_IsExcelx64() As Boolean
    Dim l As Long
    l = -1
    On Error Resume Next
    l = Application.Hinstance
    On Error GoTo 0
    If l = -1 Then
        m_IsExcelx64 = True
    Else
        m_IsExcelx64 = False
    End If
End Function
Lưu ý là ExcelDna.IntelliSense.xll và ExcelDna.IntelliSense64.xll là tên 2 thư viện đã tải về và đặt cùng thư mục với tệp tin Excel nhé.
Bạn tiếp tục tạo thêm một Module mới nửa và viết thêm 2 hàm như sau:
Mã:
Option Explicit
Function ChaoExcelDna()
   ChaoExcelDna = "Chào m" & ChrW(7915) & "ng b" & ChrW(7841) & "n " & ChrW(273) & ChrW(7871) & "n v" & ChrW(7899) & "i ExcelDna"
End Function

Public Function TinhDienTich(dai As Double, rong As Double) As Double
    TinhDienTich = dai * rong
End Function
Bạn tiếp tục nháy đúp chuột vào ThisWorkbook và thêm vào đoạn code sau:
Mã:
Option Explicit
Private Sub Workbook_Open()
On Error GoTo thoat
    Call DangKyDLL
thoat:
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    On Error GoTo thoat
    Application.Run "AutoClose"
thoat:
End Sub
H4.png
Xong bạn đóng cửa sổ VBA lại và trở về giao diện Sheet “_IntelliSense_” để tạo gợi ý cho 2 hàm vừa tạo, sẳn tiện tạo luôn gợi ý (Việt hóa hàm có sẳn của Excel) cho hàm IFERROR có sẳn của Excel như sau:
H5.png
Xong bạn có thể ẩn đi Sheet “_IntelliSense_” để người khác khỏi nhìn thấy (Mục đích là để người dùng không lỡ tay chỉnh sửa hay xóa nhầm dữ liệu gợi ý này).
Cuối cùng bạn đóng file này đi và mở lại nhập thử hàm TinhDienTich hoặc ChaoExcelDna hoặc IFERROR xem kết quả sẽ thấy nó hiện gợi ý cho mình.
H6.png
Bạn có thể tham khảo cách làm chi tiết ở Link sau:
Liên kết: https://www.youtube.com/watch?v=-BIOzl1igXU
 

File đính kèm

Làm bằng VBA có vẻ phức tạp nhỉ. Em viết bằng C# không phải nhiều bước như này
 
Làm bằng VBA có vẻ phức tạp nhỉ. Em viết bằng C# không phải nhiều bước như này

Bạn biết ngôn ngữ C# thì bạn lập trình các hàm và tích hợp mã nguồn của cái DNA vào, bạn cũng phải mất cả vài năm học cho thành thạo C#, hay cũng phải mất nhiều ngày đọc tài liệu để biết cách tích hợp cái DNA vào mà. Nhiều người trên đây biết VBA hơn C# (học biết C# nhưng trình gà không bằng trình VBA của họ), đã có các hàm viết rồi, giờ chỉ cần cái xll kia khai báo vào là xong chứ khó khăn gì đâu.
 
Làm bằng VBA có vẻ phức tạp nhỉ. Em viết bằng C# không phải nhiều bước như này
Ở bài đâu "tui" có viết.
Nếu bạn nào biết C# thì vấn đề này rất dễ dàng.
Nhưng thật ra chưa chắc là dễ đâu. bạn thử mô tả lại từng bước làm bằng C# xem có nhiều bước hơn hay không? Tui dám chắc là không. Giờ tui nói sơ qua những cái phải làm khi tạo bằng C# bạn xem có phải nhiều buywowcs hơn không?
Thứ nhất bạn phải cài thêm thư viện ExcelDna.AddIn rồi mới cài ExcelDna.IntelliSense, bạn viết mô tả các tham số (Gợi ý hàm) cho hàm (được cái là viết trực tiếp ngay chổ đặt tên hàm) giống như Excel thôi vã lại còn thêm lệnh ExcelArgument, Name, Description...
H8.png
Thứ hai trước khi chạy nó vẫn phải đăng ký ExcelDna.IntelliSense với Excel và khi đóng thì nó vẫn phải gỡ đăng ký.
H9.png
Theo tui thấy thì chưa chắc cái nào dễ hơn cái nào, chẳng qua là C# được hổ trợ mọi cái đều tiện và nhanh thôi chứ thực chất vẫn như nhau. Cái khác là do Excel phải viết nhiều lệnh hơn nhưng bản chất là như nhau.
Một cái nửa là như bạn @UltraExcel nói chẳng qua là bạn biết C# thì dễ còn những người chỉ biết VBA thì phải tìm hiểu thêm nhiều hơn.
 
em xin hỏi là muốn tìm hiểu nhiều hơn về exceldna thì có tài liệu nào không ạ? nhiều cái em muốn làm bằng VBA nhưng có VBA hơi hạn chế nên cũng muốn tìm hiểu thêm các phương pháp khác để làm được nhiều cái hơn trong excel, như hình dưới em muốn tạo các nhóm dữ liệu trong microsoft project trong excel với các tính năng y hệt như vậy thì exceldna có làm được không a?

project 1724989835450.png
 
Chủ đề này hay quá mà nay em mới thấy!
Cảm ơn tác giả!
 
Chủ đề này không mới, nhưng hiện tại chưa thấy ai chia sẻ trong diễn đàn Giải pháp Excel (Hoặc có thể có rồi nhưng “tui” chưa thấy). Nay “tui” chia sẻ cách tạo gợi ý của hàm trong Excel. Như các bạn thấy khi mình gõ một hàm có sẳn trong Excel (Ví dụ Hàm VLOOKUP) thì sẽ có một gợi ý cho chúng ta biết hàm có công dụng gì, có bao nhiêu tham số, … Nhưng hàm chúng ta viết bằng VBA thì sẽ không thấy gợi ý này.
View attachment 285702
Nếu bạn nào biết C# thì vấn đề này rất dễ dàng, nhưng bạn nào chưa biết thì có thể làm theo cách sau bằng cách sử dụng thư viện có sẳn ExcelDna:
Đầu tiên bạn vào trang web https://github.com/Excel-DNA/IntelliSense/releases và tải một trong 2 file (“tui” khoanh đỏ), tùy theo phiên bản Ofice của bạn mà tải cho phù hợp nhé.
View attachment 285703
Sau khi tải về bạn đặt vào chung thư mục với file Excel mà mình muốn tạo hàm, sau đó mở file Excel bạn cần tạo hàm lên.

Vấn đề trước tiên là bạn sẽ tạo một Sheet mới và đặt tên cho sheet này là “_IntelliSense_” (Tên này lằ bắt buộc không được phép đặt tên khác nhé), trên Sheet này bạn nhập ô A1 là FunctionInfo ô B1 bạn gõ số 1.
View attachment 285704
Tiếp đến bạn nhấn Alt+F11 để mở cửa sổ soạn code VBA lên.
Bạn tạo một Module mới và gõ code vào như sau:
Mã:
Option Explicit
Const xllName = "ExcelDna.IntelliSense.xll"
Const xllName64 = "ExcelDna.IntelliSense64.xll"
Public Sub DangKyDLL()
    On Error GoTo ErrorHandler
    Dim filePath As String
    If m_IsExcelx64 Then
        filePath = ThisWorkbook.Path & "\" & xllName64
    Else
        filePath = ThisWorkbook.Path & "\" & xllName
    End If
    Application.RegisterXLL filePath
    DoEvents
    Exit Sub
ErrorHandler:
    Debug.Print Err.Number, Err.Description
End Sub
Function m_IsExcelx64() As Boolean
    Dim l As Long
    l = -1
    On Error Resume Next
    l = Application.Hinstance
    On Error GoTo 0
    If l = -1 Then
        m_IsExcelx64 = True
    Else
        m_IsExcelx64 = False
    End If
End Function
Lưu ý là ExcelDna.IntelliSense.xll và ExcelDna.IntelliSense64.xll là tên 2 thư viện đã tải về và đặt cùng thư mục với tệp tin Excel nhé.
Bạn tiếp tục tạo thêm một Module mới nửa và viết thêm 2 hàm như sau:
Mã:
Option Explicit
Function ChaoExcelDna()
   ChaoExcelDna = "Chào m" & ChrW(7915) & "ng b" & ChrW(7841) & "n " & ChrW(273) & ChrW(7871) & "n v" & ChrW(7899) & "i ExcelDna"
End Function

Public Function TinhDienTich(dai As Double, rong As Double) As Double
    TinhDienTich = dai * rong
End Function
Bạn tiếp tục nháy đúp chuột vào ThisWorkbook và thêm vào đoạn code sau:
Mã:
Option Explicit
Private Sub Workbook_Open()
On Error GoTo thoat
    Call DangKyDLL
thoat:
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    On Error GoTo thoat
    Application.Run "AutoClose"
thoat:
End Sub
View attachment 285705
Xong bạn đóng cửa sổ VBA lại và trở về giao diện Sheet “_IntelliSense_” để tạo gợi ý cho 2 hàm vừa tạo, sẳn tiện tạo luôn gợi ý (Việt hóa hàm có sẳn của Excel) cho hàm IFERROR có sẳn của Excel như sau:
View attachment 285706
Xong bạn có thể ẩn đi Sheet “_IntelliSense_” để người khác khỏi nhìn thấy (Mục đích là để người dùng không lỡ tay chỉnh sửa hay xóa nhầm dữ liệu gợi ý này).
Cuối cùng bạn đóng file này đi và mở lại nhập thử hàm TinhDienTich hoặc ChaoExcelDna hoặc IFERROR xem kết quả sẽ thấy nó hiện gợi ý cho mình.
View attachment 285707
Bạn có thể tham khảo cách làm chi tiết ở Link sau:
Liên kết: https://www.youtube.com/watch?v=-BIOzl1igXU
vậy là mỗi lần copy file cho máy khác phải copy cái thư viện đó cho họ luôn hả ad
 
vậy là mỗi lần copy file cho máy khác phải copy cái thư viện đó cho họ luôn hả ad
Cái này là điều hiển nhiên rồi, không có file DLL rồi sao nó đăng ký được. Còn bạn muốn chỉ dùng 1 file duy nhất thì có thể tham khảo file này (Có điều hơi bị nặng).
Do file nặng nên không thể up lên diễn đàn được nên tui đã chia nhỏ thành 3 file, khi tải cả 3 file về giải nén vào cùng một thư mục, sau đó dùng phần mềm HJ-Split để ghép lại file.
Hoặc có thể tải file ở đây, nhưng lưu ý nó chỉ tồn tại trong 1 tháng (Sau 1 tháng file sẽ bị xóa)
 

File đính kèm

Lần chỉnh sửa cuối:
Cái này là điều hiển nhiên rồi, không có file DLL rồi sao nó đăng ký được. Còn bạn muốn chỉ dùng 1 file duy nhất thì có thể tham khảo file này (Có điều hơi bị nặng).
Do file nặng nên không thể up lên diễn đàn được nên tui đã chia nhỏ thành 3 file, khi tải cả 3 file về giải nén vào cùng một thư mục, sau đó dùng phần mềm HJ-Split để ghép lại file.
Hoặc có thể tải file ở đây, nhưng lưu ý nó chỉ tồn tại trong 1 tháng (Sau 1 tháng file sẽ bị xóa)
Ở máy em office 64, win 64. Em tải trực tiếp từ Links anh chia sẻ chứ không dùng file nối của HJ Split. Không rõ có phải do em thao tác chưa đúng không mà có một vài vấn đề thế này. Mong anh giúp đỡ
1. Sau khi tải file, chạy file hiện luôn cửa sổ VBA loading mdBase64_File. (Như hình em đính kèm) phải ấn Yes để chọn, No sẽ không load được file
Trường hợp đã sửa được các lỗi ở máy em liệu lần sau mở file có tiếp tục phải chọn Yes hay không
2. Ở sub mdBase64_File em thấy hàm Base64_File_ExcelDna_IntelliSense_xll chưa có End function
3. Chưa có Function Base64_File_ExcelDna_IntelliSense64_xll giải quyết dòng If m_IsExcelx64
 

File đính kèm

  • Loading.png
    Loading.png
    14.9 KB · Đọc: 2
2. Ở sub mdBase64_File em thấy hàm Base64_File_ExcelDna_IntelliSense_xll chưa có End function
3. Chưa có Function Base64_File_ExcelDna_IntelliSense64_xll giải quyết dòng If m_IsExcelx64
Bạn phải vô cái link github ở bài #1 để tải cái thư viện .xll về để chung thư mục với file excel này rồi chạy chứ.
 
Có lẽ em hiểu nhầm ý của anh @giaiphap ở câu này "muốn chỉ dùng 1 file duy nhất " là không cần file DLL chứ nếu add thêm DLL thì từ bài viết em đã xử lý thành công rồi anh
Bạn phải vô cái link github ở bài #1 để tải cái thư viện .xll về để chung thư mục với file excel này rồi chạy chứ.
 
Ở máy em office 64, win 64. Em tải trực tiếp từ Links anh chia sẻ chứ không dùng file nối của HJ Split. Không rõ có phải do em thao tác chưa đúng không mà có một vài vấn đề thế này. Mong anh giúp đỡ
1. Sau khi tải file, chạy file hiện luôn cửa sổ VBA loading mdBase64_File. (Như hình em đính kèm) phải ấn Yes để chọn, No sẽ không load được file
Trường hợp đã sửa được các lỗi ở máy em liệu lần sau mở file có tiếp tục phải chọn Yes hay không
2. Ở sub mdBase64_File em thấy hàm Base64_File_ExcelDna_IntelliSense_xll chưa có End function
3. Chưa có Function Base64_File_ExcelDna_IntelliSense64_xll giải quyết dòng If m_IsExcelx64
Câu hỏi 1: Bạn tải lại thử file xem thế nào? Chứ tui tải file ở một máy khác thì module mdBase64_File vẫn đầy đủ không hề bị lỗi. Và bạn kiểm tra tiếp sau khi mở file xong trong thư mục chứa file Goi Y Ham Tu Tao 2.xlsm có file ExcelDna.IntelliSense64.xll (File này sẽ được tạo nếu mở file Excel xong) hay không?
Câu hỏi 2: Bạn kiểm tra lại giúp hàm Base64_File_ExcelDna_IntelliSense_xll có chứa
End function mà (Tôi đã tải về file này từ một máy tính khác và vẫn đầy đủ code).
Câu hỏi 3: Tôi chắc chắn code trong Module mdBase64_File có hàm Function Base64_File_ExcelDna_IntelliSense64_xll. Trong module mdBase64_File này chỉ chứa 2 hàm là Base64_File_ExcelDna_IntelliSense_xllBase64_File_ExcelDna_IntelliSense64_xll. Bạn có thể dùng chức năng tìm kiếm để kiểm tra lại giúp.
Nếu đã kiểm tra lại và thấy có câu hỏi nào chưa đúng, bạn thử tải lại file xem sao.
À có một vẫn đề tui chưa hiểu tại sao tui up file kích thước hơn 2M nà hệ thống lại không cho, trong khi bài đầu tui úp file đến 7M vẫn được bình thường.
 
Ace có cách nào bảo mật mã c# ExcelDna k?
 
Ace có cách nào bảo mật mã c# ExcelDna k?
Tham khảo bài viết số 35 ở đường link sau.
 
Tham khảo bài viết số 35 ở đường link sau.
t đã dùng cách pack đó, nhưng file xll đã được đóng gói vẫn có thể bị unpack về các file .dll, sau đó decompile file .dll thì dễ dàng rồi
t muốn hỏi rằng có cách nào làm rối mã hiệu quả trong file .dll hay k?
 
Web KT

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

Back
Top Bottom