Ứng dụng lập trình VSTO (1 người xem)

Liên hệ QC

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

huudu2404

Thành viên mới
Tham gia
5/6/12
Bài viết
3
Được thích
0
Tôi thấy trên các diễn đàn nói về các ưu việt của VSTO so với VBA nhưng hình như VSTO chưa được ứng dụng nhiều và các tài liệu cũng hiếm. Vậy xin hỏi Giaiphapexel là VSTO có những hạn chế gì khi ứng dụng?

Xin chân thành cảm ơn!
 
Nói 1 cách đơn giản là VBA nội trú trong Office nên tiện dụng. Còn VSTO thì nằm ngoài nên bất tiện (kiểu như dùng VB6 cũng vậy), nhất là lại dùng ngôn ngữ VB.NET. Nhiều khi viết 1 cái ứng dụng con con nhưng đòi hỏi Framework hàng chục MB nên cũng bất tiện. Nhiều cao thủ VBA, VB6 chuyển dần sang Delphi rồi bạn nhé.
 
Lần chỉnh sửa cuối:
Chào bạn hudu2404,

VSTO (Visual Studio Tools for Office) là bộ công cụ lập trình cho những người phát triển sử dụng ngôn ngữ C#, VB.NET mở rộng thêm các tính năng cho bộ Microsoft Office.

Vấn đề như PhanTuHuong có đề cập nó liên quan đến việc tương thích và các phiên bản của VSTO như sau:



Đây cũng là vấn đề tôi quan tâm. Làm sao khắc phục được nhược điểm của VBA nhưng lại tận dụng thế mạnh của các ngôn ngữ .NET hoặc các ngôn ngữ khác?
Theo tôi thì có các giải pháp sau:

1. Sử dụng các công cụ/thành phần miễn phí tương ứng với các ngôn ngữ.
_ Chẳng hạn AutoIt (như có lần tôi đã giới thiệu). Link: http://www.autoitscript.com/site/. Nếu chịu khó "ngâm cứu" thì cũng làm được các công việc như VBA. Ngoài ra AutoIt còn có thể giúp ích trong công việc nhập liệu tự động của bạn. Ví dụ: có thể dùng AutoIt trợ giúp cho công việc chỉnh sửa (đơn giản như chỉnh sửa tên theo mã hàng...) có thể tự động. Chỉ cần 60' = 2 người trong 2 ngày làm việc.
_ Sử dụng Python: Link: http://pythonhosted.org/openpyxl/

2. Sử dụng các công cụ/controls/components trên thị trường:
Để tìm kiếm các bạn có thể vào trang sau: http://www.componentsource.com
Hầu hết tất cả các components cho .NET đều có component để làm việc với Excel.
Giá trung bình khoảng 1,400 USD
_ Spreadsheet của ComponentOne: http://www.componentone.com/SuperProducts/SpreadStudio/
(Tôi đã có đưa lên diễn đàn công cụ trợ giúp tính giá thành dựa trên control này). Cách lập trình phải học lại, nó khác nhiều so với cách lập trình với VBA. Tốc độ load/Save tập tin chậm (đây là vấn đề tại sao tôi bỏ Spreadsheet cho tới bây giờ). Có nhiều chức năng/control hơn trong Excel, giúp cho làm việc với CSDL hoặc hạn chế việc nhập liệu sai của người dùng rất tốt.
(Một chú ý là component này được viết bởi các coder của Việt Nam ở Hà Nội)

_ Spreadsheetgear: http://www.spreadsheetgear.com/products/spreadsheetgear.net.aspx
Cách lập trình sẽ rất gần gũi với những người dùng VBA.

Ví dụ: về lấy một DataSet từ một vùng được đặt tên trong Excel
[GPECODE=csharp]
// Tạo một từ một tập tin Excel
IWorkbook workbook = SpreadsheetGear.Factory.GetWorkbook("myfile.xls");

// Lấy DataSet từ một vùng được đặt tên trong Excel
DataSet dataSet = workbook.GetDataSet("mydefinedname",
SpreadsheetGear.Data.GetDataFlags.FormattedText);
[/GPECODE]

Ví dụ: thêm một worksheet vào workbook hiện tại, đặt lại tên và thêm vào công thức
[GPECODE=csharp]
// Tạo một workbook.
IWorkbook workbook = SpreadsheetGear.Factory.GetWorkbook();

// Tạo một worksheet mới, đặt tên và thêm công thức vào
IWorksheet worksheet = workbook.Worksheets[0];
worksheet.Name = "MyFirstSheet";
worksheet.Cells["A1"].Value = 123.456;

// Thêm một worksheet thứ hai, đặt lại tên và thêm công thức vào
worksheet = workbook.Worksheets.Add();
worksheet.Name = "MySecondSheet";
worksheet.Cells["A1"].Formula = "=MyFirstSheet!A1 * 2";
[/GPECODE]

Tốc độ của SpreadsheetGear khi Load/Save tốt hơn nhiều so với các component khác trên thị trường. Tôi đang sử dụng component này.
Với việc sử dụng component này việc học viết code sẽ được dễ dàng hơn nhiều (nếu đã biết VBA). Bảo mật code thì không lo như khi viết với VBA. Tận dụng được tất cả các component trên nền .NET.

Một điều quan trọng là thế mạnh của bạn là gì. Bạn đừng quan tâm VBA/VSTO/Component. Bạn hãy sử dụng những công cụ nào mà bạn có thể phát triển nhanh các ứng dụng/công cụ để sử dụng vào mục đích công việc của mình. Như vậy sẽ tốt hơn cho công việc hiện tại của mình.

Vài dòng chia sẻ cùng bạn.

Lê Văn Duyệt
 
Lần chỉnh sửa cuối:
Cảm ơn bác Lê Văn Duyệt đã chia sẻ! Thực ra em chưa có thế mạnh gì bởi vì bây giờ em mới bắt đầu nên mọi thứ còn rất mơ hồ.
Em học C#, cơ sở dữ liệu và VSTO thì liệu có tạm đủ dùng ko ạ (viết 1 chương trình dự toán chẳng hạn)
Mong bác Duyệt và các bác có kinh nghiệm chỉ giúp.
 
Cảm ơn bác Lê Văn Duyệt đã chia sẻ! Thực ra em chưa có thế mạnh gì bởi vì bây giờ em mới bắt đầu nên mọi thứ còn rất mơ hồ.
Em học C#, cơ sở dữ liệu và VSTO thì liệu có tạm đủ dùng ko ạ (viết 1 chương trình dự toán chẳng hạn)
Mong bác Duyệt và các bác có kinh nghiệm chỉ giúp.

Theo tôi thì mình phải tự thân mà thử, sau đó mới có kinh nghiệm thực tế.
 
Nói 1 cách đơn giản là VBA nội trú trong Office nên tiện dụng. Còn VSTO thì nằm ngoài nên bất tiện (kiểu như dùng VB6 cũng vậy), nhất là lại dùng ngôn ngữ VB.NET. Nhiều khi viết 1 cái ứng dụng con con nhưng đòi hỏi Framework hàng chục MB nên cũng bất tiện. Nhiều cao thủ VBA, VB6 chuyển dần sang Delphi rồi bạn nhé.
Em đã hiểu một chút!
 
Nói 1 cách đơn giản là VBA nội trú trong Office nên tiện dụng. Còn VSTO thì nằm ngoài nên bất tiện (kiểu như dùng VB6 cũng vậy), nhất là lại dùng ngôn ngữ VB.NET. Nhiều khi viết 1 cái ứng dụng con con nhưng đòi hỏi Framework hàng chục MB nên cũng bất tiện. Nhiều cao thủ VBA, VB6 chuyển dần sang Delphi rồi bạn nhé.


Nếu bạn xây dựng ứng dụng trong Excel 2013 và 2016 thì framework tối thiểu 4.0.
 

File đính kèm

  • VSTO.png
    VSTO.png
    58.3 KB · Đọc: 84
Chào mọi người!
Tôi đang sử dụng VSTO trong VS 2017 để phát triển Excel. Muốn viết hàm tự định nghĩa sử dụng được trong Excel bằng ngôn ngữ VB.NET
Mọi người chỉ giáo chi tiết giúp! Tks!
 
Mình mới học VBA và ứng dụng vào công việc vô cùng tiện lợi, viết vài cái hàm, thủ tục rồi kết nối CSDL là thấy đã rồi.
Giờ thấy VSTO muốn khám phá thêm nhưng chưa thấy ứng dụng thực tế nó làm được gì? và mình có cần đến vậy không?
 
Mình mới học VBA và ứng dụng vào công việc vô cùng tiện lợi, viết vài cái hàm, thủ tục rồi kết nối CSDL là thấy đã rồi.
Giờ thấy VSTO muốn khám phá thêm nhưng chưa thấy ứng dụng thực tế nó làm được gì? và mình có cần đến vậy không?
Mình mới nghiên cứu về VSTO, nhưng tài liệu tiếng việt về nó ít quá. Tạm thời mình cho bạn xem thử 2 video demo mà mình đã nghiên cứ được bạn xem thử thế nào nhé.
Video thứ nhất là viết hàm cho Excel, sau khi biên dịch hàm ra thì mang file xll (Giống như hàm VND của Nguyễn Duy Tuân vậy) đi máy khác là sử dụng như một Add-Ins mà khỏi sợ gười khác xem mã nguồn.
Video thứ hai là tạo thanh Ribbon tương tác rất chuyên nghiệp.
Bạn muốn nghiên cứu về nó có thể tham khảo trang này, tôi cũng đang xem và nghiên cứu về VSTO. Trước kia tôi cũng không thích cái vụ .Net này đâu, nhưng thấy xu hướng hiện nay hầu như là rất cần nên việc cài nó là sớm hay muôn thôi. Hy vong trong diễn đàn sẽ có nhiều thành viên nghiên cứu về nó và chia sẻ để mình học hỏi thêm.
 
Mình mới nghiên cứu về VSTO, nhưng tài liệu tiếng việt về nó ít quá. Tạm thời mình cho bạn xem thử 2 video demo mà mình đã nghiên cứ được bạn xem thử thế nào nhé.
Video thứ nhất là viết hàm cho Excel, sau khi biên dịch hàm ra thì mang file xll (Giống như hàm VND của Nguyễn Duy Tuân vậy) đi máy khác là sử dụng như một Add-Ins mà khỏi sợ gười khác xem mã nguồn.
Video thứ hai là tạo thanh Ribbon tương tác rất chuyên nghiệp.
Bạn muốn nghiên cứu về nó có thể tham khảo trang này, tôi cũng đang xem và nghiên cứu về VSTO. Trước kia tôi cũng không thích cái vụ .Net này đâu, nhưng thấy xu hướng hiện nay hầu như là rất cần nên việc cài nó là sớm hay muôn thôi. Hy vong trong diễn đàn sẽ có nhiều thành viên nghiên cứu về nó và chia sẻ để mình học hỏi thêm.

Cho mình xin link tham khảo. cảm ơn bạn !
 
Cho mình xin link tham khảo. cảm ơn bạn !
Mình mới nghiên cứu thôi, nên code cũng chẳng có gì để học hỏi đâu. Định khi nghiên cứu xong sẽ có những bài viết cụ thể về vấn đề này để chia sẻ cho ai có nhu cầu. Thôi thì chia sẻ đại để bạn xem và có hy vọng cùng nhau nghiên cứu.
 

File đính kèm

Mình mới nghiên cứu thôi, nên code cũng chẳng có gì để học hỏi đâu. Định khi nghiên cứu xong sẽ có những bài viết cụ thể về vấn đề này để chia sẻ cho ai có nhu cầu. Thôi thì chia sẻ đại để bạn xem và có hy vọng cùng nhau nghiên cứu.
Em tải về chưa biết cách dùng Anh ơi!, Mong Anh chỉ bảo thêm.
 
Em tải về chưa biết cách dùng Anh ơi!, Mong Anh chỉ bảo thêm.
Cái này muốn dùng được ít nhất phải là Visual Studio 2013 trở lên, cái nửa là trong 2 cái file ở #13 phải cài thêm công cụ Visual Studio Tools For Office (Công cụ này sẽ không tự động có khi cài Visual Studio) thứ hai nửa là phải cài ExcelDnaDoc - Excel-DNA (http://mndrake.github.io/ExcelDnaDoc/index.html) mởi chuyển project sang xll được.
Chạy file theo hình trong mục Debug xong chọn cài đặt mà thử Add-InsView attachment 204334 cài
@kieu manh sẽ không thể chạy được các file trong thư mục Debug theo cách thông thường được đâu (Do chưa đăng ký thư viện Com Add-Ins). Cái này chỉ mở Source project để chạy thôi, còn muốn chia sẻ cho người dùng thì phải tạo file setup (những việc đăng ký và cài đặt do setup làm) và cài đặt vào máy thế là dùng thôi.
Trong thời gian nghiên cứu mình thấy rõ ràng là khi viết hàm và xuất ra dạng xll thì tốc độ chạy tuyệt làm sao, thấy anh @Nguyễn Duy Tuân viết hàm VND đọc nhanh quá nên thử viết hàm này trên C# và xuất ra Xll và so sánh với cái Add-Ins viết trên Excel (Hai hàm này giải thuật như nhau) thì thôi nó bỏ xa quá về tốc độ, nếu chỉ có vài công thức thôi thì chưa thấy rõ, thử test 20 000 dòng thì thấy nó mới đã.
Hy vọng có thành viên nào nghiên cứu và mình cùng nhau chia sẽ, lúc đó mình cũng sẽ hướng dẫn chi tiết luôn về việc tạo Ribbon và Com Add-Ins trong Excel.
 
Cái này muốn dùng được ít nhất phải là Visual Studio 2013 trở lên, cái nửa là trong 2 cái file ở #13 phải cài thêm công cụ Visual Studio Tools For Office (Công cụ này sẽ không tự động có khi cài Visual Studio) thứ hai nửa là phải cài ExcelDnaDoc - Excel-DNA (http://mndrake.github.io/ExcelDnaDoc/index.html) mởi chuyển project sang xll được.

@kieu manh sẽ không thể chạy được các file trong thư mục Debug theo cách thông thường được đâu (Do chưa đăng ký thư viện Com Add-Ins). Cái này chỉ mở Source project để chạy thôi, còn muốn chia sẻ cho người dùng thì phải tạo file setup (những việc đăng ký và cài đặt do setup làm) và cài đặt vào máy thế là dùng thôi.
Trong thời gian nghiên cứu mình thấy rõ ràng là khi viết hàm và xuất ra dạng xll thì tốc độ chạy tuyệt làm sao, thấy anh @Nguyễn Duy Tuân viết hàm VND đọc nhanh quá nên thử viết hàm này trên C# và xuất ra Xll và so sánh với cái Add-Ins viết trên Excel (Hai hàm này giải thuật như nhau) thì thôi nó bỏ xa quá về tốc độ, nếu chỉ có vài công thức thôi thì chưa thấy rõ, thử test 20 000 dòng thì thấy nó mới đã.
Hy vọng có thành viên nào nghiên cứu và mình cùng nhau chia sẽ, lúc đó mình cũng sẽ hướng dẫn chi tiết luôn về việc tạo Ribbon và Com Add-Ins trong Excel.
Chạy File đó xài ok mà ... 2 năm trước Mạnh cũng từng Viết Add-Ins *.xll rồi thấy chạy tốt Nhưng trong VBA mình muốn xài hàm của nó phải khai báo Application.Run ... thấy mất công quá ghét bỏ luôn
thấy người ta khai báo vầy để xài ExcelDna
Mã:
Imports ExcelDna.Integration
Imports ExcelDna.Integration.XlCall
Hay thêm dòng sau khi làm việc với Visual
Mã:
Install-Package ExcelDnaDoc
Mai mốt rảnh coi lại code & tài liệu úp cho ... thấy họ viết = VB chạy tốt đó còn ai thích xài C# thì xài trong đó có cả mà

Capture.PNG
 
Chạy File đó xài ok mà ... 2 năm trước Mạnh cũng từng Viết Add-Ins *.xll rồi thấy chạy tốt Nhưng trong VBA mình muốn xài hàm của nó phải khai báo Application.Run ... thấy mất công quá ghét bỏ luôn
thấy người ta khai báo vầy để xài ExcelDna
Mã:
Imports ExcelDna.Integration
Imports ExcelDna.Integration.XlCall
Hay thêm dòng sau khi làm việc với Visual
Mã:
Install-Package ExcelDnaDoc
Mai mốt rảnh coi lại code & tài liệu úp cho ... thấy họ viết = VB chạy tốt đó còn ai thích xài C# thì xài trong đó có cả mà

View attachment 204339
Cái đó là viết hàm để dùng trong sheet, còn nếu đã code c# rồi thì không cần viết code trong vba nửa. Xử lý công việc của excel bằng c# luôn, tôi nghĩ viết add-ins cho excel bằng c# rồi mà còn dùng lại vba nửa thì viết bằng vba luôn cho rồi. Nửa nạc nửa mở khó chịu lắm.
Mà hình như C# vẫn tạo được thư viện DLL để dùng cho excel được mà (vấn đề này tôi chưa nghiên cứu).
 
Lần chỉnh sửa cuối:
Cái đó là viết hàm để dùng trong sheet, còn nếu đã code c# rồi thì không cần viết code trong vba nửa. Xử lý công việc của excel bằng c# luôn, tôi nghĩ viết add-ins cho excel bằng c# rồi mà còn dùng lại vba nửa thì viết bằng vba luôn cho rồi. Nửa nạc nửa mở khó chịu lắm.
Mà hình như C# vẫn tạo được thư viện DLL để dùng cho excel được mà (vấn đề này tôi chưa nghiên cứu).
Quan điểm cá NHÂN Mạnh nghĩ vầy nè:

1/ Nếu ta viết Add-ins thì viết các hàm phổ thông nhất vào File *.xll ... VD như: DocSo … vvv thì khi ta xài trên Sheet chỉ việc gõ vào Cells = DocSo() là xài ok ...
Còn nếu ta viết một cái phần mềm chạy nền Excel thì thấy rất bất tiện khi xài lại các Hàm đã viết trong đó

2/ Khi viết Add-ins như VnTools đó thì cũng vậy chỉ xài những code chung nhất như loại dấu tiếng việt … ngày tháng vvv nhưng có điều nó sẻ áp dụng cho toàn bộ file Excel kể cả file mới tinh mở lên vì nó tích hợp luôn vào Office Excel

Vậy nếu Mạnh viết thêm một cái phần mềm nhúng trong Excel thì cũng ko thể tận dụng lại các hàm đã viết trong đó (chưa thử phán bạy vậy he )
nếu xài được các hàm đó đi nữa thì khai báo nó cũng rất dài dòng … và nó thêm 1 Tab Menu trên đó vô tình bấm tầm bạy cái nó xóa hay làm sai dữ liệu trên cells vv ...

3/ Ý Mạnh là cho dù xài tools gì viết đi nữa khi ta vẫn lấy Excel chạy nền thì nên viết 1 cái thư viện Hàm *.dll chuẩn API thì khi đó ta viết Add -Ins hay cái chi đó thì ta có thể xài lại các hàm chuẩn đó trong thư viện không phải mất công viết thêm nữa mà chỉ làm thủ tục gọi hàm là ok nhất

4/ Mạnh thì rất mê Delphi …. Vì chỉ viết 1 code duy nhất ta có thể Build chạy cho đa nền tảng 32bit, 64 bit, IOS, mac ….
và Manh vẫn còn mê Excel và viết úng dụng chạy trên nó thì xài lại các hàm đã viết trong đó là 1 điều tuyệt vời nhất kể cả viết Add -ins cũng vẫn xài lại ok … tốc độ truy xuất rất nhanh

5/ @giaiphap thử viết thật nhiều code vào file *.xll và Vntools xem xong mở 1 file Excel mới lên xem nó load quay tròn quay tròn mãi mới lên à
còn load code file *.dll khi mở 1 ứng dụng Excel lên nó bay cái vèo …. còn mở file mới lên xem lại càng bay vèo vèo … vì nó không phải C.ò.n.g lưng C.ỏ.n.g 2 cái ứng dụng kia nữa

1 vài ý theo cá nhân Mạnh là vậy đó hên thì phán trúng … trật cho qua he -0-0-0-===\.
 
Lần chỉnh sửa cuối:
Quan điểm cá NHÂN Mạnh nghĩ vầy nè:

1/ Nếu ta viết Add-ins thì viết các hàm phổ thông nhất vào File *.xll ... VD như: DocSo … vvv thì khi ta xài trên Sheet chỉ việc gõ vào Cells = DocSo() là xài ok ...
Còn nếu ta viết một cái phần mềm chạy nền Excel thì thấy rất bất tiện khi xài lại các Hàm đã viết trong đó

2/ Khi viết Add-ins như VnTools đó thì cũng vậy chỉ xài những code chung nhất như loại dấu tiếng việt … ngày tháng vvv nhưng có điều nó sẻ áp dụng cho toàn bộ file Excel kể cả file mới tinh mở lên vì nó tích hợp luôn vào Office Excel

Vậy nếu Mạnh viết thêm một cái phần mềm nhúng trong Excel thì cũng ko thể tận dụng lại các hàm đã viết trong đó (chưa thử phán bạy vậy he )
nếu xài được các hàm đó đi nữa thì khai báo nó cũng rất dài dòng … và nó thêm 1 Tab Menu trên đó vô tình bấm tầm bạy cái nó xóa hay làm sai dữ liệu trên cells vv ...

3/ Ý Mạnh là cho dù xài tools gì viết đi nữa khi ta vẫn lấy Excel chạy nền thì nên viết 1 cái thư viện Hàm *.dll chuẩn API thì khi đó ta viết Add -Ins hay cái chi đó thì ta có thể xài lại các hàm chuẩn đó trong thư viện không phải mất công viết thêm nữa mà chỉ làm thủ tục gọi hàm là ok nhất

4/ Mạnh thì rất mê Delphi …. Vì chỉ viết 1 code duy nhất ta có thể Build chạy cho đa nền tảng 32bit, 64 bit, IOS, mac ….
và Manh vẫn còn mê Excel và viết úng dụng chạy trên nó thì xài lại các hàm đã viết trong đó là 1 điều tuyệt vời nhất kể cả viết Add -ins cũng vẫn xài lại ok … tốc độ truy xuất rất nhanh

5/ @giaiphap thử viết thật nhiều code vào file *.xll và Vntools xem xong mở 1 file Excel mới lên xem nó load quay tròn quay tròn mãi mới lên à
còn load code file *.dll khi mở 1 ứng dụng Excel lên nó bay cái vèo …. còn mở file mới lên xem lại càng bay vèo vèo … vì nó không phải C.ò.n.g lưng C.ỏ.n.g 2 cái ứng dụng kia nữa

1 vài ý theo cá nhân Mạnh là vậy đó hên thì phán trúng … trật cho qua he -0-0-0-===\.
Tôi cũng chỉ mới nghiên cứu về VSTO thôi nên cũng chưa đủ trình độ phán xét hay so sánh giữa c# và delphi chỉ thấy rằng tìm kiếm thông tin về c# thì có rất nhiều kết quả là tiếng việt, trong khi delphi thì toàn tiếng anh (nên nghĩ rằng chắc người việt ít dùng đến). Nên tìm hiểu về c# sê nhanh hơn delphi, còn việc test code thì cũng chỉ viết số lượng ít nên chưa thử như bạn nói, nhưng rõ ràng như bạn nói là file xll có dung lượng nhiều thật mặc dù chỉ vài dòng code.
 
Đêm qua tính ngâm cứu cái vụ này theo 2 hướng là netOffice và ExcelDna mà mãi chả hiểu o_O. Thử demo của NetOffice chạy rất hay nhưng mà chả thấy nó nhắc đến cái Addin nào(? ) thế là chuyển hướng qua ExcelDna nhưng mà cũng bó tay với mấy demo down về.

Cái sui của mình là mình không dùng bộ Visual Studio (VS) như nhiều người vì nó quá nặng kể cả bản Express(bản free). Mình thì lại xài con IDE Sharpdevelop cùi (bộ cài đặt size chưa bằng 1/10 VS) đâm ra không có bất kỳ hướng dẫn thực hiện nào trên internet vì toàn hướng dẫn cho VS.

May sao đúng chiều nay thu được kết quả nhờ tìm ra cái tài liệu trong thư mục ExcelDna\Distribution của nó (Excel-DNA - Step-by-step C# add-in.doc) và tập trung vô được liên tục:victory:. Theo hướng dẫn của tài liệu và tự chính bản thân trải nghiệm mình rút ra vài điểm cơ bản:
  • Trong một một class project "tengido" cần tối thiểu các file (phải tự thêm thủ công nhé):
    1. Class-gido.cs chứa code của class cùng các hàm mà bạn sẽ viết cho Excel.
    2. tengido.dna (bật chọn copy ra thư mục output)
    3. tengido.xll được copy từ file mẫu ExcelDna.xll trong thư mục "ExcelDna\Distribution" đổi tên lại. (bật chọn copy ra thư mục output)
    4. ExcelDna.Integration.dll (thư viện Dna) và ExcelDnaPack.exe đặt trong thư mục Debug nếu như bạn cần Packed (nếu không packed thì khỏi).
  • Bạn cũng buộc phải references thủ công ExcelDna.Integration.dll cho dù có copy nó vô thư mục project roài.
  • File đuôi dna khá đặc biệt vì ngoài thông tin về thư viện, chúng ta còn có thể nhúng module viết bằng VBA và nếu bổ sung thêm code VBA cứ kích hoạt file tengido.xll thì module này được nạp mà không cần biên dịch lại .:victory:
  • ExcelDna có công cụ đóng gói ExcelDnaPack.exe sinh ra file tengido-packed.xll được quảng cáo là "Both FirstAddIn.dna and MyLibrary.dll are packed inside the .xll as resources, and will be loaded at runtime." nhưng thực tế thì ứ phải (tối thiểu phải có tengido.dll cùng với tengido.xll).
  • Được cái file tengido-packed.xll nhỏ hơn chục kg so với file mẫu ExcelDna.xll nhưng nó lại không có khả năng tự cập nhật module VBA từ file dna như bản copy từ ExcelDna.xll gốc.
Trong tài liệu đi kèm ExcelDna còn giới thiệu một số cái hay mà tiếc trình Inh ních mình không thể hiểu sao cho đúng :unknw::

Hiện mình chỉ mới viết được hàm cho Excel bằng C# còn ribon hay gì đó mình chưa biết nên chắc không góp thêm gì vui. Hy vọng vài kinh nghiệm này sẽ cho các bạn thêm thông tin khi viết dll bằng C# cho Excel.
 
Lần chỉnh sửa cuối:
Ai có hứng Tự Tạo Addin Xll cho Excel với Visual Studio và VBNet ... thì xem video sau he
Hướng dẫn xài ExcelDna đó he .... nó chỉ ngắn gọn có mấy từ sau à ... coi video tinh mắt dòm khi họ paste dòng sau he
Mã:
Install-Package Excel-DNA
 
Còn đây là cách viết cho C#.
1. Tạo mới dữ án C# như hình dưới.
H1.png
2. Nhấp chuột phải vào Class1.cs sau đó chọn Rename, gõ tên mới và nhấn Enter, nháy Yes (đổi tên Class thành FuncVBA, hoặc tên tùy ý theo ý mình, Xem hình).
H2.png
3. Cài thư viện cho C# (Nếu máy đã cài rồi thì có thể bỏ qua bước này và bước 4, nếu chưa có thì tải file này ở đây) bằng cách mở Explorer lên và chọn file exceldnadoc.0.2.3.nupkg (file mới tải về) nhấp chuột phải và chọn lệnh Copy.
Trở lại dữ án C# và vào Menu Tools --> Library Package Manager --> Package Manager Settings.
H3.png
4. Sau đó thực hiện các bước như hình.
H4.png
5. Cập nhật thư hiện bằng cách vào menu Tools --> Library Package Manager --> Package Manager Console
H5.png
6. Trên cửa sổ dòng lệnh sau PM> gõ dòng lệnh Install-Package ExcelDnaDoc -Version 0.2.3 và nhấn Enter
H6.png
7. Cũng trên dòng lệnh đó gõ tiếp lệnh Install-Package ExcelDna.AddIn và nhấn Enter.
H7.png
8. Cũng trên dòng lệnh đó gõ tiếp lệnh Install-Package ExcelDna.Registration và nhấn Enter.
H8.png
9. Nháy chuột vào Class.cs (Cụ thể là FuncVBA đã đặt tên ở bước 2) và sửa lại code trong Class này như sau:
PHP:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HamVBA
{
    using ExcelDna.Integration;
    public class FuncVBA
    {
        [ExcelFunction(Name = "VnSum",
                        Description = "Hàm tính tổng của 2 số thực",
                        HelpTopic = "DocTest-AddIn.chm!1002")]//Tên File Help nếu có
        public static double VnSum(
            [ExcelArgument(Description = "Giá trị thứ nhất là số thực\nCó thể chọn địa chỉ của ô tính")] double SoA,
            [ExcelArgument(Description = "Giá trị thứ hai cũng là số thực\nCó thể chọn địa chỉ của ô tính")] double SoB)
        {
            return SoA + SoB;
        }
    }
}
10. Nhấn F5 để chạy.
11. Vào Excel chọn một ô và nháy nút Fx và thực hiện các bước như hình.

H9.png
12. Gõ các tham số cho hàm và nháy Ok.
H10.png
13. Đóng Excel lại, Mở Menu Project --> HamVBA Properties.
H11.png
14. Nháy vào thẻ Debug và xem file xll đã được tạo ra.

15. Mở Explorer và tìm thư mục chứa Project và chọn thư mục HamVBA --> Bin --> Debug có chứa các tệp tin được tạo ra trong có có têp *.xll.
uc

16. Copy tệp tin xll (Ở đâu là Tệp HamVBA-AddIn.xll) này đến máy tính bất kỳ và sử dụng thôi.
17. Mở Excel và vào File  Options và thực hiện như hình để chèn file xll vào file Excel là dùng.
uc
 
Có vẻ thấy nó dài dòng hơn cái video bài 23 @giaiphap nhỉ
Nhưng thấy C# có vẻ cao cấp hơn VB
Quen Code VB thấy Code C# cũng rắc rối quá
Mã:
private void button2_Click(object sender, EventArgs e)
        {
            try
            {
            Excel.Range ActiveCell = Globals.ThisAddIn.Application.Selection as Excel.Range;
            string KyTu = char.ConvertFromUtf32(34);

            if (ActiveCell != null)
            {
                ActiveCell.NumberFormat = KyTu + "Tân Bình, ngày " + KyTu + "  dd  " + KyTu + " tháng " + KyTu + " MM " + KyTu + " năm " + KyTu + " yyyy";
                foreach (Excel.Range sCell in ActiveCell)
                {
                    sCell.Value2 = DateTime.Now.ToUniversalTime().AddHours(7);
                    //sCell.Value2 =String.Format("{0:dd/MM/yyyy}", DateTime.Now.ToUniversalTime().AddHours(7));
                }
            }
            this.Close();
            }
            catch
            {
                System.Windows.Forms.MessageBox.Show("Đã có lỗi xảy ra");
            }

Mã:
namespace VnToolsAddIns
{
    public partial class MyRibbon
    {
        private void MyRibbon_Load(object sender, RibbonUIEventArgs e)
        {

        }
        public static string RemoveUnicode(string text)
        {
            string[] arr1 = new string[] { "á", "à", "ả", "ã", "ạ", "â", "ấ", "ầ", "ẩ", "ẫ", "ậ", "ă", "ắ", "ằ", "ẳ", "ẵ", "ặ", 
    "đ", 
    "é","è","ẻ","ẽ","ẹ","ê","ế","ề","ể","ễ","ệ", 
    "í","ì","ỉ","ĩ","ị", 
    "ó","ò","ỏ","õ","ọ","ô","ố","ồ","ổ","ỗ","ộ","ơ","ớ","ờ","ở","ỡ","ợ", 
    "ú","ù","ủ","ũ","ụ","ư","ứ","ừ","ử","ữ","ự", 
    "ý","ỳ","ỷ","ỹ","ỵ",};
            string[] arr2 = new string[] { "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", 
    "d", 
    "e","e","e","e","e","e","e","e","e","e","e", 
    "i","i","i","i","i", 
    "o","o","o","o","o","o","o","o","o","o","o","o","o","o","o","o","o", 
    "u","u","u","u","u","u","u","u","u","u","u", 
    "y","y","y","y","y",};
            for (int i = 0; i < arr1.Length; i++)
            {
                text = text.Replace(arr1[i], arr2[i]);
                text = text.Replace(arr1[i].ToUpper(), arr2[i].ToUpper());
            }
            return text;
        }
        private void bnt_Click(object sender, RibbonControlEventArgs e)
        {
            try
            {
                Excel.Worksheet ActiveWorksheet = Globals.ThisAddIn.Application.ActiveSheet;
                Excel.Range ActiveCell = Globals.ThisAddIn.Application.Selection; //Globals.ThisAddIn.Application.ActiveCell;


                if (ActiveCell != null)
                {
                    //string aValue = ActiveCell.Value2;
                    //string sText = ActiveCell.Text;

                    //ActiveCell.Text = sText.ToUpper();
                    //System.Windows.Forms.MessageBox.Show(sText.ToUpper() + " - " + ActiveCell.Cells.Count);
                    //ActiveCell.Offset[0,1].Value2=sText.ToUpper();
                    foreach (Excel.Range sCell in ActiveCell.SpecialCells(Excel.XlCellType.xlCellTypeConstants))
                    {
                        if (sCell.Text != "")

                            sCell.Value2 = sCell.Text.ToUpper();
                    }
                }
            }
            catch
            {
                System.Windows.Forms.MessageBox.Show("Đã có lỗi xảy ra");
            }
        }
 
Lần chỉnh sửa cuối:
Quen Code VB thấy Code C# cũng rắc rối quá
Học C# mà đi làm mấy cái AddIns cho Excel thì phí quá
Nói chung nếu các bạn có nhu cầu làm việc online trên internet, dữ liệu trao đổi nhiều người cùng lúc... hoặc làm việc trên mobile... vân... vân... thì hãy nghĩ đến C#. Nó đa năng chứ hổng phải có thế thôi đâu
Mạnh học C# để tự làm riêng cho mình một trang web bán hàng là hợp lý đó
 
Học C# mà đi làm mấy cái AddIns cho Excel thì phí quá
Nói chung nếu các bạn có nhu cầu làm việc online trên internet, dữ liệu trao đổi nhiều người cùng lúc... hoặc làm việc trên mobile... vân... vân... thì hãy nghĩ đến C#. Nó đa năng chứ hổng phải có thế thôi đâu
Mạnh học C# để tự làm riêng cho mình một trang web bán hàng là hợp lý đó
Rất muôn màu muôn vẻ, ăn thua ý tưởng của mình là gì thôi. Ví dụ hồi xưa em suy nghĩ Excel thì làm sao có thể gửi tính hiệu qua cổng COM để điều khiển thiết bị. Tuy nhiên giờ thì chuyện này không quá khó bởi lẽ VB.Net nó sẽ bổ sung cho Excel những cái mà mình cần. Anh @Nguyễn Duy Tuân đã từng giới thiệu Delphi có thể điều khiển thiết bị thì VB.Net cũng có thể làm được.
 
Mình thấy tất cả ngôn ngữ lập trình hiện đại (Bộ ngôn ngữ Visual Studio .NET, bộ ngôn ngữ RAD Studio = Delphi + C++ Builder ) đều làm tốt tất cả mọi việc can thiệp vào tài nguyên máy tính, thiết bị phần cứng. Kể cả VBA có thể làm được chỉ là hơi đuối do code nằm sống bên trong Excel - nó là ứng dụng nhúng trong một Application, giới hạn về bộ nhớ do Excel chỉ định phạm vi sử dụng và cả vấn đề multi thread.

Nói về ngôn ngữ VB.NET hay C#.NET thì thực ra mức độ can thiệp là như nhau hoàn toàn. Hai trong số bộ ngôn ngữ .NET này đều khai thác chung bộ thư viện khổng lồ là Framework.NET. Khi chúng ta đã thuần thục những ngôn ngữ lập trình hiện đại này thì định hướng các bạn sẽ muốn làm phần mềm độc lập chứ không phải chỉ làm ứng dụng nhúng (add-in), trừ phi có cái gì đó thật thú vị hoặc buộc phải làm. Khi làm ứng dụng độc lập trình với CSDL chính lại không còn là Excel mà chủ yếu như SQL Server, MySQL,... Với các phần mềm liên quan đến CSDL mà tôi vừa liệt kê thì tốc độ bây giờ không phải là ngôn ngữ lập trình (xét trong phạm cùng họ .NET) làm ảnh hưởng, mà lại là cách viết câu lệnh SQL tối ưu với loại CSDL. Các phần mềm quan trị mình viết thì có lẽ 3/4 code là kiến thức của SQL.
Vậy nên tôi nghĩ các bạn chọn .NET thì coi như VB.NET hay C# là như nhau mặc dù đâu đó vẫn có nhóm đem đi so sánh tốc độ. Nhưng việc so sánh đều phải có phạm vi so sánh thì mới đúng, và trong phạm vi phần mềm quản trị có dùng CSDL/SQL thì không phải lo lắng đâu.
 
...
Nhưng thấy C# có vẻ cao cấp hơn VB
Quen Code VB thấy Code C# cũng rắc rối quá
...
Ngược lại. Tôi quen với C, qua C# dễ dàng nhưng gặp VB bị gò bó hơi nhiều.
Chuyện "cao cấp" thì còn tùy theo quan điểm.
Nói chung, bạn muốn đi vào nơi này thì tốt hơn hết nên học cho kỹ lý thuyết về Hướng Đối Tượng. Nếu không hiểu tận HĐT thì code của bạn chỉ là cưỡi ngựa xem hoa.

...
Vậy nên tôi nghĩ các bạn chọn .NET thì coi như VB.NET hay C# là như nhau mặc dù đâu đó vẫn có nhóm đem đi so sánh tốc độ. Nhưng việc so sánh đều phải có phạm vi so sánh thì mới đúng, và trong phạm vi phần mềm quản trị có dùng CSDL/SQL thì không phải lo lắng đâu.
C# được ra để chọi với Java (*). Microsoft viết nó từ con số không. VB (dot net) là tiếp nối truyền thống. Microsoft bắt buộc phải đi từ VB6
Vì vậy C# đi sát với hướng đối tượng trong khi VB phải bẻ cong uốn nắn để thực hiện hướng đối tượng. (VBA thì khỏi nói luôn vì nó không phải HĐT)
Khái niệm lambda là tự nhiên đối với C#, nhưng với VB thì nó khá gượng ép.

(*) Nếu bạn đọc tài liệu về C# sẽ thấy chính Microsoft nói rằng C# gần với Java hơn cả C++

...
Mạnh học C# để tự làm riêng cho mình một trang web bán hàng là hợp lý đó
C# có hai đường lối. Winform và Webform. Nếu muốn làm Webform thì thà đi luôn qua MVC (Model View Controller) quách cho nó xịn.
 
Nhờ các bạn xem giúp, minh thử viết lại code trong C# để tao file dll, nhưng khi chạy bao lỗi. K biết khi lập trình vớI C# cần thêm thư viện gì nữa k ( mình sử dụng excel 2016)
 

File đính kèm

File đính kèm

To @giaiphap hôm rồi Mạnh có coi cái Video trên Facebook của GPE ... thấy người ta keo coi code C# dễ như ăn kẹo đó he
Mạnh thấy người ta nói sao nói vậy chứ Mạnh ko biết chi mô đó he ... có chi vui vẻ chứ Mạnh ko phán bạy
cái câu "dễ như ăn kẹo" là Mạnh cảm giác đó he còn người ta ko nói vậy ?!
Facebook
https://www.facebook.com/groups/GPEVN/permalink/1874640442591865/
Video
 
Lần chỉnh sửa cuối:
Hầu hết mọi phần mềm đều có thể dịch ngược ra mã gốc với ngôn ngữ lập trình ra nó kể cả Delphi (mới tình cờ thấy Delphi là chuột bạch trên Youtube độ mấy tuần trước) chứ chả riêng gì C#. Bởi vậy mới lại phát sinh ra công nghệ chống dịch ngược. Công nghệ này mà áp dụng với .Net thì dịch tới dịch lui thì đếch ra cái gì với công nghệ có tính phí. Họ có can thiệp vô cái assembly gì đó (theo 1 anh kinh nghiệm) mà ko thể nào bung ra cấu trúc chương trình.

Với bản free thì cấu trúc rồ déc phơi bày ra nhưng cũng phải đọc lòi con mắt với ô vuông hay chữ tàu. Đơn giản, chỉ cần dùng phần mềm rối hóa mở file biên dịch rồi bấm nút là nó ra 1 file đánh đố mấy ông táy máy. :whistling:

Cái này chính tự bản thân tôi trải nghiệm lâu rồi nên mới dám nói.
 
Lần chỉnh sửa cuối:
To @giaiphap hôm rồi Mạnh có coi cái Video trên Facebook của GPE ... thấy người ta keo coi code C# dễ như ăn kẹo đó he
Mạnh thấy người ta nói sao nói vậy chứ Mạnh ko biết chi mô đó he ... có chi vui vẻ chứ Mạnh ko phán bạy
cái câu "dễ như ăn kẹo" là Mạnh cảm giác đó he còn người ta ko nói vậy ?!
Facebook
https://www.facebook.com/groups/GPEVN/permalink/1874640442591865/
Video
View attachment 205899
Cảm ơn bạn, thật ra cũng chẳng cần quan tâm gì đến việc người khác xem code đâu (Code chủ yếu là học hỏi từ những thành viên khác thôi, có khi nó chẳng ra gì đối với người khác). Mình chỉ muốn có một mục tiêu nhất định để học C# thôi, chứ tự nhiên học mà không có mục đích cũng chán phéo, nó là một động lực để mình học hỏi thôi. Mà mấy hôm nay không có thời gian rảnh nên cả tuần nay chẳng làm được gì cả, sẳn tiện @kieu manh test xem cái file setup này có chạy được trên máy của bạn có chạy hay không? File Add-Ins này chưa hoàn chỉnh chỉ có một số cái thôi mạnh test thử dùm xem nó có chạy được không nhé
Thấy cái Delphi bạn nghiên cứu dữ quá, mong bạn sớm đạt được mục đích.
https://drive.google.com/file/d/1kl9S3SY2PcGI0nLmPyaGsDSIWCo1gMXb/view?usp=sharing
 
Cảm ơn bạn, thật ra cũng chẳng cần quan tâm gì đến việc người khác xem code đâu (Code chủ yếu là học hỏi từ những thành viên khác thôi, có khi nó chẳng ra gì đối với người khác). Mình chỉ muốn có một mục tiêu nhất định để học C# thôi, chứ tự nhiên học mà không có mục đích cũng chán phéo, nó là một động lực để mình học hỏi thôi. Mà mấy hôm nay không có thời gian rảnh nên cả tuần nay chẳng làm được gì cả, sẳn tiện @kieu manh test xem cái file setup này có chạy được trên máy của bạn có chạy hay không? File Add-Ins này chưa hoàn chỉnh chỉ có một số cái thôi mạnh test thử dùm xem nó có chạy được không nhé
Thấy cái Delphi bạn nghiên cứu dữ quá, mong bạn sớm đạt được mục đích.
https://drive.google.com/file/d/1kl9S3SY2PcGI0nLmPyaGsDSIWCo1gMXb/view?usp=sharing
Mới thử cho bạn xong mạnh Úp mấy hình đó nha
Load Add-Ins.PNGIntals.PNGOK.PNG

Mạnh có mấy ý vầy:
1/ Bạn hay Test File *.exe hay phần mềm khác thì nên cài một cái máy Ảo ... cài xong Copy cái máy ảo đó lưu ra một nơi khác khoãng 3G To 4G gì đó
Mục đích là khi mình quậy cái máy ảo đó nó lỗi linh tinh hết thì xóa cái Folder máy ảo đó đi xong copy cái đã lưu trước Paste và chính nơi cũ
vậy là lại có cái máy ảo mới tinh như cái thở ban đầu mà xài

2/ Thực chất mấy file đó chỉ cần copy là xài ok như bài trước Mạnh thử có nói đó ... Hay ta làm bằng WinRaR.exe nó giải nén vào Folder cài đặt xong nó tự chạy chạy cái File VB đó là ok

3/ Mạnh nói thật là rất dị ứng phải cài bất cứ cái gì là File *.exe vào máy ... có điều Bạn nhờ thì Mạnh Test dùm cho vậy ... hahahaha

4/ khi mở lên 1 file trắng tinh nó load rất lâu ?!

5/ Chốt lại như vậy là rất OK đó ... cứ thế mà phát triển code thêm nhé
 
Mới thử cho bạn xong mạnh Úp mấy hình đó nha
View attachment 205935View attachment 205936View attachment 205937

Mạnh có mấy ý vầy:
1/ Bạn hay Test File *.exe hay phần mềm khác thì nên cài một cái máy Ảo ... cài xong Copy cái máy ảo đó lưu ra một nơi khác khoãng 3G To 4G gì đó
Mục đích là khi mình quậy cái máy ảo đó nó lỗi linh tinh hết thì xóa cái Folder máy ảo đó đi xong copy cái đã lưu trước Paste và chính nơi cũ
vậy là lại có cái máy ảo mới tinh như cái thở ban đầu mà xài

2/ Thực chất mấy file đó chỉ cần copy là xài ok như bài trước Mạnh thử có nói đó ... Hay ta làm bằng WinRaR.exe nó giải nén vào Folder cài đặt xong nó tự chạy chạy cái File VB đó là ok

3/ Mạnh nói thật là rất dị ứng phải cài bất cứ cái gì là File *.exe vào máy ... có điều Bạn nhờ thì Mạnh Test dùm cho vậy ... hahahaha

4/ khi mở lên 1 file trắng tinh nó load rất lâu ?!

5/ Chốt lại như vậy là rất OK đó ... cứ thế mà phát triển code thêm nhé
Cảm ơn bạn đã chia sẻ.
1. Để mình dùng thử máy ảo, bạn có thể giới thiệu cho mình phần mềm nào tạo máy ảo chạy ổn hiện nay không, mình dùng virtualbox thấy nó hay bị lỗi quá. Trước giờ vọc khoảng 1, 2 tháng gì là cài lại máy mất công quá.
2. Cái này chỉ nghe bạn nói chứ chưa thấy, sao mình copy sang máy khác mở file Excel_Add-Ins.vsto nó không mở được còn đăng ký với Excel bằng Com Add-Ins thì nó lại không cho, vậy bạn có project mẫu chia sẻ mình tham khảo với hoặc có link nào chỉ để mình nghiên cứu cũng được.
3. Định tạo thử file exe cho mạnh test dùm luôn, một công đôi việc.
4. Cái này mình cũng thấy nhưng không biết khắc phục bằng cách nào, chắc có lẽ như lần trước Mạnh nói là file VSTO quá lớn nên nó Load chậm.
5. Cũng đang nghiên cứu nè, mới tìm hiểu nên viết code chạy được trên excel cũng mừng lắm rồi.
Một lần nửa cảm ơn bạn, rất mong nhận được góp ý có giá trị từ bạn Mạnh, thân!
 
Cảm ơn bạn đã chia sẻ.
1. Để mình dùng thử máy ảo, bạn có thể giới thiệu cho mình phần mềm nào tạo máy ảo chạy ổn hiện nay không, mình dùng virtualbox thấy nó hay bị lỗi quá. Trước giờ vọc khoảng 1, 2 tháng gì là cài lại máy mất công quá.
2. Cái này chỉ nghe bạn nói chứ chưa thấy, sao mình copy sang máy khác mở file Excel_Add-Ins.vsto nó không mở được còn đăng ký với Excel bằng Com Add-Ins thì nó lại không cho, vậy bạn có project mẫu chia sẻ mình tham khảo với hoặc có link nào chỉ để mình nghiên cứu cũng được.
3. Định tạo thử file exe cho mạnh test dùm luôn, một công đôi việc.
4. Cái này mình cũng thấy nhưng không biết khắc phục bằng cách nào, chắc có lẽ như lần trước Mạnh nói là file VSTO quá lớn nên nó Load chậm.
5. Cũng đang nghiên cứu nè, mới tìm hiểu nên viết code chạy được trên excel cũng mừng lắm rồi.
Một lần nửa cảm ơn bạn, rất mong nhận được góp ý có giá trị từ bạn Mạnh, thân!
Thử cái sau xem trước đây mạnh xài thấy ok đó
VMware - Tạo máy ảo trên PC
https://www.google.com.vn/search?q=...PC&aqs=chrome..69i57&sourceid=chrome&ie=UTF-8
 
Hầu hết mọi phần mềm đều có thể dịch ngược ra mã gốc với ngôn ngữ lập trình ra nó kể cả Delphi (mới tình cờ thấy Delphi là chuột bạch trên Youtube độ mấy tuần trước) chứ chả riêng gì C#. Bởi vậy mới lại phát sinh ra công nghệ chống dịch ngược. Công nghệ này mà áp dụng với .Net thì dịch tới dịch lui thì đếch ra cái gì với công nghệ có tính phí. Họ có can thiệp vô cái assembly gì đó (theo 1 anh kinh nghiệm) mà ko thể nào bung ra cấu trúc chương trình.

Với bản free thì cấu trúc rồ déc phơi bày ra nhưng cũng phải đọc lòi con mắt với ô vuông hay chữ tàu. Đơn giản, chỉ cần dùng phần mềm rối hóa mở file biên dịch rồi bấm nút là nó ra 1 file đánh đố mấy ông táy máy. :whistling:

Cái này chính tự bản thân tôi trải nghiệm lâu rồi nên mới dám nói.

Nhờ bạn gửi link video hoặc tên pm dịch ngược được Delphi ra ngôn ngữ gốc nhé. Mình mong ước mua đc phần mềm này để lấy lại mã nguồn đã mất :)
 
Nhờ bạn gửi link video hoặc tên pm dịch ngược được Delphi ra ngôn ngữ gốc nhé. Mình mong ước mua đc phần mềm này để lấy lại mã nguồn đã mất :)
Bác thử tìm trong này nhé. Thực lòng tôi có tra lại history nhưng vô vọng vì quá nhiều link. Cái đó giống Ilspy nhưng tôi mở ra thì không phải.
 
Mới copy được trên mạng mấy dòng code sau hỏng biết của ai nữa !?
Mã:
object qryOpenningRanges: TADOQuery
    Connection = ADOConnection1
    CursorType = ctStatic
    ParamCheck = False
    Parameters = <>
    SQL.Strings = (
     
        'SELECT Users.Inactive, Ranges.Inactive, Databases.Inactive, Grou' +
        'ps.GroupName, Users.UserName, tblOpenningRanges.IP, Ranges.ID, R' +
        'anges.RangeName, Ranges.RangeAddr, Sheets.SheetName, Databases.D' +
        'atabaseName, Databases.ID, Ranges.d1, Ranges.c1, Ranges.d2, Rang' +
        'es.c2, tblOpenningRanges.LocalWorkbook, tblOpenningRanges.LocalW' +
        'orksheet, Users.Handle, Ranges.IncludeWorkbook,Ranges.AllowUploa' +
        'd,Ranges.VBA'
     
        'FROM (Groups INNER JOIN Users ON Groups.ID = Users.GroupID) INNE' +
        'R JOIN ((Databases INNER JOIN Sheets ON Databases.ID = Sheets.Da' +
        'tabaseID) INNER JOIN (Ranges INNER JOIN tblOpenningRanges ON Ran' +
        'ges.ID = tblOpenningRanges.RangeID) ON Sheets.ID = Ranges.SheetI' +
        'D) ON Users.ID = tblOpenningRanges.UserID'
      'WHERE (((Users.Inactive)=False) AND ((Groups.Inactive)=False));')
    Left = 176
    Top = 328
  end
  object qryListRanges: TADOQuery
    Connection = ADOConnection1
    CursorType = ctStatic
    ParamCheck = False
    Parameters = <>
    SQL.Strings = (
     
        'SELECT Ranges.ID, Ranges.RangeName, Ranges.RangeAddr, Sheets.She' +
        'etName, Databases.DatabaseName, Ranges.d1, Ranges.c1, Ranges.d2,' +
        ' Ranges.c2, Ranges.IncludeWorkbook,Ranges.AllowUpload,Ranges.VBA'
     
        'FROM (Databases INNER JOIN Sheets ON Databases.ID = Sheets.Datab' +
        'aseID) INNER JOIN Ranges ON Sheets.ID = Ranges.SheetID;')
    Left = 176
    Top = 416
  end
end
 
Lần chỉnh sửa cuối:
Mới copy được trên mạng mấy dòng code sau hỏng biết của ai nữa !?
Mã:
object qryOpenningRanges: TADOQuery
    Connection = ADOConnection1
    CursorType = ctStatic
    ParamCheck = False
    Parameters = <>
    SQL.Strings = (
    
        'SELECT Users.Inactive, Ranges.Inactive, Databases.Inactive, Grou' +
        'ps.GroupName, Users.UserName, tblOpenningRanges.IP, Ranges.ID, R' +
        'anges.RangeName, Ranges.RangeAddr, Sheets.SheetName, Databases.D' +
        'atabaseName, Databases.ID, Ranges.d1, Ranges.c1, Ranges.d2, Rang' +
        'es.c2, tblOpenningRanges.LocalWorkbook, tblOpenningRanges.LocalW' +
        'orksheet, Users.Handle, Ranges.IncludeWorkbook,Ranges.AllowUploa' +
        'd,Ranges.VBA'
    
        'FROM (Groups INNER JOIN Users ON Groups.ID = Users.GroupID) INNE' +
        'R JOIN ((Databases INNER JOIN Sheets ON Databases.ID = Sheets.Da' +
        'tabaseID) INNER JOIN (Ranges INNER JOIN tblOpenningRanges ON Ran' +
        'ges.ID = tblOpenningRanges.RangeID) ON Sheets.ID = Ranges.SheetI' +
        'D) ON Users.ID = tblOpenningRanges.UserID'
      'WHERE (((Users.Inactive)=False) AND ((Groups.Inactive)=False));')
    Left = 176
    Top = 328
  end
  object qryListRanges: TADOQuery
    Connection = ADOConnection1
    CursorType = ctStatic
    ParamCheck = False
    Parameters = <>
    SQL.Strings = (
    
        'SELECT Ranges.ID, Ranges.RangeName, Ranges.RangeAddr, Sheets.She' +
        'etName, Databases.DatabaseName, Ranges.d1, Ranges.c1, Ranges.d2,' +
        ' Ranges.c2, Ranges.IncludeWorkbook,Ranges.AllowUpload,Ranges.VBA'
    
        'FROM (Databases INNER JOIN Sheets ON Databases.ID = Sheets.Datab' +
        'aseID) INNER JOIN Ranges ON Sheets.ID = Ranges.SheetID;')
    Left = 176
    Top = 416
  end
end

Đây là phần Form. Delphi lưu cấu trúc cảu Form vào Resource nên chỉ cần có phần mềm đọc Resource là thấy được cấu trúc. Bạn có nhìn thấy code ở các Procedure, Function không?
 
Đây là phần Form. Delphi lưu cấu trúc cảu Form vào Resource nên chỉ cần có phần mềm đọc Resource là thấy được cấu trúc. Bạn có nhìn thấy code ở các Procedure, Function không?
Bạn yên tâm đi là code Delphi không thể nào coi hết được ...

1/ đúng như bạn nói chỉ coi phần Form thôi còn lại ko thấy chi hết ....:D:rolleyes:
mặc dù mình thử nhiều cách ... vây nên khi ta biết được chỉ coi được phần Form thì ta điều chỉnh lại code viết hết vào Unit xong làm thủ tục keo nó thì hết coi .... ( Bạn thấy mình nói vậy ok không ???!)

2/ Mình có tìm hiểu thì thấy trên mạng nó nói code Delphi Build ra mã máy rất khó coi ... có thấy đi chăng nữa thì cũng ko thể nào đọc được mấy cái ký tự linh tinh ... còn trên Form nó nói vẫn coi bình thường ( đặc biệt lưu ý khúc này mà điều chỉnh viết code he)

3/ Còn code C# coi đơn giản lắm như coi code viết trên Excel vậy ... còn ai đó nói mã hóa hay pắc gì đó thì mạnh chưa biết hay chưa thử nên ko biết
... nếu bạn nào có 1 File DLL viết bằng C# đã mã hóa (Pắc gì đó ...) Úp lên cho Mạnh coi thử chút

nhưng cũng thấy trên Mạng nó nói khi code C# mà Pắc gì đó thì sử dụng nó chậm và hay lỗi + nó báo có Virus ... Thua ?!

4/ Mạnh mới nhập Môn Delphi thấy nó OK (bảo mật tốt ...Tốc độ nhanh ..) và đặc biệt nếu đam mê VBA mà viết thư viện Hàm cho VBA nữa thì đó là niềm mơ ước của bao người yêu VBA cho Excel vậy
 
Nếu bạn nào xài C# có thể tham khảo code sau ... khi viết Hàm .... xài trên Range
Lưu ý code này của ai đó trên Internet đó nha ...-0-0-0-===\.
Mã:
using ExcelDna.Integration;
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Text.RegularExpressions;

namespace TTool.IntelliSense
{
    public static class IntelliSenseServer
    {
        private class RegistrationInfo : IComparable<IntelliSenseServer.RegistrationInfo>
        {
            public string XllPath;

            public Guid ServerId;

            public string Version;

            public static IntelliSenseServer.RegistrationInfo FromRegistrationString(string registrationString)
            {
                IntelliSenseServer.RegistrationInfo result;
                try
                {
                    string[] array = registrationString.Split(new char[]
                    {
                        ','
                    });
                    result = new IntelliSenseServer.RegistrationInfo
                    {
                        XllPath = array[0],
                        ServerId = Guid.ParseExact(array[1], "N"),
                        Version = array[2]
                    };
                }
                catch (Exception ex)
                {
                    Debug.Print(string.Format("!!! ERROR: Invalid RegistrationString {0}: {1}", registrationString, ex.Message));
                    result = null;
                }
                return result;
            }

            public string ToRegistrationString()
            {
                return string.Format("{0},{1:N},{2}", this.XllPath, this.ServerId, this.Version);
            }

            public int CompareTo(IntelliSenseServer.RegistrationInfo other)
            {
                return IntelliSenseServer.RegistrationInfo.CompareVersions(this.Version, other.Version);
            }

            public static string GetControlMacroName(Guid serverId)
            {
                return string.Format("IntelliSenseServerControl_{0:N}", serverId);
            }

            public string GetControlMacroName()
            {
                return IntelliSenseServer.RegistrationInfo.GetControlMacroName(this.ServerId);
            }

            public static int CompareVersions(string versionString1, string versionString2)
            {
                int[] array = IntelliSenseServer.ParseVersion(versionString1);
                int[] array2 = IntelliSenseServer.ParseVersion(versionString2);
                int num = Math.Max(array.Length, array2.Length);
                int i = 0;
                int result;
                while (i < num)
                {
                    int num2 = (array.Length - 1 < i) ? 0 : array[i];
                    int num3 = (array2.Length - 1 < i) ? 0 : array2[i];
                    bool flag = num2 < num3;
                    if (flag)
                    {
                        result = -1;
                    }
                    else
                    {
                        bool flag2 = num2 > num3;
                        if (!flag2)
                        {
                            i++;
                            continue;
                        }
                        result = 1;
                    }
                    return result;
                }
                result = 0;
                return result;
            }
        }

        [CompilerGenerated]
        [Serializable]
        private sealed class <>c
        {
            public static readonly IntelliSenseServer.<>c <>9 = new IntelliSenseServer.<>c();

            public static Func<string, IntelliSenseServer.RegistrationInfo> <>9__35_0;

            internal IntelliSenseServer.RegistrationInfo <GetHighestPublishedRegistration>b__35_0(string str)
            {
                return IntelliSenseServer.RegistrationInfo.FromRegistrationString(str);
            }
        }

        private const string ServerVersion = "1.0.1";

        private const string DisabledVersionsMachineKeyName = "HKEY_LOCAL_MACHINE\\Software\\ExcelDna\\IntelliSense";

        private const string DisabledVersionsUserKeyName = "HKEY_CURRENT_USER\\Software\\ExcelDna\\IntelliSense";

        private const string DisabledVersionsValueName = "DisabledVersions";

        private const string DisabledVersionsVariable = "EXCELDNA_INTELLISENSE_DISABLEDVERSIONS";

        private const string ServersVariable = "EXCELDNA_INTELLISENSE_SERVERS";

        private const string ActiveServerVariable = "EXCELDNA_INTELLISENSE_ACTIVE_SERVER";

        private const string ControlMessageActivate = "ACTIVATE";

        private const string ControlMessageDeactivate = "DEACTIVATE";

        private const string ControlMessageRefresh = "REFRESH";

        private static string _xllPath = ExcelDnaUtil.get_XllPath();

        private static Guid _serverId = Guid.NewGuid();

        private static bool _isActive = false;

        private static IntelliSenseHelper _helper = null;

        private static string RegistrationString
        {
            get
            {
                IntelliSenseServer.RegistrationInfo registrationInfo = new IntelliSenseServer.RegistrationInfo
                {
                    XllPath = ExcelDnaUtil.get_XllPath(),
                    ServerId = IntelliSenseServer._serverId,
                    Version = "1.0.1"
                };
                return registrationInfo.ToRegistrationString();
            }
        }

        public static void Register(ref UIMonitor uimonitorget)
        {
            TraceLogger.Initialize();
            Logger.Initialization.Info(string.Format("IntelliSenseServer.Register Begin: Version {0} in {1}", "1.0.1", AppDomain.CurrentDomain.FriendlyName));
            bool flag = IntelliSenseServer.IsDisabled();
            if (!flag)
            {
                IntelliSenseServer.RegisterControlMacro();
                IntelliSenseServer.PublishRegistration();
                bool flag2 = false;
                IntelliSenseServer.RegistrationInfo activeRegistrationInfo = IntelliSenseServer.GetActiveRegistrationInfo();
                bool flag3 = activeRegistrationInfo == null;
                if (flag3)
                {
                    flag2 = true;
                }
                else
                {
                    bool flag4 = IntelliSenseServer.RegistrationInfo.CompareVersions("1.0.1", activeRegistrationInfo.Version) > 0;
                    if (flag4)
                    {
                        flag2 = true;
                    }
                    else
                    {
                        Logger.Initialization.Info(string.Format("IntelliSenseServer not being activated now. Active Version: {0}", activeRegistrationInfo.Version));
                    }
                }
                bool flag5 = flag2 && (activeRegistrationInfo == null || IntelliSenseServer.DeactivateServer(activeRegistrationInfo));
                if (flag5)
                {
                    IntelliSenseServer.Activate();
                    uimonitorget = IntelliSenseServer._helper._uiMonitor;
                }
                AppDomain.CurrentDomain.DomainUnload += new EventHandler(IntelliSenseServer.CurrentDomain_DomainUnload);
                AppDomain.CurrentDomain.ProcessExit += new EventHandler(IntelliSenseServer.CurrentDomain_ProcessExit);
                Logger.Initialization.Info("IntelliSenseServer.Register End");
            }
        }

        public static void Refresh()
        {
            Logger.Initialization.Info("IntelliSenseServer.Refresh Begin");
            bool isActive = IntelliSenseServer._isActive;
            if (isActive)
            {
                IntelliSenseServer.RefreshProviders();
            }
            else
            {
                IntelliSenseServer.RegistrationInfo activeRegistrationInfo = IntelliSenseServer.GetActiveRegistrationInfo();
                bool flag = activeRegistrationInfo != null;
                if (flag)
                {
                    IntelliSenseServer.RefreshServer(activeRegistrationInfo);
                }
            }
            Logger.Initialization.Info("IntelliSenseServer.Refresh End");
        }

        private static void CurrentDomain_ProcessExit(object sender, EventArgs e)
        {
            Logger.Initialization.Verbose("IntelliSenseServer ProcessExit Begin");
            bool isActive = IntelliSenseServer._isActive;
            if (isActive)
            {
                XlCall.ShutdownStarted();
                IntelliSenseServer.Deactivate();
            }
            Logger.Initialization.Verbose("IntelliSenseServer ProcessExit End");
        }

        private static void CurrentDomain_DomainUnload(object sender, EventArgs e)
        {
            Logger.Initialization.Verbose("IntelliSenseServer DomainUnload Begin");
            IntelliSenseServer.UnpublishRegistration();
            bool isActive = IntelliSenseServer._isActive;
            if (isActive)
            {
                IntelliSenseServer.Deactivate();
                IntelliSenseServer.RegistrationInfo highestPublishedRegistration = IntelliSenseServer.GetHighestPublishedRegistration();
                bool flag = highestPublishedRegistration != null;
                if (flag)
                {
                    IntelliSenseServer.ActivateServer(highestPublishedRegistration);
                }
            }
            Logger.Initialization.Verbose("IntelliSenseServer DomainUnload End");
        }

        internal static bool Activate()
        {
            bool result;
            try
            {
                IntelliSenseServer.SetActiveRegistrationInfo();
                IntelliSenseServer._isActive = true;
                IntelliSenseServer._helper = new IntelliSenseHelper();
                result = true;
            }
            catch (Exception arg)
            {
                Logger.Initialization.Error(string.Format("IntelliSenseServer.Activate failed: {0}", arg));
                result = false;
            }
            return result;
        }

        internal static bool Deactivate()
        {
            bool result;
            try
            {
                bool flag = IntelliSenseServer._helper != null;
                if (flag)
                {
                    IntelliSenseServer._helper.Dispose();
                }
                IntelliSenseServer._isActive = false;
                IntelliSenseServer.ClearActiveRegistrationInfo();
                result = true;
            }
            catch (Exception arg)
            {
                Logger.Initialization.Error(string.Format("IntelliSenseServer.Deactivate error: {0}", arg));
                result = false;
            }
            return result;
        }

        internal static void RefreshProviders()
        {
            Logger.Initialization.Info("IntelliSenseServer.RefreshProviders");
            try
            {
                Debug.Assert(IntelliSenseServer._helper != null);
                IntelliSenseServer._helper.RefreshProviders();
            }
            catch (Exception arg)
            {
                Logger.Initialization.Error(string.Format("IntelliSenseServer.RefreshProviders error: {0}", arg));
            }
        }

        private static bool IsDisabled()
        {
            string text = Registry.GetValue("HKEY_LOCAL_MACHINE\\Software\\ExcelDna\\IntelliSense", "DisabledVersions", null) as string;
            string text2 = Registry.GetValue("HKEY_CURRENT_USER\\Software\\ExcelDna\\IntelliSense", "DisabledVersions", null) as string;
            string environmentVariable = Environment.GetEnvironmentVariable("EXCELDNA_INTELLISENSE_DISABLEDVERSIONS");
            string text3 = "1.0.1";
            bool flag = IntelliSenseServer.IsVersionMatch(text3, text) || IntelliSenseServer.IsVersionMatch(text3, text2) || IntelliSenseServer.IsVersionMatch(text3, environmentVariable);
            bool flag2 = flag;
            if (flag2)
            {
                Logger.Initialization.Info(string.Format("IntelliSenseServer version {0} is disabled. MachineDisabled: {1}, UserDisabled: {2}, EnvironmentDisabled: {3}", new object[]
                {
                    text3,
                    text,
                    text2,
                    environmentVariable
                }));
            }
            return flag;
        }

        private static bool ActivateServer(IntelliSenseServer.RegistrationInfo registrationInfo)
        {
            bool result;
            try
            {
                object obj = XlCall.Excel(XlCall.xlUDF, new object[]
                {
                    registrationInfo.GetControlMacroName(),
                    "ACTIVATE"
                });
                result = (bool)obj;
            }
            catch (Exception ex)
            {
                Logger.Initialization.Error(ex, string.Format("IntelliSenseServer {0} could not be activated.", registrationInfo.ToRegistrationString()), new object[0]);
                result = false;
            }
            return result;
        }

        private static bool DeactivateServer(IntelliSenseServer.RegistrationInfo registrationInfo)
        {
            bool result;
            try
            {
                object obj = XlCall.Excel(XlCall.xlUDF, new object[]
                {
                    registrationInfo.GetControlMacroName(),
                    "DEACTIVATE"
                });
                bool flag = obj is ExcelError;
                if (flag)
                {
                    Logger.Initialization.Error(string.Format("IntelliSenseServer {0} could not be deactivated.", registrationInfo.ToRegistrationString()));
                    result = false;
                }
                else
                {
                    result = (bool)obj;
                }
            }
            catch (Exception ex)
            {
                Logger.Initialization.Error(ex, string.Format("IntelliSenseServer Deactivate call for {0} failed.", registrationInfo.ToRegistrationString()), new object[0]);
                result = false;
            }
            return result;
        }

        private static bool RefreshServer(IntelliSenseServer.RegistrationInfo registrationInfo)
        {
            bool result;
            try
            {
                object obj = XlCall.Excel(XlCall.xlUDF, new object[]
                {
                    registrationInfo.GetControlMacroName(),
                    "REFRESH"
                });
                bool flag = obj is ExcelError;
                if (flag)
                {
                    Logger.Initialization.Error(string.Format("IntelliSenseServer {0} could not be deactivated.", registrationInfo.ToRegistrationString()));
                    result = false;
                }
                else
                {
                    result = (bool)obj;
                }
            }
            catch (Exception ex)
            {
                Logger.Initialization.Error(ex, string.Format("IntelliSenseServer Deactivate call for {0} failed.", registrationInfo.ToRegistrationString()), new object[0]);
                result = false;
            }
            return result;
        }

        private static void PublishRegistration()
        {
            string environmentVariable = Environment.GetEnvironmentVariable("EXCELDNA_INTELLISENSE_SERVERS");
            string value = (environmentVariable == null) ? IntelliSenseServer.RegistrationString : string.Join(";", new string[]
            {
                environmentVariable,
                IntelliSenseServer.RegistrationString
            });
            Environment.SetEnvironmentVariable("EXCELDNA_INTELLISENSE_SERVERS", value);
        }

        private static void UnpublishRegistration()
        {
            List<string> list = new List<string>(Environment.GetEnvironmentVariable("EXCELDNA_INTELLISENSE_SERVERS").Split(new char[]
            {
                ';'
            }));
            bool condition = list.Remove(IntelliSenseServer.RegistrationString);
            Debug.Assert(condition, "IntelliSenseServer.UnpublishRegistration - Registration not found in EXCELDNA_INTELLISENSE_SERVERS");
            string value = string.Join(";", list);
            Environment.SetEnvironmentVariable("EXCELDNA_INTELLISENSE_SERVERS", value);
        }

        private static IntelliSenseServer.RegistrationInfo GetActiveRegistrationInfo()
        {
            string environmentVariable = Environment.GetEnvironmentVariable("EXCELDNA_INTELLISENSE_ACTIVE_SERVER");
            bool flag = string.IsNullOrEmpty(environmentVariable);
            IntelliSenseServer.RegistrationInfo result;
            if (flag)
            {
                result = null;
            }
            else
            {
                result = IntelliSenseServer.RegistrationInfo.FromRegistrationString(environmentVariable);
            }
            return result;
        }

        private static void SetActiveRegistrationInfo()
        {
            string environmentVariable = Environment.GetEnvironmentVariable("EXCELDNA_INTELLISENSE_ACTIVE_SERVER");
            Debug.Assert(environmentVariable == null, "ActiveServer already set while activating");
            Environment.SetEnvironmentVariable("EXCELDNA_INTELLISENSE_ACTIVE_SERVER", IntelliSenseServer.RegistrationString);
        }

        private static void ClearActiveRegistrationInfo()
        {
            Environment.SetEnvironmentVariable("EXCELDNA_INTELLISENSE_ACTIVE_SERVER", null);
        }

        private static int[] ParseVersion(string versionString)
        {
            bool flag = string.IsNullOrEmpty(versionString);
            int[] result;
            if (flag)
            {
                result = new int[1];
            }
            else
            {
                string[] array = versionString.Split(new char[]
                {
                    '.'
                });
                int[] array2 = new int[array.Length];
                for (int i = 0; i < array.Length; i++)
                {
                    int num;
                    bool flag2 = !int.TryParse(array[i], out num);
                    if (flag2)
                    {
                        result = new int[1];
                        return result;
                    }
                    array2[i] = num;
                }
                result = array2;
            }
            return result;
        }

        private static bool IsVersionMatch(string version, string versionPattern)
        {
            bool flag = string.IsNullOrEmpty(versionPattern);
            bool result;
            if (flag)
            {
                result = false;
            }
            else
            {
                bool flag2 = versionPattern == "*";
                if (flag2)
                {
                    result = true;
                }
                else
                {
                    List<string> list = new List<string>();
                    string[] array = versionPattern.Split(new char[]
                    {
                        ','
                    });
                    string[] array2 = array;
                    for (int i = 0; i < array2.Length; i++)
                    {
                        string text = array2[i];
                        string text2 = text.Trim();
                        bool flag3 = Regex.IsMatch(text2, "(\\d+\\.)+(\\.\\*)?", RegexOptions.None);
                        if (flag3)
                        {
                            list.Add("^" + text2.Replace(".*", "(\\.\\d+)*") + "$");
                        }
                    }
                    string pattern = string.Join("|", list);
                    result = Regex.IsMatch(version, pattern);
                }
            }
            return result;
        }

        private static IntelliSenseServer.RegistrationInfo GetHighestPublishedRegistration()
        {
            string environmentVariable = Environment.GetEnvironmentVariable("EXCELDNA_INTELLISENSE_SERVERS");
            bool flag = environmentVariable == null;
            IntelliSenseServer.RegistrationInfo result;
            if (flag)
            {
                Debug.Print("!!! ERROR: ServersVariable not set");
                result = null;
            }
            else
            {
                IEnumerable<string> arg_54_0 = environmentVariable.Split(new char[]
                {
                    ';'
                });
                Func<string, IntelliSenseServer.RegistrationInfo> arg_54_1;
                if ((arg_54_1 = IntelliSenseServer.<>c.<>9__35_0) == null)
                {
                    arg_54_1 = (IntelliSenseServer.<>c.<>9__35_0 = new Func<string, IntelliSenseServer.RegistrationInfo>(IntelliSenseServer.<>c.<>9.<GetHighestPublishedRegistration>b__35_0));
                }
                result = arg_54_0.Select(arg_54_1).Max<IntelliSenseServer.RegistrationInfo>();
            }
            return result;
        }

        private static void RegisterControlMacro()
        {
            MethodInfo method = typeof(IntelliSenseServer).GetMethod("IntelliSenseServerControl", BindingFlags.Static | BindingFlags.NonPublic);
            string controlMacroName = IntelliSenseServer.RegistrationInfo.GetControlMacroName(IntelliSenseServer._serverId);
            ExcelIntegration.RegisterMethods(new List<MethodInfo>
            {
                method
            }, new List<object>
            {
                new ExcelCommandAttribute
                {
                    Name = controlMacroName
                }
            }, new List<List<object>>
            {
                new List<object>
                {
                    null
                }
            });
        }

        private static object IntelliSenseServerControl(object control)
        {
            string a = control as string;
            bool flag = a == "ACTIVATE";
            object result;
            if (flag)
            {
                Debug.Print("IntelliSenseServer.Activate in AppDomain: " + AppDomain.CurrentDomain.FriendlyName);
                result = IntelliSenseServer.Activate();
            }
            else
            {
                bool flag2 = a == "DEACTIVATE";
                if (flag2)
                {
                    Debug.Print("IntelliSenseServer.Deactivate in AppDomain: " + AppDomain.CurrentDomain.FriendlyName);
                    result = IntelliSenseServer.Deactivate();
                }
                else
                {
                    bool flag3 = a == "REFRESH";
                    if (flag3)
                    {
                        Debug.Print("IntelliSenseServer.Refresh in AppDomain: " + AppDomain.CurrentDomain.FriendlyName);
                        bool flag4 = !IntelliSenseServer._isActive;
                        if (flag4)
                        {
                            Logger.Initialization.Error("IntelliSenseServer Refresh call on inactive server.");
                            result = false;
                        }
                        else
                        {
                            IntelliSenseServer.RefreshProviders();
                            result = true;
                        }
                    }
                    else
                    {
                        result = false;
                    }
                }
            }
            return result;
        }
    }
}
 
Lần chỉnh sửa cuối:
Ban đầu tính dùng dịch mã.Net mở 1 cái dll bị rối mã để xem sao nhưng tình cờ nó mở đầu ngay cái thư mục addin tôi thử nghiệm bằng ExcelDna thế là tôi tò mò mở luôn cái addin (ndAdin.dll) đó xem những cái gì tôi đã viết và tôi phải há hốc mồm vì bất ngờ trong đó (Thêm yêu ExcelDna }}}}}}}}}}}}}}}). Tôi cũng chưa chiêu trò gì với code trong đó cả (nguyên bản từ ExcelDna sinh ra), nên hy vọng là các bác chuyên gia bốc phốt lắm tài nhiều chiêu thử dịch ngược ra xem nhé.

Tính tôi không thích huyên thuyên, ba phải nên thường tự trải nghiệm và tự rút ra đáp án. Tôi cũng thử viết vài cái hàm để so sánh hiệu năng VBA với C# và rất ngạc nhiên với tốc độ chênh lệch giữa 2 ngôn ngữ này (cả chục lần khi thử nghiệm với mảng số và vòng lặp). Tiếc là Delphi vượt quá trình của tôi với phần cũng xót cái laptop cùi nên chưa dám cài để trải nghiệm nên không dám huyên thuyên ý kiến gì:unknw:.
 

File đính kèm

.......................................
Mã:
namespace ndAddin
{
    public class MyAddin
    {
        [ExcelFunction(Description = "Equal Excel-DNA function")]
        public static bool xEqual(int x, int y)
        {
            DateTime now = DateTime.Now;
            double totalMilliseconds = (DateTime.Now - now).TotalMilliseconds;
            return x == y;
        }

        [ExcelFunction(Description = "Null Excel-DNA function")]
        public static string sayNull()
        {
            return "Null";
        }
    }
}
qua vb
Mã:
Namespace ndAddin
    Public Class MyAddin
        <ExcelFunction(Description = "Equal Excel-DNA function")>
        Public Shared Function xEqual(x As Integer, y As Integer) As Boolean
            Dim now As DateTime = DateTime.Now
            Dim totalMilliseconds As Double = (DateTime.Now - now).TotalMilliseconds
            Return x = y
        End Function

        <ExcelFunction(Description = "Null Excel-DNA function")>
        Public Shared Function sayNull() As String
            Return "Null"
        End Function
    End Class
End Namespace
 
Bạn yên tâm đi là code Delphi không thể nào coi hết được ...

1/ đúng như bạn nói chỉ coi phần Form thôi còn lại ko thấy chi hết ....:D:rolleyes:
mặc dù mình thử nhiều cách ... vây nên khi ta biết được chỉ coi được phần Form thì ta điều chỉnh lại code viết hết vào Unit xong làm thủ tục keo nó thì hết coi .... ( Bạn thấy mình nói vậy ok không ???!)

2/ Mình có tìm hiểu thì thấy trên mạng nó nói code Delphi Build ra mã máy rất khó coi ... có thấy đi chăng nữa thì cũng ko thể nào đọc được mấy cái ký tự linh tinh ... còn trên Form nó nói vẫn coi bình thường ( đặc biệt lưu ý khúc này mà điều chỉnh viết code he)

3/ Còn code C# coi đơn giản lắm như coi code viết trên Excel vậy ... còn ai đó nói mã hóa hay pắc gì đó thì mạnh chưa biết hay chưa thử nên ko biết
... nếu bạn nào có 1 File DLL viết bằng C# đã mã hóa (Pắc gì đó ...) Úp lên cho Mạnh coi thử chút

nhưng cũng thấy trên Mạng nó nói khi code C# mà Pắc gì đó thì sử dụng nó chậm và hay lỗi + nó báo có Virus ... Thua ?!

4/ Mạnh mới nhập Môn Delphi thấy nó OK (bảo mật tốt ...Tốc độ nhanh ..) và đặc biệt nếu đam mê VBA mà viết thư viện Hàm cho VBA nữa thì đó là niềm mơ ước của bao người yêu VBA cho Excel vậy

Rất tốt đó bạn. Tôi cũng tìm hiểu khá khá về bảo mật và hệ thống biên dịch code ở các compiler nên mới chọn Delphi. Nhưng cũng muốn xem công nghệ có phát sinh mới gì ngoài hiểu biết của mình không. Cảm ơn bạn.
 
Con Decompiler của bác Mạnh mạnh dữ. Mình dùng con ILSpy cùi nên không biết. Giờ thử với cái này nếu dịch ra được code gốc thì mình xin tên con decompiler của bác Mạnh.:victory:
................................................... 1 giây ................ là xong
Mã:
Imports System
Imports System.Collections
Imports System.Collections.Generic
Imports System.Drawing
Imports System.IO
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Public Class 鯜똻부绋㟞싦
    Private Const 膛呚炚⯃蔪摃웸능 As String = "http://"

    Public Shared 㥬꣓쥙撙볳耘쨛 As Integer

    Public Shared ᐐ쉓믖偉鋒攚➐ As Integer

    Public Shared 힃ពퟂ稰䅅飶眃瞟 As Integer

    Public Shared ៧ⳣ臁딽롮訐㬰嗎 As Integer

    Public Shared 庑쇘密実㇑湆堺 As Integer

    Public Shared 晃࠽纔桶眎缢翽 As Integer

    Public Shared 焆ힾ婧㕖Åދ럛ำ As Byte

    Private 俾鴫ⰺ뇀릚༓ As CookieContainer

    Public Shared Function 旫壷⣟坕蛿輎敼俰(폕ᰭꩊ獥ω얩 As String, 橰ᣏꅦᐪ�ꋹ䡧䙽 As String, 年稬蘝綕뇧劍靍 As String, 坃蒄퍢⋪㮭耥뎥癨 As CookieContainer, Optional 턳詿䱣ᳵ緍㛈읍옰 As String=Nothing, Optional 蔻㈫뷛鴺蕞춽▹燇 As Integer=25000, Optional 㓇飨月꘷荒煁࣍☷ As Integer=15000) As String
        Dim ゑႍ䮹댝뉟딐⸭褓 As String
        Dim array As Byte()
        While True
            IL_00:
            Dim num As Integer = 2
            While True
                Select Case num
                    Case 0
                        GoTo IL_00
                    Case 2
                        ゑႍ䮹댝뉟딐⸭褓 = ඗⣧᢮⧩㧭ﺑ⥼렵.뜻㾱땟뱂蹟㢔蜴䀫(Of String)(959949775UI, 18399759179194280837UL)
                        Dim aSCIIEncoding As ASCIIEncoding = 디9Ⴆ؁芤萹�.꾏᧨ꐧ㦱セ㎃뻢硞()
                        array = 鑞窃럺ᝮ餱৅푡⻌.굞則硓찶ꔫጷ鞅∟(aSCIIEncoding, 年稬蘝綕뇧劍靍)
                        num = 1
                        Continue While
                End Select
                GoTo IL_22
            End While
        End While
Bài đã được tự động gộp:

............................
Mã:
Public Class 굾꽀Ⱁ굷⌾苟
    Public Function ToJson() As String
        Dim javaScriptSerializer As JavaScriptSerializer = New JavaScriptSerializer()
        Return javaScriptSerializer.Serialize(Me)
    End Function
End Class
Mã:
Public Sub New()
        While True
            IL_00:
            MyBase..ctor()
            Dim num As Integer = 1
            While True
                Select Case num
                    Case 0
                        GoTo IL_00
                    Case 1
                        IL_2F:
                        num = 2
                        Continue While
                    Case 2
                        Return
                End Select
                GoTo IL_2F
            End While
        End While
    End Sub
 

File đính kèm

................................................... 1 giây ................ là xong
Giờ đọc lại code cũ tiếng Tàu với tiếng Hàn lẫn lộn mà cười ra tiếng mán luôn /*-*/
Chưa kể nó bổ sung thêm cái từ khóa "Shared" với biến hay số 959949775UI, 18399759179194280837UL mà tôi không biết dùng làm gì. Dịch ngược xong không biết bác Mạnh có nắm được chức năng của một số hàm chuyên biệt hay công dụng của chương trình trong project đó không nhỉ?

Bác Mạnh không nói tên công cụ decompiler nhưng bây giờ thì tôi lại thêm thắc mắc là 4 năm trước mình dùng cái gì để Tàu hóa cái này.-0-/.
 
Lần chỉnh sửa cuối:
Giờ đọc lại code cũ tiếng Tàu với tiếng Hàn lẫn lộn mà cười ra tiếng mán luôn /*-*/
Chưa kể nó bổ sung thêm cái từ khóa "Shared" với biến hay số 959949775UI, 18399759179194280837UL mà tôi không biết dùng làm gì. Không biết bác Mạnh có nắm được chức năng của một số hàm chuyên biệt trong project đó không nhỉ?

Bác Mạnh không nói tên công cụ decompiler nhưng bây giờ thì tôi lại thêm thắc mắc là 4 năm trước mình dùng cái gì để Tàu hóa cái này.-0-/.
lười xem qua bạn coi đúng không
 

File đính kèm

lười xem qua bạn coi đúng không
Cái này ko còn tiếng Hàn nhưng mà sao nó mọc thêm class linh tinh (Glass...), gay nhất là bị lỗi syntax (106 errors) khi thử biên dịch lại dù rằng chương trình gốc vẫn chạy bình thường. Lỗi phát sinh hình như do không đúng phiên bản ngôn ngữ C# mà tôi dùng chăng(?)

Anh có thể cho biết công cụ decompiler của anh được không ạ?
 
Lần chỉnh sửa cuối:
Cái này ko còn tiếng Hàn nhưng mà vẫn khó đọc hiểu dù chính tôi là người viết và quan trọng là bị lỗi syntax (106 errors) khi thử biên dịch lại dù rằng chương trình gốc vẫn chạy bình thường. Lỗi phát sinh hình như do không đúng phiên bản ngôn ngữ C# mà tôi dùng(?)

Anh có thể cho biết công cụ decompiler của anh được không ạ?
Cái này ko còn tiếng Hàn nhưng mà vẫn khó đọc hiểu dù chính tôi là người viết và quan trọng là bị lỗi syntax (106 errors) khi thử biên dịch lại dù rằng chương trình gốc vẫn chạy bình thường. Lỗi phát sinh hình như do không đúng phiên bản ngôn ngữ C# mà tôi dùng(?)

Anh có thể cho biết công cụ decompiler của anh được không ạ?[/QUOTE
Cái này ko còn tiếng Hàn nhưng mà vẫn khó đọc hiểu dù chính tôi là người viết và quan trọng là bị lỗi syntax (106 errors) khi thử biên dịch lại dù rằng chương trình gốc vẫn chạy bình thường. Lỗi phát sinh hình như do không đúng phiên bản ngôn ngữ C# mà tôi dùng chăng(?)

Anh có thể cho biết công cụ decompiler của anh được không ạ?
Cái này ko còn tiếng Hàn nhưng mà gay nhất là bị lỗi syntax (106 errors) khi thử biên dịch lại dù rằng chương trình gốc vẫn chạy bình thường. Lỗi phát sinh hình như do không đúng phiên bản ngôn ngữ C# mà tôi dùng chăng(?)

Anh có thể cho biết công cụ decompiler của anh được không ạ?
cái này được pack bằng confuserex 1.9 thì tìm unpack tương ứng với nó thôi bạn
 
Mạnh thấy Tây nó nói như vầy:

Khi ta sử dụng 1 phần mềm của bên thứ 3 can thiệp vào cái DLL gốc tức là ta đang cố tình làm sai lệch cấu trúc bên trong nó vậy nó sẻ phát sinh 1 vài cái sau tùy theo mức độ can thiệp và code bên trong đó DLL

1/ Làm tốc độ load Hàm hay sub trong DLL chậm đi ...

2/ Làm lỗi code trong 1 vài trường hợp tùy theo ...

3/ Có khi dính cả virus trong DLL đó mà mình ko biết ... nhưng cái diệt virus nó báo thế ?!
..............................

Nó khuyên là ko nên cố tình làm sai lệch hồ sơ vụ án ... mà ko giải quyết cái chi cả chỉ gặp thêm, rối rắm và rủi do cao mà thui :p:D

Vậy nên nguyên thủy nó sao xài vậy là tốt nhất .... nếu thấy cái C# ko an toàn ta chuyển kênh khác vậy cho nhanh
 
Lần chỉnh sửa cuối:
Mạnh thấy Tây nó như vầy:

Khi ta sử dụng 1 phần mềm của bên thứ 3 can thiệp vào cái DLL gốc tức là ta đang cố tình làm sai lệch cấu trúc bên trong nó vậy nó sẻ phát sinh 1 vài cái sau tùy theo mức độ can thiệp và code bên trong đó DLL

1/ Làm tốc độ load Hàm hay sub trong DLL chậm đi ...

2/ Làm lỗi code trong 1 vài trường hợp tùy theo ...

3/ Có khi dính cả virus trong DLL đó mà mình ko biết ... nhưng cái diệt virus nó báo thế ?!
..............................

Nó khuyên là ko nên cố tình làm sai lệch hồ sơ vụ án ... mà ko giải quyết cái chi cả chỉ gặp thêm, rối rắm và rủi do cao mà thui :p:D

Vậy nên nguyên thủy nó sao xài vậy là tốt nhất .... nếu thấy cái C# ko an toàn ta chuyển kênh khác vậy cho nhanh
các hacker không cần biết code mình viết cái gì chỉ biết cơ chế pm hoạt động như thế nào từ đó decomplied nó ra mã máy mà crack
Bài đã được tự động gộp:

các hacker không cần biết code mình viết cái gì chỉ biết cơ chế pm hoạt động như thế nào từ đó decomplied nó ra mã máy mà crack
ngôn ngữ nào cũng vậy không có ngôn ngữ lập trình nào mà các tay hacker ko can thiệp được
 
Mạnh thấy Tây nó như vầy:

Khi ta sử dụng 1 phần mềm của bên thứ 3 can thiệp vào cái DLL gốc tức là ta đang cố tình làm sai lệch cấu trúc bên trong nó vậy nó sẻ phát sinh 1 vài cái sau tùy theo mức độ can thiệp và code bên trong đó DLL

1/ Làm tốc độ load Hàm hay sub trong DLL chậm đi ...

2/ Làm lỗi code trong 1 vài trường hợp tùy theo ...

3/ Có khi dính cả virus trong DLL đó mà mình ko biết ... nhưng cái diệt virus nó báo thế ?!
..............................

Nó khuyên là ko nên cố tình làm sai lệch hồ sơ vụ án ... mà ko giải quyết cái chi cả chỉ gặp thêm, rối rắm và rủi do cao mà thui :p:D

Vậy nên nguyên thủy nó sao xài vậy là tốt nhất .... nếu thấy cái C# ko an toàn ta chuyển kênh khác vậy cho nhanh
Lỗi project dịch ngược thôi chứ tôi thấy phần mềm nguyên gốc (được rối code) thì chạy bình thường mà?
Nếu dịch ngược lại mà không thể biên dịch hay để nắm được chức năng code thì coi như mục tiêu dịch ngược coi như thất bại đúng không? (trừ khi là muốn học từ vựng tiếng Hàn:victory:).

Với lại anh Mạnh xài Delphi có bản quyền sao? Nếu xài crack thì không biết cái nào có virus hay không virus đâu nhé? Trước đây người ta hay có cái trò đóng băng đĩa cứng để chống virus nhưng họ lại cài mấy phần mềm lậu trước khi đóng băng thế là tôi tủm tỉm cười rằng không biết là để chống virus hay là để bảo tồn virus trong máy --=0.
 
Mạnh thấy Tây nó như vầy:

Khi ta sử dụng 1 phần mềm của bên thứ 3 can thiệp vào cái DLL gốc tức là ta đang cố tình làm sai lệch cấu trúc bên trong nó vậy nó sẻ phát sinh 1 vài cái sau tùy theo mức độ can thiệp và code bên trong đó DLL

1/ Làm tốc độ load Hàm hay sub trong DLL chậm đi ...

2/ Làm lỗi code trong 1 vài trường hợp tùy theo ...

3/ Có khi dính cả virus trong DLL đó mà mình ko biết ... nhưng cái diệt virus nó báo thế ?!
..............................

Nó khuyên là ko nên cố tình làm sai lệch hồ sơ vụ án ... mà ko giải quyết cái chi cả chỉ gặp thêm, rối rắm và rủi do cao mà thui :p:D

Vậy nên nguyên thủy nó sao xài vậy là tốt nhất .... nếu thấy cái C# ko an toàn ta chuyển kênh khác vậy cho nhanh
với delphi người ta có thể xem được thiết kế các form tên của các button, textbox..... trên form, code form, các câu lệnh tương ứng với nó ở dạng assembly
 
với delphi người ta có thể xem được thiết kế các form tên của các button, textbox..... trên form, code form, các câu lệnh tương ứng với nó ở dạng assembly
Thì bài 43 mạnh nói đó ... nếu ta ko viết code ngay trên Form mà ta viết code vào Unit Delphi xong làm thủ tục keo nó thì có mà tịt
(Tại thời điểm này ... còn sau này vài năm nữa ko biết :p:D )
 
Lỗi project dịch ngược thôi chứ tôi thấy phần mềm nguyên gốc (được rối code) thì chạy bình thường mà?
Nếu dịch ngược lại mà không thể biên dịch hay để nắm được chức năng code thì coi như mục tiêu dịch ngược coi như thất bại.

Với lại anh Mạnh xài Delphi có bản quyền sao? Nếu xài crack thì không biết cái nào có virus hay không virus đâu nhé? Trước đây người ta hay có cái trò đóng băng đĩa cứng để chống virus nhưng họ lại cài mấy phần mềm lậu trước khi đóng băng thế là tôi tủm tỉm cười rằng không biết là để chống virus hay là để bảo tồn virus trong máy --=0.
thực ra virus còn diệt được đóng băng ổ đĩa tuy nhốt virus trong đó nhưng nó còn nhiều cái lơi lắm: như không tạo thêm rác cho hệ thống,ngăn ngừa các phần mềm mã độc như
Lỗi project dịch ngược thôi chứ tôi thấy phần mềm nguyên gốc (được rối code) thì chạy bình thường mà?
Nếu dịch ngược lại mà không thể biên dịch hay để nắm được chức năng code thì coi như mục tiêu dịch ngược coi như thất bại đúng không? (trừ khi là muốn học từ vựng tiếng Hàn:victory:).

Với lại anh Mạnh xài Delphi có bản quyền sao? Nếu xài crack thì không biết cái nào có virus hay không virus đâu nhé? Trước đây người ta hay có cái trò đóng băng đĩa cứng để chống virus nhưng họ lại cài mấy phần mềm lậu trước khi đóng băng thế là tôi tủm tỉm cười rằng không biết là để chống virus hay là để bảo tồn virus trong máy --=0.
-heeeeeeeee đa số phần mềm mà việt nam chúng ta đang xài là lậu hết nên không tránh được virus nhưng đóng băng có thể tránh được mấy phần mềm đòi tiền chuột, giảm rác hệ thống......
 
Lỗi project dịch ngược thôi chứ tôi thấy phần mềm nguyên gốc (được rối code) thì chạy bình thường mà?
Nếu dịch ngược lại mà không thể biên dịch hay để nắm được chức năng code thì coi như mục tiêu dịch ngược coi như thất bại đúng không? (trừ khi là muốn học từ vựng tiếng Hàn:victory:).

Với lại anh Mạnh xài Delphi có bản quyền sao? Nếu xài crack thì không biết cái nào có virus hay không virus đâu nhé? Trước đây người ta hay có cái trò đóng băng đĩa cứng để chống virus nhưng họ lại cài mấy phần mềm lậu trước khi đóng băng thế là tôi tủm tỉm cười rằng không biết là để chống virus hay là để bảo tồn virus trong máy --=0.
Mạnh xài Delphi Chùa ... nhưng test qua mấy cái diệt virus nổi tiếng ròi thấy nó không la làng lên ..................... mà IM RE à :p:D:eek:
 
Thì bài 43 mạnh nói đó ... nếu ta ko viết code ngay trên Form mà ta viết code vào Unit Delphi xong làm thủ tục keo nó thì có mà tịt
(Tại thời điểm này ... còn sau này vài năm nữa ko biết :p:D )
ý mạnh là viết code vào unit name thay vì viết vào form name
Bài đã được tự động gộp:

ý mạnh là viết code vào unit name thay vì viết vào form name
code unit name theo mình nghĩ là code cho các button....phải không bạn
 
thực ra virus còn diệt được đóng băng ổ đĩa tuy nhốt virus trong đó nhưng nó còn nhiều cái lơi lắm: như không tạo thêm rác cho hệ thống,ngăn ngừa các phần mềm mã độc như

-heeeeeeeee đa số phần mềm mà việt nam chúng ta đang xài là lậu hết nên không tránh được virus nhưng đóng băng có thể tránh được mấy phần mềm đòi tiền chuột, giảm rác hệ thống......
Thế là anh mặc nhiên coi virus là thứ được chấp nhận đúng không? Thế thì cớ sao lại đưa ra nguy cơ nhiễm virus cho file được rối hóa (dù thực sự gần như không có vì được cộng đồng người dùng kiểm chứng)?

Cách đây mấy năm tôi có xem đánh giá những chương trình virus nổi tiếng nhất thế giới thì chương trình tốt nhất cũng chỉ có thể diệt được 98% số virus mà người ta kiểm nghiệm. (không biết hiện giờ khá hơn chưa?) Nên tôi không chắc là anh quét tới quét lui nát cả máy mà đã diệt được hết virus.

Có nhiều anh tự tin rằng có thể bắt virus bằng tay nhưng tôi chỉ tủm tìm cười rằng hình như họ chưa phân biệt nổi virus với sworm nữa là --=0

Hiện nay hầu hết chương trình quét virus đều nhận biết virus thụ động cả nghĩa là nếu chưa có mã nhận diện của virus trong CSDL thì một chương trình virus hoàn toàn có thể sống khỏe re đến ngày 1 cái phòng thí nghiệm nào đó phát hiện ra với điều kiện là có nhiều nạn nhận bị ảnh hưởng rồi thì người ta mới tìm ra nó. Thử coi mấy cái phần mềm gián điệp của China nằm trong mấy cái chip hạt gạo ở máy chủ Mỹ mấy năm nay giờ mới lú đầu đó và cũng phải đến những chuyên gia công nghệ với cái kính lúp (cái loại dùng phóng to nha) chứ mấy anh antivirus không hề hay biết.
 
ý mạnh là viết code vào unit name thay vì viết vào form name
Bài đã được tự động gộp:


code unit name theo mình nghĩ là code cho các button....phải không bạn
bạn viết cho mình
Thế là anh mặc nhiên coi virus là thứ được chấp nhận đúng không? Thế thì cớ sao lại đưa ra nguy cơ nhiễm virus cho file được rối hóa (dù thực sự gần như không có vì được cộng đồng người dùng kiểm chứng)?

Cách đây mấy năm tôi có xem đánh giá những chương trình virus nổi tiếng nhất thế giới thì chương trình tốt nhất cũng chỉ có thể diệt được 98% số virus mà người ta kiểm nghiệm. (không biết hiện giờ khá hơn chưa?) Nên tôi không chắc là anh quét tới quét lui nát cả máy mà đã diệt được hết virus.

Có nhiều anh tự tin rằng có thể bắt virus bằng tay nhưng tôi chỉ tủm tìm cười rằng hình như họ chưa phân biệt nổi virus với sworm nữa là --=0

Hiện nay hầu hết chương trình quét virus đều nhận biết virus thụ động cả nghĩa là nếu chưa có mã nhận diện của virus trong CSDL thì một chương trình virus hoàn toàn có thể sống khỏe re đến ngày 1 cái phòng thí nghiệm nào đó phát hiện ra với điều kiện là có nhiều nạn nhận bị ảnh hưởng rồi thì người ta mới tìm ra nó. Thử coi mấy cái phần mềm gián điệp của China nằm trong mấy cái chip hạt gạo ở máy chủ Mỹ mấy năm nay giờ mới lú đầu đó và cũng phải đến những chuyên gia công nghệ với cái kính lúp (cái loại dùng phóng to nha) chứ mấy anh antivirus không hề hay biết.
heeeeeeeeeee như bạn nói thì ta phải sống chung với lũ thui né sao được nhưng quan trọng là né được lúc nào hay lúc đó né không được thì cài lại win kaaaaaaaaaa
Bài đã được tự động gộp:

xin lỗi chủ topic nha nãy giờ lạc đề quá
 
như bạn nói thì ta phải sống chung với lũ thui né sao được nhưng quan trọng là né được lúc nào hay lúc đó né không được thì cài lại win kaaaaaaaaaa
Tôi hiện tại không dùng phần mềm cracked, riêng Office 2010 tôi dùng nó đòi bản quyền nhưng tôi cũng không tìm cách crack (cũng không rõ nó có crack gì chưa). Còn lại tất cả các phần mềm đều có phí hoặc loại miễn phí hoặc share. Ví dụ winzar là dạng share nó đề nghi mua bản quyền thì tôi bấm nút bỏ qua thôi chứ không phải tìm cách crack nó. Người Việt Nam nổi tiếng thế giới vì tính trộm cắp rồi nên tôi cũng không muốn góp phần khẳng định đặc tính đó nữa. Đi mua hàng thối dư 100k mà tôi còn trả là lại là bạn đủ hiểu.

Chia sẻ với các bạn luôn là tình cờ đi lạc trong Settings>Advance trong Chrome tôi tìm ra "Clean up Computer" tính năng quét phần mềm độc hại, nên các bạn có thể dùng nó như một kiểu phần mềm quét virus hạng nhẹ. Nói chung sản phẩm của Google thì cũng khá tín nhiệm
 
Lần chỉnh sửa cuối:
Tôi hiện tại không dùng phần mềm cracked, riêng Office 2010 tôi dùng nó đòi bản quyền nhưng tôi cũng không tìm cách crack (cũng không rõ nó có crack gì chưa). Còn lại tất cả các phần mềm đều có phí hoặc loại miễn phí hoặc share. Ví dụ winzar là dạng share nó đề nghi mua bản quyền thì tôi bấm nút bỏ qua thôi chứ không phải tìm cách crack nó. Người Việt Nam nổi tiếng thế giới vì tính trộm cắp rồi nên tôi cũng không muốn góp phần khẳng định đặc tính đó nữa. Đi mua hàng thối dư 100k mà tôi còn trả là lại là bạn đủ hiểu.
những người bị virus là do không chịu mua bản quyền cứ tìm crack kaaaaaaaa cái giá phải trả đắt hơn tiền mua bản quyền
 
ý mạnh là viết code vào unit name thay vì viết vào form name
Bài đã được tự động gộp:


code unit name theo mình nghĩ là code cho các button....phải không bạn
Nhận tiện quậy thì làm phiền các bạn thử coi File mạnh viết bằng Delphi nhé ... xem có thấy chi không ... trong đó Có 1 Cái Form + code
Còn Code trong Unit thì đầy ra đó coi xem thấy chi ko luôn (Ko phải Unit theo Form)
Bài đã được tự động gộp:

Tôi hiện tại không dùng phần mềm cracked, riêng Office 2010 tôi dùng nó đòi bản quyền nhưng tôi cũng không tìm cách crack (cũng không rõ nó có crack gì chưa). Còn lại tất cả các phần mềm đều có phí hoặc loại miễn phí hoặc share. Ví dụ winzar là dạng share nó đề nghi mua bản quyền thì tôi bấm nút bỏ qua thôi chứ không phải tìm cách crack nó. Người Việt Nam nổi tiếng thế giới vì tính trộm cắp rồi nên tôi cũng không muốn góp phần khẳng định đặc tính đó nữa. Đi mua hàng thối dư 100k mà tôi còn trả là lại là bạn đủ hiểu.

Chia sẻ với các bạn luôn là tình cờ đi lạc trong Settings>Advance trong Chrome tôi tìm ra "Clean up Computer" tính năng quét phần mềm độc hại, nên các bạn có thể dùng nó như một kiểu phần mềm quét virus hạng nhẹ. Nói chung sản phẩm của Google thì cũng khá tín nhiệm
nếu bạn nào xài Chrome x64 thì nó có tính năng tải file đa luồng đó bật lên chạy ok đó ... dẹp cái IDM đi cho nhanh
 

File đính kèm

nếu bạn nào xài Chrome x64 thì nó có tính năng tải file đa luồng đó bật lên chạy ok đó ... dẹp cái IDM đi cho nhanh
Lời khuyên hơi thừa vì tôi nói rõ là không dùng phầm crack mà. Các bạn Việt Nam toàn dùng IDM chứ tôi dùng FDM (miễn phí). Cả sketchup vẽ 3D tôi cũng dùng bản free online chứ không chơi bản crack offline. (nếu crack thì máy chạy cũng chả nổi).

Trở lại với Addin trên .Net, có vẻ mọi người không hứng thú theo xu hướng phát triển của tôi nên bỏ lỡ nhiều cái hay của ExcelDna quá. Nhân lúc nhiều lời tôi cũng chia sẻ 1 điểm rất đặc biệt có trong ExcelDna nữa là với ExcelDna các bạn có thể phát triển các addin mà không cần IDE cho .Net (khỏi Visual Studio cồng kềnh hay bất cứ cái gì giống thế) chỉ cần notepad cũng có thể chơi.:victory: Quả là các anh Tây giúp ta tận tình từ a đến z.

Các bạn muốn khám phá cái này thì hãy đến trang chủ của ExcelDna(ExcelDna-0.34.6) và down về nhé. Trong đó có cái tài liệu "step by step" và các example. Chỉ cần đào bới 2 cái đó thì các bạn sẽ tìm ra tính năng này. Chúc các bạn may mắn và mình cũng xin ngừng nói ở đây vì hình như nói nhiều dễ bị nhầm giới tính --=0
 
Lần chỉnh sửa cuối:
Nhận tiện quậy thì làm phiền các bạn thử coi File mạnh viết bằng Delphi nhé ... xem có thấy chi không ... trong đó Có 1 Cái Form + code
Còn Code trong Unit thì đầy ra đó coi xem thấy chi ko luôn (Ko phải Unit theo Form)
Bài đã được tự động gộp:


nếu bạn nào xài Chrome x64 thì nó có tính năng tải file đa luồng đó bật lên chạy ok đó ... dẹp cái IDM đi cho nhanh
như mình nói ko thể xem code gốc trong delphi (hiện tại) nhưng có thể xem code dạng mã máy ở từng button, trong file mạnh có 3 button .
 

File đính kèm

  • 2.PNG
    2.PNG
    3.9 KB · Đọc: 36
  • 3.PNG
    3.PNG
    2.5 KB · Đọc: 34
  • button1.PNG
    button1.PNG
    5.3 KB · Đọc: 29
  • form.PNG
    form.PNG
    5.5 KB · Đọc: 34
như mình nói ko thể xem code gốc trong delphi (hiện tại) nhưng có thể xem code dạng mã máy ở từng button, trong file mạnh có 3 button .
chính xác có 3 cái button đó ............... cơ bản coi code ấy chứ .... còn coi mã máy mấy ai đọc được
Trong Unit ấy có khoãng 20 Hàm và Sub (1 Unit theo Form) còn 10 Unit độc lập (Mình tạm keo vậy ko biết tây nó keo là chi)
 
chính xác có 3 cái button đó ............... cơ bản coi code ấy chứ .... còn coi mã máy mấy ai đọc được
đối với hacker ko quan tâm code bạn viết gì chỉ cần tìm kẻ hở trong phần mềm nắm được câu lệnh thực thi ở dạng mã máy, các hàm gọi... cũng đủ dùng
 

File đính kèm

  • Capture.PNG
    Capture.PNG
    39.6 KB · Đọc: 44
thấy trên mạng nó nói chỉ coi được code Delphi khi viết ngay trên Form hay Button ... vì vậy trên Button hay Form mạnh ko viết chi hết mà làm thủ tục keo hàm trong Unit độc lập ko theo Form vậy là hết coi code he
Bài đã được tự động gộp:

các hàm gọi có thể tìm trong ollydbg
Bài đã được tự động gộp:
mạnh coi cái đó hoa cả mắt ... năm ngoái có vọc qua ... xong bỏ luôn quan trong mình mới tập tành thì coi code mà học là chính còn vọc mấy cái đó làm biếng
 
thấy trên mạng nó nói chỉ coi được code Delphi khi viết ngay trên Form hay Button ... vì vậy trên Button hay Form mạnh ko viết chi hết mà làm thủ tục keo hàm trong Unit độc lập ko theo Form vậy là hết coi code he
unit doc lap thi vẫn dch sang mã máy được chứ bạn
 
Lời khuyên hơi thừa vì tôi nói rõ là không dùng phầm crack mà. Các bạn Việt Nam toàn dùng IDM chứ tôi dùng FDM (miễn phí). Cả sketchup vẽ 3D tôi cũng dùng bản free online chứ không chơi bản crack offline. (nếu crack thì máy chạy cũng chả nổi).

Trở lại với Addin trên .Net, có vẻ mọi người không hứng thú theo xu hướng phát triển của tôi nên bỏ lỡ nhiều cái hay của ExcelDna quá. Nhân lúc nhiều lời tôi cũng chia sẻ 1 điểm rất đặc biệt có trong ExcelDna nữa là với ExcelDna các bạn có thể phát triển các addin mà không cần IDE cho .Net (khỏi Visual Studio cồng kềnh hay bất cứ cái gì giống thế) chỉ cần notepad cũng có thể chơi.:victory: Quả là các anh Tây giúp ta tận tình từ a đến z.

Các bạn muốn khám phá cái này thì hãy đến trang chủ của ExcelDna(ExcelDna-0.34.6) và down về nhé. Trong đó có cái tài liệu "step by step" và các example. Chỉ cần đào bới 2 cái đó thì các bạn sẽ tìm ra tính năng này. Chúc các bạn may mắn và mình cũng xin ngừng nói ở đây vì hình như nói nhiều dễ bị nhầm giới tính --=0
Nghe bạn nói cái này cũng hấp dẫn quá, nhưng ngặc nổi khả năng mình thì không đủ để nghiên cứu nó. Bạn có thể chia sẻ chút về nó được không?
 
.......................................
Mã:
namespace ndAddin
{
    public class MyAddin
    {
        [ExcelFunction(Description = "Equal Excel-DNA function")]
        public static bool xEqual(int x, int y)
        {
            DateTime now = DateTime.Now;
            double totalMilliseconds = (DateTime.Now - now).TotalMilliseconds;
            return x == y;
        }

        [ExcelFunction(Description = "Null Excel-DNA function")]
        public static string sayNull()
        {
            return "Null";
        }
    }
}
qua vb
Mã:
Namespace ndAddin
    Public Class MyAddin
        <ExcelFunction(Description = "Equal Excel-DNA function")>
        Public Shared Function xEqual(x As Integer, y As Integer) As Boolean
            Dim now As DateTime = DateTime.Now
            Dim totalMilliseconds As Double = (DateTime.Now - now).TotalMilliseconds
            Return x = y
        End Function

        <ExcelFunction(Description = "Null Excel-DNA function")>
        Public Shared Function sayNull() As String
            Return "Null"
        End Function
    End Class
End Namespace
mời các bác compiled lại file ở trên xem được không nhé
 

File đính kèm

Lần chỉnh sửa cuối:
Mình mới nghiên cứu thôi, nên code cũng chẳng có gì để học hỏi đâu. Định khi nghiên cứu xong sẽ có những bài viết cụ thể về vấn đề này để chia sẻ cho ai có nhu cầu. Thôi thì chia sẻ đại để bạn xem và có hy vọng cùng nhau nghiên cứu.
Lâu quá không thấy ACE quan tâm Topic VSTO , mình rất thích chủ đề này nhưng tài liệu hạn chế quá. Bạn có thể chia sẽ giúp tài liệu hay Code demo một vài ứng dụng! Trân trọng cảm ơn và mong muốn hợp tác trao đổi kinh nghiệm!
 
C#
Cho mình hỏi, làm sao để mở file theo đường dẫn mà nó không bị chế độ read-only nhỉ. (mình tạo add-in, gắn vào button để mở file)
Mã:
 private void button1_Click(object sender, RibbonControlEventArgs e)
        {
            string workbookPath = "C:\\Users\\Admin\\Desktop\\Tam tinh 3 ho mong tru 500.xlsx";
            COMExcel.Application exApp = new COMExcel.Application();
            COMExcel.Workbook exBook = exApp.Workbooks.Open(workbookPath,
                    0, true, 5, "", "", false, Excel.XlPlatform.xlWindows, "",
                    true, false, 0, true, false, false);
            exApp.Visible = true;
        }
 
Gửi các anh link siêu nhanh của Embarcadero Rad Studio 10.3.1 Rio Architect 26.0.33219.4899
Link tải
Bài đã được tự động gộp:

Delphi rất hay nhưng không có tài liệu và hướng dẫn, mong các anh bớt chút time hướng dẫn chi tiết 1 bài tạo menu Ribbon với ạ
 
Còn đây là cách viết cho C#.
1. Tạo mới dữ án C# như hình dưới.
View attachment 204359
2. Nhấp chuột phải vào Class1.cs sau đó chọn Rename, gõ tên mới và nhấn Enter, nháy Yes (đổi tên Class thành FuncVBA, hoặc tên tùy ý theo ý mình, Xem hình).
View attachment 204360
3. Cài thư viện cho C# (Nếu máy đã cài rồi thì có thể bỏ qua bước này và bước 4, nếu chưa có thì tải file này ở đây) bằng cách mở Explorer lên và chọn file exceldnadoc.0.2.3.nupkg (file mới tải về) nhấp chuột phải và chọn lệnh Copy.
Trở lại dữ án C# và vào Menu Tools --> Library Package Manager --> Package Manager Settings.
View attachment 204361
4. Sau đó thực hiện các bước như hình.
View attachment 204362
5. Cập nhật thư hiện bằng cách vào menu Tools --> Library Package Manager --> Package Manager Console
View attachment 204363
6. Trên cửa sổ dòng lệnh sau PM> gõ dòng lệnh Install-Package ExcelDnaDoc -Version 0.2.3 và nhấn Enter
View attachment 204364
7. Cũng trên dòng lệnh đó gõ tiếp lệnh Install-Package ExcelDna.AddIn và nhấn Enter.
View attachment 204365
8. Cũng trên dòng lệnh đó gõ tiếp lệnh Install-Package ExcelDna.Registration và nhấn Enter.
View attachment 204366
9. Nháy chuột vào Class.cs (Cụ thể là FuncVBA đã đặt tên ở bước 2) và sửa lại code trong Class này như sau:
PHP:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HamVBA
{
    using ExcelDna.Integration;
    public class FuncVBA
    {
        [ExcelFunction(Name = "VnSum",
                        Description = "Hàm tính tổng của 2 số thực",
                        HelpTopic = "DocTest-AddIn.chm!1002")]//Tên File Help nếu có
        public static double VnSum(
            [ExcelArgument(Description = "Giá trị thứ nhất là số thực\nCó thể chọn địa chỉ của ô tính")] double SoA,
            [ExcelArgument(Description = "Giá trị thứ hai cũng là số thực\nCó thể chọn địa chỉ của ô tính")] double SoB)
        {
            return SoA + SoB;
        }
    }
}
10. Nhấn F5 để chạy.
11. Vào Excel chọn một ô và nháy nút Fx và thực hiện các bước như hình.

View attachment 204367
12. Gõ các tham số cho hàm và nháy Ok.
View attachment 204368
13. Đóng Excel lại, Mở Menu Project --> HamVBA Properties.
View attachment 204369
14. Nháy vào thẻ Debug và xem file xll đã được tạo ra.

15. Mở Explorer và tìm thư mục chứa Project và chọn thư mục HamVBA --> Bin --> Debug có chứa các tệp tin được tạo ra trong có có têp *.xll.
uc

16. Copy tệp tin xll (Ở đâu là Tệp HamVBA-AddIn.xll) này đến máy tính bất kỳ và sử dụng thôi.
17. Mở Excel và vào File  Options và thực hiện như hình để chèn file xll vào file Excel là dùng.
uc

Em đang thắc mắc khi đã cài Excel-DNA các thư viện đi kèm rồi em xin hỏi làm sao để load cùng ExcelDna.IntelliSense.xll để hiển thị gợi ý hàm UDF đã viết khi gõ trên Sheet ạ
Khi nhấn vào Fx trên thanh công thức thì có hiện
1680915145116.png
Khi gõ trên Sheet thì không hiện hướng dẫn a, thay vì phải load ExcelDna.IntelliSense.xll thủ công nó sẽ hiện như thế này
1680915228233.png
 
Em đang thắc mắc khi đã cài Excel-DNA các thư viện đi kèm rồi em xin hỏi làm sao để load cùng ExcelDna.IntelliSense.xll để hiển thị gợi ý hàm UDF đã viết khi gõ trên Sheet ạ
Khi nhấn vào Fx trên thanh công thức thì có hiện
View attachment 288648
Khi gõ trên Sheet thì không hiện hướng dẫn a, thay vì phải load ExcelDna.IntelliSense.xll thủ công nó sẽ hiện như thế này
View attachment 288649
Bạn tạo thêm cái Class mới (Ví dụ đặt tên là clsStartUp), bạn tiếp tục thêm thư viện using ExcelDna.IntelliSense; và using ExcelDna.Integration; vào Class vừa mới thêm vào.
Phía sau tên Class bạn thêm vào : IExcelAddIn (Cụ thể public class clsStartUp : IExcelAddIn ). Phía trong cái Class này bạn thêm vào 2 cái void như sau:
Mã:
public void AutoOpen()
        {
            IntelliSenseServer.Install();
        }

 public void AutoClose()
        {
            IntelliSenseServer.Uninstall();
        }
Bây giờ bạn chạy thử và xem kết quả.
 
Khi em làm theo cách trên thì code báo lỗi này ạ

Severity Code Description Project File Line Suppression State
Error The "FindRibbons" task failed unexpectedly.
System.IO.FileNotFoundException: Could not load file or assembly 'VB_ExcelAddInPro, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.
File name: 'VB_ExcelAddInPro, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'

Server stack trace:
at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
at System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean forIntrospection)
at System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
at System.Reflection.Assembly.Load(String assemblyString)
at System.UnitySerializationHolder.GetRealObject(StreamingContext context)
at System.Runtime.Serialization.ObjectManager.ResolveObjectReference(ObjectHolder holder)
at System.Runtime.Serialization.ObjectManager.DoFixups()
at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
at System.Runtime.Remoting.Channels.CrossAppDomainSerializer.DeserializeObject(MemoryStream stm)
at System.Runtime.Remoting.Messaging.SmuggledMethodReturnMessage.FixupForNewAppDomain()
at System.Runtime.Remoting.Channels.CrossAppDomainSink.SyncProcessMessage(IMessage reqMsg)

Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at Microsoft.Build.Framework.ITask.Execute()
at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()
at Microsoft.Build.BackEnd.TaskBuilder.<ExecuteInstantiatedTask>d__26.MoveNext()

WRN: Assembly binding logging is turned OFF.
To enable assembly bind failure logging, set the registry value [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) to 1.
Note: There is some performance penalty associated with assembly bind failure logging.
To turn this feature off, remove the registry value [HKLM\Software\Microsoft\Fusion!EnableLog]. ExcelDNA_AddInPro
 
Bạn Up cái Project của bạn lên đây tui xem thử.
 
Tui sử dụng C# còn bạn dùng VB.Net thì tui không biết rồi.
 
Em mày mò theo bug đưa ra thì cuối bug có hướng dẫn tạo 1 khoá Registry thì đã hết lỗi trên ạ
Mã:
WRN: Assembly binding logging is turned OFF.
To enable assembly bind failure logging, set the registry value [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) to 1.
Note: There is some performance penalty associated with assembly bind failure logging.
To turn this feature off, remove the registry value [HKLM\Software\Microsoft\Fusion!EnableLog].    ExcelDNA_AddInPro
1680942199541.png
 

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

Back
Top Bottom