Không đặt Password or Project Unviewable đươc? Tại sao? (1 người xem)

  • Thread starter Thread starter pmhoang
  • Ngày gửi Ngày gửi
Liên hệ QC

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

pmhoang

Thành viên thường trực
Tham gia
4/7/08
Bài viết
269
Được thích
83
Mình có làm 1 ví dụ về file tự động xóa Module và Code ThisWorkbook khi nhap password sai.
Khi nhập đúng password "pmhoang" thì sẽ sử dụng được bình thường
Khi nhập sai sẽ Delete các Module và Code ThisWorkbook --> File trở về 1 file excel bình thường không còn code nữa.

File hoạt động tốt, nhưng khi mình đặt Password cho VBA --> file không hoạt động bình thường nữa.

Tôi cũng đã thử (không đặt Password) mà dùng Hex Editer để Project Unviewable --> file cung không hoạt động bình thường.

Mong các bạn GPE giúp với. Làm sao để Project Unviewable mà file hoạt động tốt.
Xem file gởi kèm
(Mong thầy VoDa, và bạn tuyetbay đã có kinh nghiệm, giup mình với)
 

File đính kèm

Bạn bị lỗi dòng này! Bạn bỏ dòng này đi thì code sẽ chạy tốt trên Project Unviewable và PassVBA.
PHP:
  ThisWorkbook.VBProject.VBComponents("Module1").Export "Modu.bas"
Chúc thành công!
Thân.
 
Upvote 0
-Theo nguyên tắc, khi ProjectVBA đã bị khóa, ta không thể dùng các thao tác đối với code như: sao chép, thay đổi, thêm, bớt, xóa... Muốn code vẫn chạy bình thường như trường hợp trên, bạn cần phải mở khóa trước khi lệnh xóa code được thực thi.
1. Trường hợp khóa ProjectVBA bằng pass:
Bạn dùng đoạn code sau để mở:
Mã:
Sub MokhoaProject()
        UnprotectVBProject ActiveWorkbook, "pass"
End Sub
-----------------------------------------------------------------------
Sub UnprotectVBProject(WB As Workbook, ByVal Password As String)
Dim vbproj As Object
Set vbproj = WB.VBProject
Set Application.VBE.ActiveVBProject = vbproj
      SendKeys Password & "~~"
      Application.VBE.CommandBars(1).FindControl(ID:=2578, recursive:=True).Execute
End Sub
2. Trường hợp khóa ProjectVBA bằng Hex Editor:
Project khóa bằng một chương trình khác, VBA không thể can thiệp được. Mình chưa tìm ra cách. Mong các bạn cho giải pháp về vấn đề này.
 
Upvote 0
Bác Voda ơi, đây là code mở khóa cho VBA, vậy có thể viết được code khóa lại VBA với pass khác được ko?
Em xin mà! Please....
Thân.
 
Upvote 0
Bạn bị lỗi dòng này! Bạn bỏ dòng này đi thì code sẽ chạy tốt trên Project Unviewable và PassVBA.
PHP:
  ThisWorkbook.VBProject.VBComponents("Module1").Export "Modu.bas"
Chúc thành công!
Thân.
Dòng này là dòng điều kiện để có thể thực hiện được lệnh Delete Module, Vì nếu không thực hiện được dòng này thì Module cũng sẽ không thể Delete được.

Mình đã làm theo cach của bạn ở link sau: (Minh có hỏi trong link, Xin mở link)
http://www.giaiphapexcel.com/forum/showthread.php?t=8138
Nhưng không thể tự động chọn được Trust ascess to Visual Basic Project
 
Upvote 0
Nguyên văn bởi tuyetbay
Bác Voda ơi, đây là code mở khóa cho VBA, vậy có thể viết được code khóa lại VBA với pass khác được ko?
Code sau đây dùng để tạo pass hoặc thay đổi pass cho ProjectVBA. Bạn dùng thử:
Mã:
Option Explicit
Const BreakIt As String = "%{F11}%TE+{TAB}{RIGHT}%V{+}{TAB}"
-------------------------------------------------
Sub Change_VBA_PW()
Dim WB As Workbook
Dim Password As String
Set WB = ActiveWorkbook
Password = "123"
Call SetVBProjectPassword(WB, Password)
End Sub
-------------------------------------------------
Sub SetVBProjectPassword(WB As Workbook, ByVal Password As String)
Dim VBP
Dim OpenWin
Dim i As Integer
Set VBP = WB.VBProject
Application.ScreenUpdating = False
     For Each OpenWin In VBP.VBE.Windows
                If InStr(OpenWin.Caption, "(") > 0 Then OpenWin.Close
    Next OpenWin
          WB.Activate
         SendKeys BreakIt & Password & "{tab}" & Password & "~" & "%{F11}~", True
         WB.Activate
         SendKeys "%{F11}", True
Application.ScreenUpdating = True
End Sub
 
Upvote 0
Cảm ơn bác nhiều! Nhưng còn 1 vấn đề nhỏ chưa ổn là nó chứ chèn thêm 3 ô ngay con trỏ và ghi cả pass vào đó luôn!
Bác có thể khắc phục giúp luôn được không?
Cảm ơn bác 1 lần nữa!
Thanks.
 
Upvote 0
Bạn chạy code bình thường (đóng cửa sổ VBE) sẽ khắc phục được tình trạng này.
 
Upvote 0
Vẫn không như ý bác ơi!
Bác xem file nha.
Chỉ là ví dụ thôi.
Pass: abc
Thân.
 

File đính kèm

Upvote 0
Lạ nhỉ! Mình chạy file của bạn, thấy bình thường. Ô A1 đã có sẵn "abc" , không phải do code chạy ghi pass ra sheet. Bạn có thể nói rõ hơn được không?
(Bác nào rỗi thử dùm.)
 
Upvote 0
À, xin lỗi em quên giải thích!
Ô A1 thì em không nói, đó làm em tự để vào thôi.
Khi bác mở lên thì nó sẽ hiện thông báo đòi Pass đúng không?
Nhưng code ở lúc này là tự Change Pass mà! Vậy là nó đã chạy không chính xác.
Bác vào ThisWorkbook cho chạy luôn dòng đầu mà em đang Comment xem. Bác cứ lưu lại và thoát ra => Chạy lại.
Khi chạy thì sẽ không còn thấy hộp thông báo đòi pass nữa đâu và pass sẽ tự đổi luôn! (Đúng yêu cầu)
Nhưng ở Sheet1 sẽ có thêm dòng này: "E + 123 123"
Lúc này mới cần bác giúp! Thông cảm, tình hình của em là vậy! Bác có thể giúp không?
Thân.
 
Upvote 0
Mình có làm 1 ví dụ về file tự động xóa Module và Code ThisWorkbook khi nhap password sai.
Khi nhập đúng password "pmhoang" thì sẽ sử dụng được bình thường
Khi nhập sai sẽ Delete các Module và Code ThisWorkbook --> File trở về 1 file excel bình thường không còn code nữa.

File hoạt động tốt, nhưng khi mình đặt Password cho VBA --> file không hoạt động bình thường nữa.

Tôi cũng đã thử (không đặt Password) mà dùng Hex Editer để Project Unviewable --> file cung không hoạt động bình thường.

Mong các bạn GPE giúp với. Làm sao để Project Unviewable mà file hoạt động tốt.
Xem file gởi kèm
(Mong thầy VoDa, và bạn tuyetbay đã có kinh nghiệm, giup mình với)
Giã định rằng bạn thành công trong việc tạo code đúng như ý muốn... Nhưng tôi mở file bằng OpenOffice thì sao nhỉ?
Có ai có ý kiến về vấn đề này ko?
 
Upvote 0
Đối với OO thì chẳng ăn thua gì. Nhưng có 1 điều là code vẫn chạy được bình thường khi kích hoạt bằng tay. Vẫn có chức năng xóa Module khi nhập không đúng mật khẩu? Nhưng code trong ThisWorkbook thì nó lờ đi! Lúc đầu bạn chưa mở Low (Security) thì sẽ có 1 bảng thông báo như sau: Bạn thực hiện theo bảng thông báo vào đến mục Security thì chọn vào Macro Security rồi làm tiếp giống như Excel bình thường.
1225900601.jpg
Sau khi làm được thì mở lại file. Khi mở file thì ô thật bất ngờ, mình chẳng thấy trình bảo vệ đâu cả? Và nó vào thẳng luôn. Xem code (Tools -> Macros -> Organize Macros -> OpenOffice.org Basic -> Edit -> Chọn tab ở bên dưới sẽ thấy code. Nếu chưa thấy thì xem ở trên [khung hình vuông đó] chọn [Delete File GPE].Standard) thì nó có hình như vầy!
1225900096.jpg
1225903156.jpg
Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
Nguyên văn bởi tuyetbay
Nhưng ở Sheet1 sẽ có thêm dòng này: "E + 123 123"
-Nguyên nhân của tình trạng này là do việc kết hợp 2 đoạn code, sự phối hợp của những lần "%{F11}" chưa chuẩn nên khi chạy lệnh ghi pass, sheet 1 trong trạng thái kích hoạt. Hậu quả: pass ghi vào sheet.
-Cách khắc phục như sau: ( thêm 1 lần "%{F11}")
Mã:
Sub UnprotectVBProject(WB As Workbook, ByVal Password As String)
Dim vbproj As Object
Set vbproj = WB.VBProject
Set Application.VBE.ActiveVBProject = vbproj
      SendKeys Password & "~~"
      Application.VBE.CommandBars(1).FindControl(ID:=2578, recursive:=True).Execute
[B]SendKeys "%{F11}"[/B]
End Sub
 
Upvote 0
-Nguyên nhân của tình trạng này là do việc kết hợp 2 đoạn code, sự phối hợp của những lần "%{F11}" chưa chuẩn nên khi chạy lệnh ghi pass, sheet 1 trong trạng thái kích hoạt. Hậu quả: pass ghi vào sheet.
-Cách khắc phục như sau: ( thêm 1 lần "%{F11}")
Mã:
Sub UnprotectVBProject(WB As Workbook, ByVal Password As String)
Dim vbproj As Object
Set vbproj = WB.VBProject
Set Application.VBE.ActiveVBProject = vbproj
      SendKeys Password & "~~"
      Application.VBE.CommandBars(1).FindControl(ID:=2578, recursive:=True).Execute
[B]SendKeys "%{F11}"[/B]
End Sub
Mình thấy có một điều lạ như thế này, nếu như thêm vào SendKeys "%{F11}" thì
PHP:
Private Sub Workbook_Open()
  Call MokhoaProject
  Call Change_VBA_PW
End Sub
Run rất Ok không có để lại password trên sheet1, Nhưng nếu ta chỉ vào code ThisWorkbook chỉ Run Code sau:
PHP:
Private Sub Workbook_Open()
  ''''Call MokhoaProject
  Call Change_VBA_PW
End Sub
Thì Sheet1 vẫn hiện lên Password???

Po_Pikachu đã viết:
Sau khi làm được thì mở lại file. Khi mở file thì ô thật bất ngờ, mình chẳng thấy trình bảo vệ đâu cả?
Và nó vào thẳng luôn.
Mình chưa thử mở bằng OpenOffice. Nhưng nghe bạn nói, hình như khi mở bằng OpenOffice VBA không còn làm việc nữa hay sao? Nó không hiện lên bảng hỏi Password à? mà cũng không tự động xóa Modu? Nếu VBA có đặt Password cũng mở ra hết à? Mong bạn nói rõ tí. Mình sẽ tìm OpenOffice để test xem.
 
Lần chỉnh sửa cuối:
Upvote 0
Chẳng phải 2 dòng đầu mình đã nói rất kỹ rồi sao? Bạn không tin thì tải từ trang này về dùng sẽ biết ngay. Portable OpenOffice Đừng quá viễn vong về bảo mật Excel. Chỉ là chống người ngay thôi! Kẻ giang thì có chạy đằng trời bạn ơi! Nới thật nha! "Bill Gates" còn chịu thua huống chi mình. Thôi chúc 1 ngày vui vẻ. Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
Nới thật nha! "Bill Gates" còn chịu thua huống chi mình.

Không phải Bill chịu thua, mà Bill muốn rằng bộ Office của Bill là "học để làm, làm để chơi, chơi để học"", trong đó cái học được nhấn mạnh.
Chính vì vậy mới có việc Bill cho cả công cụ Record Maccro để chúng ta theo đó mà học tập.
Phương châm của Bill là : Nhấn nút, kéo và thả. Microsoft Access là một minh chứng.
Chứ Bill mà muốn bảo mật thì chúng ta chỉ có chết. Wins còn chẳng có mà dùng huống hồ Office.
Chúc vui
 
Upvote 0
Không phải Bill chịu thua, mà Bill muốn rằng bộ Office của Bill là "học để làm, làm để chơi, chơi để học"", trong đó cái học được nhấn mạnh.
Chính vì vậy mới có việc Bill cho cả công cụ Record Maccro để chúng ta theo đó mà học tập.
Phương châm của Bill là : Nhấn nút, kéo và thả. Microsoft Access là một minh chứng.
Chứ Bill mà muốn bảo mật thì chúng ta chỉ có chết. Wins còn chẳng có mà dùng huống hồ Office.
Chúc vui
Ôh... hô... đồng ý với tất cả, ngoại trừ:
Chứ Bill mà muốn bảo mật thì chúng ta chỉ có chết. Wins còn chẳng có mà dùng huống hồ Office.
Vì lý do đơn giãn, người tài còn có kẽ khác tài hơn... Bill làm gì có gan thách đố cả thế giới ---> Mà Bill cũng không có cái khả năng đó (cho dù Bill là thiên tài)
Ẹc... Ẹc...
---------
Quay trở lại vấn đề: Bảo mật trong Excel nếu nghiên cứu thì cùng lắm chỉ là thuật toán... Còn như nghiêm túc và hy vọng rằng chương trình mình viết ra từ Excel là tuyệt mật thì... He.. he.. Viển vong!
 
Lần chỉnh sửa cuối:
Upvote 0
Thầy VoDa ơi!
1. Em muốn copy 1 code từ sheet1 qua sheet2 thì làm thế nào?
2. Copy từ Module1 qua sheet3 thi có được không?
3. Có thể copy 1 Sub trong Code được không? Hay là copy là copy hết trang Code luôn?

Mong thầy giúp đở, vì vấn đề này thuộc trình độ cao quá, Em không viết Code làm việc đó được.
 
Upvote 0
Bạn copy làm gì? Các code ở mỗi nơi sẽ có cấu trúc hơi khác nhau đó. Nếu copy qua thì phải chỉnh sửa là cấu trúc nữa? Ví dụ: Trong Sheet thì code được bắt đầu bởi dòng: "Private Sub Worksheet_SelectionChange(ByVal Target As Range)" Hoặc tương tự như thế. Bạn có thể nói rõ ý định muốn làm gì ko? Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn copy làm gì?
Các code ở mỗi nơi sẽ có cấu trúc hơi khác nhau đó. Nếu copy qua thì phải chỉnh sửa là cấu trúc nữa?
Ví dụ: Trong Sheet thì code được bắt đầu bởi dòng:
"Private Sub Worksheet_SelectionChange(ByVal Target As Range)"
Hoặc tương tự như thế.
Bạn có thể nói rõ ý định muốn làm gì ko?
Thân.
VD. như file dang hoat động bình thường thì tôi sẽ không cho sheet1 có code nào cả, nhưng nếu file bị một vấn đề nào đó thì tôi sẽ cho copy 1 code (đã viết sẳn dành cho sheet1) vào sheet1. thế là nó hoạt động bình thường với sheet1 vì tôi viết code đó chỉ dành riêng cho sheet1 mà.
Hoặc tôi muốn sheet2 có code hoạt động giống sheet1 thì tôi copy code từ sheet1 qua sheet2 (khi tình thế phải yêu cầu như thế)
Thân chào.
 
Lần chỉnh sửa cuối:
Upvote 0
Nguyên văn bởi pmhoang
1. Em muốn copy 1 code từ sheet1 qua sheet2 thì làm thế nào?
2. Copy từ Module1 qua sheet3 thi có được không?
3. Có thể copy 1 Sub trong Code được không? Hay là copy là copy hết trang Code luôn?
1. Copy code từ sheet qua sheet:
Mã:
Set Vbc = ThisWorkbook.VBProject.VBComponents("sheet2").CodeModule
With ThisWorkbook.VBProject.VBComponents("sheet1").CodeModule
For i = 1 To .CountOfLines
       Vbc.InsertLines i, .Lines(i, 1)
Next i
End With
2.Copy code từ Module qua sheet:
Mã:
Set Vbc = ThisWorkbook.VBProject.VBComponents("sheet3").CodeModule
With ThisWorkbook.VBProject.VBComponents("Module1").CodeModule
For i = 1 To .CountOfLines
       Vbc.InsertLines i, .Lines(i, 1)
Next i
End With
3. Copy một Sub từ Module:
Mã:
Set Vbc = ThisWorkbook.VBProject.VBComponents("sheet2").CodeModule
With ThisWorkbook.VBProject.VBComponents("Module1").CodeModule
For i = 1 To .CountOfLines
       If .Lines(i, 1) = "Sub MySub()" Then
              Do Until .Lines(i, 1) = "End Sub"
                Vbc.InsertLines i, .Lines(i, 1)
                            i = i + 1
              Loop
              Vbc.InsertLines i, .Lines(i, 1)
              Exit Sub
      End If
Next i
End With
 
Upvote 0
Cam ơn thầy VoDa rất nhiều.
Code cua thầy Ok, Nhưng nếu dùng Option Explicit thì định nghĩa
PHP:
Dim VbC as ??? không biết
Thầy cho em xin code
1. Muốn xóa code của 1 sheet
2. Muốn xóa 1 sub của 1 sheet
3. Muốn xoa 1 sub cua 1 module


Suy nghĩ: Nhưng kiến thức của thầy viết em chỉ biết paste vào dùng thôi, còn chẳn hiểu gì cả. Thầy có thể cho e link de em tham khao va hoc nhưng phần code nay duoc ko? Thanks thầy.
 
Upvote 0
1. Vbc được khai báo là 1 thành phần của Project:
Mã:
            Dim Vbc As Object
2. Xóa code của 1 sheet:
Mã:
With ThisWorkbook.VBProject.VBComponents("sheet1").CodeModule
               .DeleteLines 1, .CountOfLines
End With
3. Xóa 1 sub của 1 sheet hoặc 1 module:
Mã:
With ThisWorkbook.VBProject.VBComponents("sheet1"[I]hoặc "Module1"[/I]).CodeModule 
       For i = 1 To .CountOfLines
             If .Lines(i, 1) = "Sub Mysub()" Then
                   Do Until .Lines(i, 1) = "End Sub"
                       .ReplaceLine i, ""
                            i = i + 1
                   Loop
                       .ReplaceLine i, ""
                       Exit Sub
             End If
       Next i
End With
4. Những kiến thức này do mình học trên diễn đàn, một phần lượm lặt trên mạng rồi chế biến, vận dụng nên không ở một link cụ thể nào cả. Bạn có thể dùng chức năng tìm kiếm trên diễn đàn hoặc Google. Nếu có điều gì cần mà không tìm thấy, post bài lên sẽ có nhiều người giúp.
 
Upvote 0
Mình đã làm được Unview VBA của file có sử dụng VBProject
(Bằng cách tạo ra error 40230) khi mơ VBE sẽ hiện thông báo nhấp khoảng 10 lần vào là mở file bình thường --> Không biết lỗi này có ảnh hưởng gì file không, nhưng hiện tại vẫn thấy code Run Ok. Bạn nào biết lỗi này giải thích giúp với.

Nhưng khi Run thì có 1 điều lạ như sau: (File UnView)
1. Delete Module 1, 2 thì Run OK, không có gì trở ngại.
2. Delete ThisWorkbook thì gặp lỗi và không delete được

Hai nút delete Thisworkbook cho ra 2 error khác nhau. Cái này chưa hiểu lắm??? Mong các bạn tham khảo file gốc và file sau khi đã UnView
3. Code Delete Code ThisWorkbook thi ấn F5 thì Run OK, nhưng khi ấn từng nút F8 lại bị lỗi, bạn nào biết giải thích giúp mình với. (Mong Thầy Voda ra tay)
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bác VODA rất nhiều. Nhân tiện, nhờ bác chỉ cho cách sao chép toàn bộ Module, Class Module, Form từ 1 VBProject này sang 1 VBProject khác bằng lệnh VBA. Trong đề tài Nhờ viết giúp sub Export - Import Module, bác minhtu đã nêu cách Export và Import, có thể áp dụng cho trường hợp này được. Tuy nhiên lại phải lưu vào đĩa cứng rồi mới Import được, chắc chắn sẽ không hay, tốn thời gian mà lại kém bảo mật (nếu trong các Sub có chứa thông tin nhạy cảm). Nhờ bác giúp giùm. Cảm ơn bác nhiều nhiều...
 
Upvote 0
-Theo nguyên tắc, khi ProjectVBA đã bị khóa, ta không thể dùng các thao tác đối với code như: sao chép, thay đổi, thêm, bớt, xóa... Muốn code vẫn chạy bình thường như trường hợp trên, bạn cần phải mở khóa trước khi lệnh xóa code được thực thi.
1. Trường hợp khóa ProjectVBA bằng pass:
Bạn dùng đoạn code sau để mở:
Mã:
Sub MokhoaProject()
        UnprotectVBProject ActiveWorkbook, "pass"
End Sub
-----------------------------------------------------------------------
Sub UnprotectVBProject(WB As Workbook, ByVal Password As String)
Dim vbproj As Object
Set vbproj = WB.VBProject
Set Application.VBE.ActiveVBProject = vbproj
      SendKeys Password & "~~"
      Application.VBE.CommandBars(1).FindControl(ID:=2578, recursive:=True).Execute
End Sub
2. Trường hợp khóa ProjectVBA bằng Hex Editor:
Project khóa bằng một chương trình khác, VBA không thể can thiệp được. Mình chưa tìm ra cách. Mong các bạn cho giải pháp về vấn đề này.

Cho em hỏi chút:
Để chạy được code MokhoaProject() thì phải checked ở "Trust access to Visual Basic Project".

Em cũng có tìm thấy trên GPE code để làm việc này (đánh đâu Trust...) như sau:
Mã:
Function IsVBATrusted() As Boolean
Dim VBC As Object
Application.DisplayAlerts = False
On Error Resume Next
Set VBC = ThisWorkbook.VBProject.VBComponents.Item(1)
On Error GoTo 0
Application.DisplayAlerts = True
IsVBATrusted = Not VBC Is Nothing
End Function

Mã:
Private Sub TrustVBAPr()
If Not IsVBATrusted() Then
    Application.SendKeys "%tmst"
    Application.SendKeys "%vs{Enter}"
End If
End Sub
Em muốn kết hợp các thủ tục này nhằm làm việc:
Trust access --> Mở khoá VBProject --> Xoá Module
Vấn đề xảy ra khi em kết hợp chúng theo các cách sau:

Cách 1:

+ Đặt chạy tự động khi mở file
Workbook_Open
TrustVBAPr()
MokhoaProject()
End Sub

+Tạo 1 nút ấn chạy code xoá Module
Sub1
Cac cau lenh xoa Module
End Sub

Vấn đề xảy ra khi áp dụng cách 1 (theo thứ tự như trên): không thực hiện được việc chuyển tình trạng sang "Trust access...". Mà khi đã không chuyển được thì không thể tiến hành thủ tục MokhoaProject() được --> Thất bại


Cách 2:
+ Chuyển tình trạng sang "Trust access..." khi mở file.
Workbook_Open
TrustVBAPr()
End Sub

+ Chèn trực tiếp code MokhoaProject khi ấn nút
Sub1
MokhoaProject()
Cac cau lenh xoa Module
End Sub

Với cách 2 này thì vấn đề xảy ra là có thể chuyển được tình trạng sang "Trust access..." nhưng thủ thục MokhoProject lại không thực hiện được --> Thất bại tập 2.

Như vậy với 2 cách đặt vị trí khác nhau của các bước thao tác tuần tự như trên thì cho ra 2 kết quả khác nhau nhưng đều thất bại trong mục đích cần làm. Vậy nhờ các bác giải thích giúp về 2 trường hợp trên cũng như cách khắc phục để có thể thực hiện được yêu cầu (đầu vào: 1 file Excel được đặt VBProject, đầu ra: tạo 1 nút ấn khi kích hoạt sẽ xoá toàn bộ Module)
 

File đính kèm

Upvote 0

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

Back
Top Bottom