Kỹ thuật lập trình VB6->DLL cho Excel & Debugging cho Excel

Liên hệ QC

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia
13/6/06
Bài viết
4,649
Được thích
10,138
Giới tính
Nam
Nghề nghiệp
Giáo viên, CEO tại Bluesofts
Mục đích bài viết này tôi muốn gửi tới các thành viên 2 nội dung chính:

1) Kỹ thuật Debug trong Excel
Trong việc lập trình, có những bài toán đơn giản ta có thể viết hàm hay thủ tục một cách dễ dàng, nhưng có những bài toán phức tạp mà kết quả của một hàm chúng ta cần phải kiểm tra kỹ lưỡng tiến trình nhận kết quả của chúng, và đôi khi xảy ra lỗi chúng ta cũng cần phải tìm lỗi do đâu...

Video demo:
http://www.bluesofts.net/Programming/DebugVBA/DebugVBA.html

2) Kỹ thuật viết hàm, thủ tục trong VB6, biên dịch DLL và nhúng trong Excel, phương pháp Debug giũa 2 môi trường VB6 & VBA
Đã từ lâu, nhiều người đã rất lo lắng về việc mã nguồn viết trong VBA dẽ dàng bị lộ bởi cơ chế bảo mật của VBA không được tốt. Có một giải pháp là chúng ta viết mã trong thư viện DLL sau đó nhúng DLL này trong Excel, VBA để sử dụng.
+ Ưu điểm của phương pháp này là:
- Bảo mật được mã nguồn trong DLL (tốt hơn VBA vì nó đã được mã hóa)
- Xây dựng được hệ thống các thư viện các hàm và thủ tục có thể dùng chung cho nhiều ứng dụng khác nhau.
- Không bị các PM diệt virus diệt như với code trong VBA.
- Thừa hưởng các tài nguyên, control tốt trong VB6

+ Nhược điểm:
- Tốc độ chạy không nhanh bằng các hàm và thủ tục viết trực tiếp trong VBA.

Vấn đề viết mã trong VB6 hay các ngôn ngữ khác để tạo ra DLL dùng cho Excel cũng gặp phải một trở ngại là làm sao biết được mã mình viết trong DLL là đảm bảo chính xác? Nhiều người trước đây đã phải làm một việc rất vất vả là viết hàm trong VBA, kiểm tra chạy tốt rồi mới đưa sang VB6 để biên dịch thành DLL, nhưng khi có sự sửa chữa, nâng cấp mã thì công việc chuyển đổi giữa VBA->VB6 khá phiền hà. Phương án giải quyết vấn đề này là viết mã trực tiếp trong VB6, dùng kỹ thuật Debug trong VB6 cho Excel, VBA.
...

Video demo:
http://www.bluesofts.net/Programming/DebugVB6VBA/DebugVB6VBA.html

Download Video & ví dụ

.
 
Lần chỉnh sửa cuối:
Dear TuanVNUNI,
----------------
Cám ơn anh có một minh họa rất hay, phải nói là lâu lắm rồi em mới được ăn một món ngon như vậy!
Em cũng đang biên tập lại một số tiện ích thông dụng để tổng kết trong DLL. Đúng như anh nói, việc kiểm tra, debug trong VB6 không đơn giản như làm việc trong VBA. Em đã khắc phục bằng cách insert một module TEST và khai báo các class như trong VBA để debug các hàm, thủ tục.
Qua bài giới thiệu của anh, vấn đề kiểm tra, debug chắc không còn là trở ngại. Nhân đây, em có một thắc mắc (có thể là ngoài lề) mong tham khảo ý kiến anh là: khi DLL được biên dịch lại, em thường phải remove Reference vì lỗi MISSING (em có thói quen tham chiếu bằng Component Reference). Vậy nếu sử dụng DLL bằng tham chiếu như 1 Add-In Automation thì có gặp trở ngại gì không?
 
Upvote 0
Vấn đề viết mã trong VB6 hay các ngôn ngữ khác để tạo ra DLL dùng cho Excel cũng gặp phải một trở ngại là làm sao biết được mã mình viết trong DLL là đảm bảo chính xác? Nhiều người trước đây đã phải làm một việc rất vất vả là viết hàm trong VBA, kiểm tra chạy tốt rồi mới đưa sang VB6 để biên dịch thành DLL, nhưng khi có sự sửa chữa, nâng cấp mã thì công việc chuyển đổi giữa VBA->VB6 khá phiền hà. Phương án giải quyết vấn đề này là viết mã trực tiếp trong VB6, dùng kỹ thuật Debug trong VB6 cho Excel, VBA.

Ủa, thế mọi người từ trước tới nay ko Debug bao giờ à?

Chú ý: Khi dịch DLL thì cần hiểu rõ Project Compatibility và Binary Compatibility.

Các khái niệm Interface trong DLL có ý nghĩa như thế nào trong 2 kiểu trên. (Vấn đề conflict version)
 
Upvote 0
Dear TuanVNUNI,
khi DLL được biên dịch lại, em thường phải remove Reference vì lỗi MISSING (em có thói quen tham chiếu bằng Component Reference). Vậy nếu sử dụng DLL bằng tham chiếu như 1 Add-In Automation thì có gặp trở ngại gì không?

Em làm như sau. Trong VB6, em vào menu Project->Properties... Bấm chọn tab "Component", ở phần "Version Compatibility" chọn mục thứ 2 là "Project Compatibility"



hai2hai đã viết:
Chú ý: Khi dịch DLL thì cần hiểu rõ Project Compatibility và Binary Compatibility.

Các khái niệm Interface trong DLL có ý nghĩa như thế nào trong 2 kiểu trên. (Vấn đề conflict version)

Mặc dù google có thể tìm được các câu trả lời nhưng có vẻ như không dễ hiểu %#^#$ Anh có thể chia sẻ kinh nghiệm về vấn đề này với mọi người trên đây không?
 
Upvote 0
Mặc dù google có thể tìm được các câu trả lời nhưng có vẻ như không dễ hiểu %#^#$ Anh có thể chia sẻ kinh nghiệm về vấn đề này với mọi người trên đây không?

Hiểu nôm na thế này:

Giả sử có 1 đối tượng Customer thuộc lớp đối tượng là clsCustomer

Đối tượng này có 3 thuộc tính sau:
- ID
- CustomerCode
- Name

Và 3 methods sau:
- Delete()
- Insert()
- Update()

Trường hợp 1: Nếu ta muốn bổ sung thêm thuộc tính hoặc thêm methods mới như sau:
Thuộc tính thêm:
- Address
- ...

Methods thêm:
- GetAll() '// Get list of customers - Lấy danh sách khách hàng
- GetData() '// Get Data of the customer (by ID) - Lấy thông tin của 1 khách hàng theo ID (thường để hiển thị lên form chi tiết)

Như vậy, ta đã thấy Interface của đối tượng đã được thay đổi (ở trường hợp này thì ta chỉ thêm mới chứ ko sửa Interface)

Trường hợp 2:
Không thêm mới thuộc tính hoặc methods nào, tuy nhiên ta lại sửa nội dung của code trong methods. Ví dụ: Trong method Delete() ta sửa tá lả trong đó (Delete cái này, update cái nọ,...) thì ở trường hợp này Interface của đối tượng cũng không thay đổi.

Trường hợp 3:
Giả sử ta thay đổi tên của bất kỳ 1 thuộc tính, 1 method hoặc bổ sung, sửa tên tham số của một method nào đó. Ví dụ: Rename cái thuộc tính CustomerCode --> Code chẳng hạn. Ở trường hợp này, Interface đã bị thay đổi (bị sửa chứ ko chỉ thêm mới)

Với trường hợp 1 và trường hợp 2 (Interface chỉ thêm mới hoặc không thay đổi) thì ta có thể dùng Binary Compatibility để dịch DLL. Khi đó, file Exe (lấy ví dụ là file Exe cho dễ hiểu, còn chuyện sử dụng DLL thì ko chỉ có mỗi file exe sử dụng mà có thể DLL khác cũng sử dụng) sẽ không cần phải dịch lại mà vẫn chạy bình thường mà ko bị lỗi (tuy nhiên code cũ vẫn chưa sử dụng tới Interface mới). Nếu muốn sử dụng Interface mới thì phải modify code trong file exe.

Với trường hợp 3: Interface đã bị sửa đổi, khi dịch ra DLL, nếu để ở chế độ Binary Compability thì trình dịch sẽ thông báo là conflict version và nếu ta cứ tiếp tục dịch thì file DLL mới sẽ mang Interface mới chứ ko còn là Interface cũ nữa. Khi đó, File exe sử dụng DLL đó phải dịch lại để tương thích với Interface mới.

Trong mọi trường hợp (1, 2, 3), nếu ta dùng lựa chọn Project Compatibility để dịch thì bao giờ file DLL cũng tự trở thành 1 file có Interface mới (cho dù ở trường hợp 1 + 2). Ở trường hợp dịch này, kiểu gì thì file Exe cũng phải compile lại.

Hope this clear!
 
Upvote 0
VB6PictrureViewer - Sử dụng Form & Controls của VB6 trong VBA

Tiếp theo tôi xin giới thiệu các bạn cách thức sử dụng Form, Controls trong VB6 viết thành DLL rồi sử dụng bên VBA cùng với ví dụ "VB6PictrureViewer". Trong ví dụ này các bạn nên chú ý về cách lập trình Property và Event trong Class.

PictureViewerDLL.jpg
 

File đính kèm

  • VB6PictrureViewer.zip
    22.9 KB · Đọc: 1,419
Upvote 0
các bạn ơi nếu dùng 1 hàm .dll mà phải dùng các file đính kèm hoặc phải cài vb6 thì phiền quá . Cao Nhân nào có cách chỉ dùng một hàm .dll mà mình tạo ra rồi cài vào hệ thống và chạy luôn được trong excel luôn , mình đã thấy và đã làm rồi nhưng quên mất đường dẫn và câu lệnh chỉ biết là dùng các câu lệnh trong Ms dos để chạy file .dll đó thôi
Ai biết giúp mình với
email: trongbinh07@gmail.com
 
Lần chỉnh sửa cuối:
Upvote 0
các bạn ơi nếu dùng 1 hàm .dll mà phải dùng các file đính kèm hoặc phải cài vb6 thì phiền quá . Cao Nhân nào có cách chỉ dùng một hàm .dll mà mình tạo ra rồi cài vào hệ thống và chạy luôn được trong excel luôn , mình đã thấy và đã làm rồi nhưng quên mất đường dẫn và câu lệnh chỉ biết là dùng các câu lệnh trong Ms dos để chạy file .dll đó thôi
Ai biết giúp mình với
email: trongbinh07@gmail.com
Bạn tải file của bạn TuanVNUNI về! File này ta chỉ đăng ký DLL với Windows thôi, có phải cài VB6 gì đâu chứ
 
Upvote 0
Tất cả mọi ứng dụng được biên dịch bởi VB6 để chạy đều phải cần ít nhất 1 file thư viện msvbvm60.dll , tuy nhiên từ Windows XP trở đi khi cài đã có file này rồi, nên người dùng không cần file này nữa.
 
Upvote 0
VB6PictrureViewer

Mong Anh Tuan giúp em với
khi em mở code VB6 load lại DLL thì không load được
anh có thể gửi cho em code tạo file FormVB6DLL.dll này được không
Thank.
 

File đính kèm

  • code vb.rar
    39.2 KB · Đọc: 703
Upvote 0
Mong Anh Tuan giúp em với
khi em mở code VB6 load lại DLL thì không load được
anh có thể gửi cho em code tạo file FormVB6DLL.dll này được không
Thank.

Mình đã gửi tại trang đầu rồi mà. Nếu bạn đang chạy Windows Vista, 7 thì hãy chạy VB6 theo chế độ "Run As Administator" (nhấp chuột phải rồi chọn).
 
Upvote 0
Vba - dll

Cảm ơn Thầy: Tuan
Em đã làm như thầy giậy thấy rất ổn rồi thầy giúp đỡ em code nhập dự liệu từ Form DLL trong VB từ các ô textbox & label sang Excel với.
Thank.
 
Upvote 0
Cảm ơn Thầy: Tuan
Em đã làm như thầy giậy thấy rất ổn rồi thầy giúp đỡ em code nhập dự liệu từ Form DLL trong VB từ các ô textbox & label sang Excel với.
Thank.

Để truyền dữ liệu với Excel trong VB6, em hãy khai báo một biến (Public ExcelApp As Excel.Application) trong Module, viết một thủ tục trong class như sau.

Mã:
Sub GetExcelApp(Byval MyXlApp As Excel.Application)
     Set ExcelApp = MyXlApp
End Sub

Trong VB6, em thao tác với Excel qua biến ExcelApp.
 
Upvote 0
hỏi về vấn đề dịch dll sang ma nguồn lại

anh tuấn ơi a cho em hỏi tí.em có làm như cách của anh để xuất mã nguồn ra file dll.nhưng em lai lỡ tay xóa mất file vb rồi.làm sao em có thể biên dịch lại từ file dll hả anh.mong a hồi ạm sớm
 
Upvote 0
Để truyền dữ liệu với Excel trong VB6, em hãy khai báo một biến (Public ExcelApp As Excel.Application) trong Module, viết một thủ tục trong class như sau.

Mã:
Sub GetExcelApp(Byval MyXlApp As Excel.Application)
     Set ExcelApp = MyXlApp
End Sub

Trong VB6, em thao tác với Excel qua biến ExcelApp.

Em chào anh Tuân, anh Tuân ơi anh có thể giúp em tạo 1 cái enterkey hardware fingerprint với được ko? em lang thang trên mạng tìm miết mà ko có. em nghĩ anh có thể giúp nhưng bữa giờ em có hỏi trên diễn đàn nhưng ngại hỏi anh. anh giúp em với nhé.
 
Upvote 0
Em chào anh Tuân, anh Tuân ơi anh có thể giúp em tạo 1 cái enterkey hardware fingerprint với được ko? em lang thang trên mạng tìm miết mà ko có. em nghĩ anh có thể giúp nhưng bữa giờ em có hỏi trên diễn đàn nhưng ngại hỏi anh. anh giúp em với nhé.

Bạn làm cái gì và từ đâu thì ra cái form này ?
 
Upvote 0
Em đang viết 1 ứng dụng trong quản lý khối lượng thi công. Do càng ngày thuật toán càng phình to ra nên em tính tách riêng thành các module nhỏ lẻ cho thuận tiện trong việc nâng cấp và chỉnh sửa sau này. Tuy nhiên qua sơ bộ phát thảo sơ đồ tổ chức chương trình thì thấy rằng các hàm và thủ tục trong các DLL lồng vào nhau đến 7 cấp. Mình chưa có kinh nghiệm làm việc này nên xin hỏi diễn đàn nếu mình tổ chức chương trình và các câu lệnh như vậy thì khi chương trình thực thi sau này liệu có thể phát sinh những vấn đề và rủi ro gì không? Lời khuyên cho vấn đề này là gì?
 
Lần chỉnh sửa cuối:
Upvote 0
Không có rủi ro gì bạn à. Bạn cứ tổ chức mỗi class, module là chuyên về xử lý về một vấn đề nào đó như: làm việc với dư liệu, tập tin, workbook, sheet, ...
 
Upvote 0
Không có rủi ro gì bạn à. Bạn cứ tổ chức mỗi class, module là chuyên về xử lý về một vấn đề nào đó như: làm việc với dư liệu, tập tin, workbook, sheet, ...

Tách mỗi vấn đề ra mỗi file DLL có ổn không anh? Vì em phát thảo sơ đồ có 1 vài lệnh khi thực hiện nó sẽ gọi đến 7 cấp trong 7 file DLL khác nhau. Tức:

Lệnh trong DLL A gọi lệnh trong DLL B
Lệnh trong DLL B gọi lệnh trong DLL C
Lệnh trong DLL C gọi lệnh trong DLL D
Lệnh trong DLL D gọi lệnh trong DLL E
Lệnh trong DLL E gọi lệnh trong DLL F
Lệnh trong DLL F gọi lệnh trong DLL G
Lệnh trong DLL G gọi lệnh trong DLL H

Sau mỗi lần kết thúc lệnh em điều có set clsABC = Nothing
 
Lần chỉnh sửa cuối:
Upvote 0
Tách mỗi vấn đề ra mỗi file DLL có ổn không anh? Vì em phát thảo sơ đồ có 1 vài lệnh khi thực hiện nó sẽ gọi đến 7 cấp trong 7 file DLL khác nhau. Tức:

Lệnh trong DLL A gọi lệnh trong DLL B
Lệnh trong DLL B gọi lệnh trong DLL C
Lệnh trong DLL C gọi lệnh trong DLL D
Lệnh trong DLL D gọi lệnh trong DLL E
Lệnh trong DLL E gọi lệnh trong DLL F
Lệnh trong DLL F gọi lệnh trong DLL G
Lệnh trong DLL G gọi lệnh trong DLL H

Sau mỗi lần kết thúc lệnh em điều có set clsABC = Nothing

Việc tách cách khối công việc ra thành nhiều DLL không sai nhưng khối lượng công việc chia ra phải thực sự nhiều hoặc tính kế thừa bộ hàm và thủ tục ở mỗi DLL cao. Còn dự án không phải lớn bạn có thể viết chung vào một DLL để dẽ quản lý và vận dụng. Chia các đầu việc chính thành các CLASS, trong mỗi class chính lại móc nối tới class khác,...
 
Upvote 0
Web KT
Back
Top Bottom