Không thể kết hợp được các thủ tục riêng lẻ. (1 người xem)

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

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

AndOrNot

Thành viên chính thức
Tham gia
27/6/12
Bài viết
75
Được thích
3
Chào các bác, em có 1 vấn đề muốn hỏi:

Đầu vào:
1 File được đặt VBProtect

Đầu ra:
Sub1: Xóa toàn bộ Module khi kích hoạt nút ấn (button)

Hướng giải quyết: (1) --> (2) --> (3)
(1): Chuyển tự động sang chế độ "Trust access to Visual Basic Project"
(2): Mở khóa VBProject.
(3): Xóa các Module


Mã:
'(1): Chuyển tự động sang chế độ "Trust access to Visual Basic Project"

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

Sub TrustVBAPr()
If Not IsVBATrusted() Then
    Application.SendKeys "%tmst"
    Application.SendKeys "%vs{Enter}"
End If
End Sub


Mã:
'(2): Mở khóa VBProject.
Sub MKP()
        UVBP ActiveWorkbook, "abc"
End Sub
'UVBP = UnprotectVBProject

Sub UVBP(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
SendKeys "%{F11}"
End Sub




Tiếp đến là việc kết hợp 3 công đoạn trên như sau:

CÁCH 1:
Mã:
Workbook_Open
    TrustVBAPr()
    MKP()
End Sub

Sub1
    Các câu lệnh xóa Module
End Sub
Với việc kết hợp như CÁCH 1 này thì không thực hiện được việc đổi tình trạng sang "Trust access ..."



CÁCH 2:
Mã:
Workbook_Open
    TrustVBAPr()
End Sub

Sub1
    MKP()
    Cac cau lenh xoa Module
End Sub
Với việc kết hợp như CÁCH 1 này thì thực hiện được việc đổi tình trạng sang "Trust access ..." NHƯNG không mở pass VBProject được.


KẾT LUẬN:

- Vậy với cả 2 cách trên thứ tự đặt thủ tục không thay đổi, chỉ thay đổi về vị trí đặt các thủ tục thì cho ra kết quả khác nhau.

- Với cả 2 cách trên đều không thực hiện được mục đích yêu cầu đã đề cập là "Xóa toàn bộ Module khi kích hoạt nút ấn (button) trong file có đặt VBProtect" --> Nhờ hướng dẫn cách khắc phục

Nhờ các cao thủ chỉ giáo giúp
 

File đính kèm

Chào các bác, em có 1 vấn đề muốn hỏi:

Đầu vào:
1 File được đặt VBProtect

Đầu ra:
Sub1: Xóa toàn bộ Module khi kích hoạt nút ấn (button)

Hướng giải quyết: (1) --> (2) --> (3)
(1): Chuyển tự động sang chế độ "Trust access to Visual Basic Project"
(2): Mở khóa VBProject.
(3): Xóa các Module


Mã:
'(1): Chuyển tự động sang chế độ "Trust access to Visual Basic Project"

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

Sub TrustVBAPr()
If Not IsVBATrusted() Then
    Application.SendKeys "%tmst"
    Application.SendKeys "%vs{Enter}"
End If
End Sub


Mã:
'(2): Mở khóa VBProject.
Sub MKP()
        UVBP ActiveWorkbook, "abc"
End Sub
'UVBP = UnprotectVBProject

Sub UVBP(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
SendKeys "%{F11}"
End Sub




Tiếp đến là việc kết hợp 3 công đoạn trên như sau:

CÁCH 1:
Mã:
Workbook_Open
    TrustVBAPr()
    MKP()
End Sub

Sub1
    Các câu lệnh xóa Module
End Sub
Với việc kết hợp như CÁCH 1 này thì không thực hiện được việc đổi tình trạng sang "Trust access ..."



CÁCH 2:
Mã:
Workbook_Open
    TrustVBAPr()
End Sub

Sub1
    MKP()
    Cac cau lenh xoa Module
End Sub
Với việc kết hợp như CÁCH 1 này thì thực hiện được việc đổi tình trạng sang "Trust access ..." NHƯNG không mở pass VBProject được.


KẾT LUẬN:

- Vậy với cả 2 cách trên thứ tự đặt thủ tục không thay đổi, chỉ thay đổi về vị trí đặt các thủ tục thì cho ra kết quả khác nhau.

- Với cả 2 cách trên đều không thực hiện được mục đích yêu cầu đã đề cập là "Xóa toàn bộ Module khi kích hoạt nút ấn (button) trong file có đặt VBProtect" --> Nhờ hướng dẫn cách khắc phục

Nhờ các cao thủ chỉ giáo giúp

Như đã hứa với bạn tôi gửi tập tin để bạn tham khảo. Tôi gửi lên GPE bởi có thể ai đó trong tương lai sẽ quan tâm.

Thú thực là tôi không "kết" thằng SendKeys lắm. Bản thân tôi rất thích trò "điều khiển từ xa" nhưng chỉ khi tôi làm chủ được đối tượng cần điều khiển. Với SendKeys nhiều khi may rủi. Có những người hài lòng nhưng cũng code đó ở người khác không cho kết quả mong đợi.

Ngay như cái SendKeys dùng cho "Trust" bạn nói là chạy tốt nhưng ở máy tôi (Excel 2007 + WinXP + SP2) thì cửa sổ "Trust Center" không được đóng tự động.
-----------
Về Trust (cả disable macro ... cũng cùng chỗ) thì có thể giải quyết thông qua Registry.
Về password thì tôi nghĩ phải có hàm gì đó, Macro Function để giải quyết. Nhưng nếu nói về chúng thì chắc đã có nhiểu người tìm hiểu. Tôi đi con đường khác, cũng chả cần mật khẩu.

Nếu chỉ dùng hàm Hook không thôi thì như bạn đã trao đổi với tôi: code không xóa Module vì có lỗi

Nếu code tôi gửi ở "nơi khác" không cho kết quả mong đợi thì tôi cũng kết thúc ở đây.

Nhấn Button thì Module1 sẽ được xóa.


 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0

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

Back
Top Bottom