Code VBA hoặc VB.Net load Add-ins có password Protect Workbook

Liên hệ QC

vu_tuan_manh_linh

linhvtm84@gmail.com
Tham gia
27/2/10
Bài viết
2,625
Được thích
1,893
Giới tính
Nam
Nghề nghiệp
Kỹ sư Kinh tế Xây dựng
Tôi tạo 1 Add-ins từ 1 file excel có password protect workbook. Khi load add-ins bằng tay, tôi nhập pass thì kích hoạt được add-ins đó. Tôi đang cố gắng thực hiện việc trên bằng code VBA hoặc VB.Net mà tìm chưa được. Mong mọi người giúp đỡ. Xin cảm ơn!
 
Vừa hỏi cả nhà xong thì tìm được cách làm trong VB.Net!
 
Upvote 0
Bạn trưng lên cho mọi người tham khảo đi
 
Upvote 0
Bạn trưng lên cho mọi người tham khảo đi
Trong VBA thì Install addin bằng câu lệnh: Addins(Addin_Name).Installed=True. Nếu file Addins được tạo từ 1 workbook có đặt pass open thì khi thực hiện lệnh này bắt buộc phải nhập pass, mà tìm mãi không được cách tự động set pass, thực hiện bằng tay thì quá dở.

Còn trong VB.Net thì thực hiện như mở workbook trong VBE:
Dim XlApp as Excel.Application
Dim xlWb as Excel.Workbook
xlApp= New Excel.Application
xlWb=xlApp.Workbooks.Open(FileName:=Full_File_Name, Password:=Password_Protect_Workbook

Mục đích của tôi chỉ là thêm bức tường bảo vệ cho dự án VBA khỏi những người nghiệp dư (như tôi). Việc phá pass bảo vệ code VBA bằng đọc mã Hex thì đơn giản rồi, nhưng không có pass open thì không Install Addins được, đồng nghĩa với việc không xem được code VBA. Cơ mà đang đau đầu vì .exe tạo bằng vb.net lại quá dễ xem code. Mã hóa bằng phần mềm free chả ăn thua vì lỗi tùm lum, lúc được lúc không.

So sánh VBE và VB.Net thì thấy môi trường VB.Net rộng hơn rất nhiều, do đó đòi hỏi các đối tượng phải khai báo tường mình hơn. Trong VBE thì nhiều đối tượng được lược bỏ do tự hiểu là đang trong môi trường đó rồi. Còn trong VB.net bắt buộc phải khai báo đầy đủ.
VD: Trong VBE thực hiện câu lệnh Range("A1").Value=1 thì tự nó hiểu là Application là Excel, Workbook là ActiveWorkbook, Worksheet là ActiveWorksheet. Nhưng trong VB.Net bắt buộc phải khai báo Excel.Application, Excel.Workbook, Excel.Worksheet. Thậm chí để có thể thâm nhập môi trường excel phải khai báo Import Excel=Microsoft.Office.Interop.Excel. Và để khai báo được Namespace này thì còn phải thêm thư viện tham khảo bằng cách Add Reference COM Microsoft.Excel 14.0 Ọbject Library.
Nói chung là rắc rối hơn khác nhiều, nhưng từ làm việc với VB.Net làm cái đầu thoáng hơn nhiều, rộng hơn nhiều.
 
Lần chỉnh sửa cuối:
Upvote 0
Trong VBA thì Install addin bằng câu lệnh: Addins(Addin_Name).Installed=True. Nếu file Addins được tạo từ 1 workbook có đặt pass open thì khi thực hiện lệnh này bắt buộc phải nhập pass, mà tìm mãi không được cách tự động set pass, thực hiện bằng tay thì quá dở.

Còn trong VB.Net thì thực hiện như mở workbook trong VBE:
Dim XlApp as Excel.Application
Dim xlWb as Excel.Workbook
xlApp= New Excel.Application
xlWb=xlApp.Workbooks.Open(FileName:=Full_File_Name, Password:=Password_Protect_Workbook

Mục đích của tôi chỉ là thêm bức tường bảo vệ cho dự án VBA khỏi những người nghiệp dư (như tôi). Việc phá pass bảo vệ code VBA bằng đọc mã Hex thì đơn giản rồi, nhưng không có pass open thì không Install Addins được, đồng nghĩa với việc không xem được code VBA. Cơ mà đang đau đầu vì .exe tạo bằng vb.net lại quá dễ xem code. Mã hóa bằng phần mềm free chả ăn thua vì lỗi tùm lum, lúc được lúc không.

So sánh VBE và VB.Net thì thấy môi trường VB.Net rộng hơn rất nhiều, do đó đòi hỏi các đối tượng phải khai báo tường mình hơn. Trong VBE thì nhiều đối tượng được lược bỏ do tự hiểu là đang trong môi trường đó rồi. Còn trong VB.net bắt buộc phải khai báo đầy đủ.
VD: Trong VBE thực hiện câu lệnh Range("A1").Value=1 thì tự nó hiểu là Application là Excel, Workbook là ActiveWorkbook, Worksheet là ActiveWorksheet. Nhưng trong VB.Net bắt buộc phải khai báo Excel.Application, Excel.Workbook, Excel.Worksheet. Thậm chí để có thể thâm nhập môi trường excel phải khai báo Import Excel=Microsoft.Office.Interop.Excel. Và để khai báo được Namespace này thì còn phải thêm thư viện tham khảo bằng cách Add Reference COM Microsoft.Excel 14.0 Ọbject Library.
Nói chung là rắc rối hơn khác nhiều, nhưng từ làm việc với VB.Net làm cái đầu thoáng hơn nhiều, rộng hơn nhiều.

Sao bạn ko thử xài VB6 đi xem sao
 
Upvote 0
Sao bạn ko thử xài VB6 đi xem sao
Cảm ơn bạn, tôi đã thử, và đang dùng VB6. Với exe thì Ok rồi, với dll lại vướng cái món regsvr32. Ngay từ make dll đã báo lỗi không thể đăng ký được. Đang tiếp tục ngâm cứu xem do phần mềm VB6 lỗi, hay do window.
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bạn, tôi đã thử, và đang dùng VB6. Với exe thì Ok rồi, với dll lại vướng cái món regsvr32. Ngay từ make dll đã báo lỗi không thể đăng ký được. Đang tiếp tục ngâm cứu xem do phần mềm VB6 lỗi, hay do window.
Bạn chụp hình lỗi úp xem

Còn cái màu đỏ đơn giản thôi mà ...nhiều cách
 
Upvote 0
Bạn chụp hình lỗi úp xem

Còn cái màu đỏ đơn giản thôi mà ...nhiều cách
Thế tốt quá. Rất mong được chỉ giáo. Đây là 2 hình: 1 hình lỗi lúc Makedll bằng Vb6 thì báo lỗi này, 1 hình lúc regsvr32 bằng cmd báo lỗi (thử bằng code cũng lỗi tương tự. Tôi dùng win8.1 64 bit. Dll chỉ có 1 câu lệnh duy nhất là 1 msgbox.
 

File đính kèm

  • ErrorMakeDll.jpg
    ErrorMakeDll.jpg
    15.8 KB · Đọc: 11
  • ErrorRegDll.jpg
    ErrorRegDll.jpg
    28.5 KB · Đọc: 12
  • Project1.rar
    2.7 KB · Đọc: 9
Upvote 0
Thế tốt quá. Rất mong được chỉ giáo. Đây là 2 hình: 1 hình lỗi lúc Makedll bằng Vb6 thì báo lỗi này, 1 hình lúc regsvr32 bằng cmd báo lỗi (thử bằng code cũng lỗi tương tự. Tôi dùng win8.1 64 bit. Dll chỉ có 1 câu lệnh duy nhất là 1 msgbox.

1/ Hình 1 lỗi do UAC windows của Bạn đang kéo ở mức cao ...kéo hết xuống khởi động lại máy ...Hay Chạy vb6.exe Run As adminitrator

2/ Hình 2 do bạn chạy cmd sai chưa đúng nên báo lỗi đó...

3/ Code cmd úp cho mình coi 1 tí được ko
 
Lần chỉnh sửa cuối:
Upvote 0
Code mình dùng là:
PHP:
Sub Main() 
Shell "regsvr32 Project1.dll", 1
End Sub
Trong đó file Dll đã được copy vào system32
 
Upvote 0
Code mình dùng là:
PHP:
Sub Main() 
Shell "regsvr32 Project1.dll", 1
End Sub
Trong đó file Dll đã được copy vào system32

1/ Cái câu 1 bài #9 có đúng ko vậy ..??!!

2/ Code đó Thiếu đường dẫn thì Phải ...nếu đầy đủ mà UAC đang ở mức cao cũng tịt à ...

3/ Nếu UAC đang kéo ở mức Cao xài hàm Shell đơn giản sẻ ko được

4/ Thử code sau chơi được hết ...thay vì xài cái mớ API rắc rối
Mã:
Public Function Register(ByVal sPath As String) As Boolean
    CreateObject("Shell.Application").ShellExecute "cmd.exe", "/c Regsvr32 /s " & sPath, 0, "Runas", True
End Function


Public Sub Main()
    Dim sPath As String
    sPath = "C:\Windows\System32\Project1.dll"
    Register(sPath)
End Sub
 
Upvote 0
1/ Cái câu 1 bài #9 có đúng ko vậy ..??!!

2/ Code đó Thiếu đường dẫn thì Phải ...nếu đầy đủ mà UAC đang ở mức cao cũng tịt à ...

3/ Nếu UAC đang kéo ở mức Cao xài hàm Shell đơn giản sẻ ko được

4/ Thử code sau chơi được hết ...thay vì xài cái mớ API rắc rối
Mã:
Public Function Register(ByVal sPath As String) As Boolean
    CreateObject("Shell.Application").ShellExecute "cmd.exe", "/c Regsvr32 /s " & sPath, 0, "Runas", True
End Function


Public Sub Main()
    Dim sPath As String
    sPath = "C:\Windows\System32\Project1.dll"
    Register(sPath)
End Sub
Thanks Kieumanh đã giúp đỡ. Tuy nhiên, vẫn không được.
1. Đã kéo UAC mức thấp nhất.
2. Make exe báo lỗi như hình 1 bài #8.
3. Chạy exe báo lỗi như hình sau.
Có lẽ có vấn đề gì đó về window.
 

File đính kèm

  • ErrorRunExe.jpg
    ErrorRunExe.jpg
    12.1 KB · Đọc: 25
Upvote 0
Thanks Kieumanh đã giúp đỡ. Tuy nhiên, vẫn không được.
1. Đã kéo UAC mức thấp nhất.
2. Make exe báo lỗi như hình 1 bài #8.
3. Chạy exe báo lỗi như hình sau.
Có lẽ có vấn đề gì đó về window.

Vấn đề là trong cái File *.exe đó code bạn viết như thế nào ...nếu được Bạn úp code lên mình coi cho
 
Upvote 0
Vấn đề là trong cái File *.exe đó code bạn viết như thế nào ...nếu được Bạn úp code lên mình coi cho
File exe tôi ném nguyên bộ code của bạn vào 1 class và make exe. Phải chăng có gì đó sai trong cách làm của tôi??
Mục đích cuối cùng của tôi là gọi dll từ excel (VBA). Tôi đang hiểu là phải đăng ký được dll thì mới gọi được sub trong dll. Nếu làm kiểu lòng vòng: tạo 1 exe và reference đến dll, code exe này gọi sub từ dll thì vẫn chạy bình thường. Có điều như thế phức tạp quá.
Có cách nào gọi sub từ dll mà không cần đăng ký không bạn?
Tôi đã thử reference dll từ VBE nhưng cũng không được.
 
Upvote 0
File exe tôi ném nguyên bộ code của bạn vào 1 class và make exe. Phải chăng có gì đó sai trong cách làm của tôi??
Mục đích cuối cùng của tôi là gọi dll từ excel (VBA). Tôi đang hiểu là phải đăng ký được dll thì mới gọi được sub trong dll. Nếu làm kiểu lòng vòng: tạo 1 exe và reference đến dll, code exe này gọi sub từ dll thì vẫn chạy bình thường. Có điều như thế phức tạp quá.
Có cách nào gọi sub từ dll mà không cần đăng ký không bạn?
Tôi đã thử reference dll từ VBE nhưng cũng không được.

1/ Bạn đang làm sai hay rắc rối chỗ màu đỏ ....

2/ Chỗ màu xanh nếu viết trên máy Bạn sau khi make sang *.dll là tự động nó đăng ký luôn (Áp dụng cho Setup VB6 - Không áp dụng cho Bản protable)

3/ Nếu Muốn ko phải đăng ký mà copy qua máy khác mình cũng đang nghiên cứu chưa rành lắm nên ko phát ngôn ẩu được ...Trên GPE ...Nguyễn duy Tuân rất giỏi vụ này Bạn có thể liên hệ

4/ Trên Internet viết Bằng C# rất nhiều Bạn có thể tham khảo thêm

5/ Bạn có thể chơi chiêu là nhét file *.dll vào file *.exe khi chạy file *.exe là nó giải nén file *.dll ra và đăng ký luôn vậy là từ Excel cứ vậy mà chạy

6/ Còn nhiều cách khác chơi nữa từ từ khám phá nha....
 
Lần chỉnh sửa cuối:
Upvote 0
2/ Chỗ màu xanh nếu viết trên máy Bạn sau khi make sang *.dll là tự động nó đăng ký luôn (Áp dụng cho Setup VB6 - Không áp dụng cho Bản protable)

5/ Bạn có thể chơi chiêu là nhét file *.dll vào file *.exe khi chạy file *.exe là nó giải nén file *.dll ra và đăng ký luôn vậy là từ Excel cứ vậy mà chạy
Tôi đang bị rắc rối ngay chỗ 2/ vì khi make dll đã báo lỗi là Error accessing the system regitry.

Tôi sẽ thử cách 5/ xem thế nào.

Có lẽ phải đầu tư một khóa học bài bản mới được.

Cảm ơn Kieumanh rất nhiều!
 
Upvote 0
Tôi đang bị rắc rối ngay chỗ 2/ vì khi make dll đã báo lỗi là Error accessing the system regitry.

Tôi sẽ thử cách 5/ xem thế nào.

Có lẽ phải đầu tư một khóa học bài bản mới được.

Cảm ơn Kieumanh rất nhiều!

Lỗi hình sau Bạn xem mục 1/ Bài #9 nha
 

File đính kèm

  • Loi Khi UAC Keo Len Muc Cao.jpg
    Loi Khi UAC Keo Len Muc Cao.jpg
    23.2 KB · Đọc: 22
Upvote 0
To vu_tuan_manh_linh
Lục lại bài này nghiên Cứu thêm một tí ...Không biết ý Bạn sao ...Nếu có hứng ta chơi tiếp

Trong File *.dll Mình code như sau:
Mã:
Public Sub Main()
    MsgBox "Test Sub ...OK"
End Sub


Public Function Msg(ByVal str1 As String, ByVal str2 As String) As String
    Msg = str1 & str2
    MsgBox "Test Ham ... OK"
End Function

Từ Excel Mình làm thủ tục sau keo nó chạy khai báo kiểu như hàm Windows API...

Mã:
Private Declare Sub Main Lib "Project1.dll" ()
Private Declare Function Msg Lib "Project1.dll" (ByVal x As String, ByVal y As String) As String
Public x As New test '' Test = ten ClassModule Trong File Project1.dll


Private Sub Main_Sub()
    Call x.Main
End Sub


Private Sub Main_Ham()
    Dim H As String, t As String
    H = "Kieu"
    t = "Manh"
    Call x.Msg(H, t)
End Sub
Nếu viết như vậy là nó chạy Ok ....Nhưng ý mình là làm sao ta bỏ cái biến Toàn cục x đi mà nó vẫn chạy ....???!!!
 
Lần chỉnh sửa cuối:
Upvote 0
Oh!! Cảm ơn Kieumanh! Đợt này tôi bận quá nên bỏ bẵng cả tháng không động đến. Refresh bộ não một chút, suốt ngày code căng quá!! Tôi đã đánh dấu bài này và sẽ sớm trở lại!!
 
Upvote 0
Web KT
Back
Top Bottom