Có thể dùng vba để xóa vba đc không?

Liên hệ QC

quykiemsau

Thành viên chính thức
Tham gia
4/8/10
Bài viết
66
Được thích
0
Em chào các anh chị!
Có code nào có thể test 1 điều kiện nào đó để xóa toàn bộ vba trong file Excel được không ạ?
Cụ thể là
ô A1! của sheet 1! em đặt điều kiện hoặc =0 hoặc =1.
Khi Open file:
ô a1=1 thì file chạy bình thường.
Nếu A1=0 thì toàn bộ vba trong file bị xóa sạch.
Có được không ạ?
 
Vấn đề Unprotect Password VBA tôi đã nghiên cứu từ rất lâu rồi mà dường như.. không có cách
Tham khảo các trang web nước ngoài, người ta cũng chỉ có thể dùng phương pháp SendKeys (kiểu như "dạy" cho máy tính cách ta làm bằng tay bằng cách bấm các tổ hợp phím nào đó)
Tuy nhiên, phương pháp dùng SendKeys đôi lúc không ổn định, khi được khi không nên tôi chưa giới thiệu
Nghe đồn rằng có cách dùng hàm API để truy đến các cửa sổ lập trình VBA gì gì đó nhưng tiếc là tôi lại không rành ---> E rằng làm được món này chỉ có thể là siwtom ---> Chở xem
------------------------------------------

Cái này để mình bàn trong 1 dịp khác nha anh (vi phạm nội quy đấy)
Lại bị gọi lên bảng.
ndu nói thế là không đúng. Tự tôi không nghĩ ra được code vì cái khoản này nó thuộc "lập trình cao
cấp". Nhưng khi lập trình trong Delphi thì tôi cũng gặp và hiểu được cơ cấu của nó là như thế nào.
Và khi tôi đọc qua code có trong Excel.xls của quanghai gửi thì 99,99% tôi chắc chắn là nó sử dụng
"kỹ thuật lập trình cao cấp" mà tôi sẽ giải thích dưới đây.
Nếu các bạn có chút thời gian thì tôi sẽ giải thích nôm na nó như thế nào. Nôm na vì tôi sẽ dùng
ngôn ngữ thường ngày để giải thích chứ dùng ngôn ngữ "chuyên ngành" thì e rằng người không lập
trình khó hiểu.
---------------
1. Trước tiên nói về cái cửa sổ mà Excel bắt ta phải nhập mật khẩu. Như trong code Excel.xls "đã
chỉ rõ" thì Excel gọi hàm system là DialogBoxParam để hiển thị cửa sổ hộp thoại. Tất nhiên Excel
phải tạo một cửa sổ hộp thoại (template) đặt trong resource và truyền thông tin về nó cho hàm
DialogBoxParam. Hàm DialogBoxParam sẽ tạo (trên cơ sở template) hộp thoại và hiển thị. Excel
cũng phải lập một procedure cho cửa sổ (DialogProc) mà DialogBoxParam tạo và hiển thị. Để làm
gì? Để nhận các thông điệp. Vd. Windows sẽ gửi thông điệp WM_INITDIALOG khi cửa sổ được
khởi tạo. Ta có thể khi nhận được thông điệp này (tức ở thời điểm "chào buổi sáng") làm một số
việc thiết lập ban đầu, tạo thêm controls - nó giống như ta thiết lập một số cái trong
UserForm_Initialize ấy mà. Windows cũng gửi thông điệp khi user nhấn nút nào đấy (chỉ rõ là nút
nào) để DialogProc xử lý. Vd. nếu nút nhấn là Cancel thì code DialogProc "dọn đồ ra về" còn nếu là
OK thì kiểm tra dữ liệu nhập rồi cũng "dọn đồ" - tức hủy hộp thoại. Tất nhiên Windows còn gửi nhiều
thông điệp khác, nếu DialogProc "quan tâm" thì xử lý.
Khi người lập trình muốn hủy hộp thoại (user chọn Cancel?, chọn OK? ...) thì code của DialogProc
phải gọi EndDialog để system biết và hủy hộp thoại. Khi gọi EndDialog thì phải truyền kết quả trả
về dưới dạng thông số của EndDialog. Hàm DialogBoxParam cũng sẽ trả vể kết quả này. Từ cơ
cấu như trên thì người lập trình có thể viết code đại loại như sau:
a - Gọi hàm DialogBoxParam để tạo cửa sổ nhập mật khẩu - template sẽ gồm textbox (class "Edit"
của Windows) để nhập mật khẩu, nút OK và Cancel. Trong DialogProc nếu nhận được thông điệp
do Windows gửi nói là user nhấn Cancel thì gọi EndDialog(hDialog, 0) - hDialog là "handle to
dialog box", 0 là giá trị trả về, cũng là giá trị mà hàm DialogBoxParam trả về. Nếu thông điệp nói là
user nhấn OK thì: kiểm tra mật khẩu có đúng không, nếu đúng thì EndDialod(hDialog, 1) còn nếu sai
thì EndDialog(hDialog, 0)
Cũng cần nói rõ là khi gọi hàm DialogBoxParam và cửa sổ hiển thị thì hàm DialogBoxParam chỉ
trở về, và mọi code sau dòng gọi hàm DialogBoxParam được thực hiện, khi mà hộp thoại được
đóng (do code trong DialogProc gọi EndDialog). Trong suốt thời gian hộp thoại hiển thị thì chỉ có
code trong DialogProc được thực hiện mà thôi (kiểu như ShowModal ấy mà - cho tới khi cửa sổ
được đóng thì mọi code sau ShowModal "phải chờ")
b - Ở dòng code sau dòng gọi hàm DialogBoxParam thì người lập trình kiểm tra giá trị trả về bởi
hàm DialogBoxParam. Nếu là 0 (tức user chọn Cancel hoặc chọn OK nhưng mật khẩu sai) thì:
Mã:
MsgBox "Này ông tướng, phải nhập mật khẩu đúng mới được chiêm ngưỡng code đấy nhé"
Còn nếu là 1 (user chọn OK và nhập đúng mật khẩu) thì mở code cho user xem.
-----------------
Như trên đã thấy thì bình thường người lập trình sẽ làm trình tự như trên và Excel cũng làm như thế.
Bây giờ ta hình dung là ta viết code như sau:
Ta viết hàm DialogBoxParam "nhái" - vd. hàm MyDialogBoxParam, và đánh tráo nó với hàm
DialogBoxParam của system. Tất nhiên hàm "nhái" này phải có cấu trúc thông số y hệt hàm của
system. Lúc này nếu có "ai đó" gọi hàm DialogBoxParam thì Windows sẽ gọi hàm
MyDialogBoxParam. Hàm của ta nếu kiểm tra thấy template = 4070 thì chả hiển thị hộp thoại nào
cả mà hàm trả về luôn giá trị 1. Trong trường hợp ngược lại thì tráo lại thành hàm DialogBoxParam
của system và gọi nó - vì trong cùng thời điểm có thể những phần mềm khác trong system cũng gọi
hàm DialogBoxParam, ta phải trả lại "hiện trạng" cũ để các phần mềm đó hiển thị hộp thoại của
mình. Cách làm thế nào?
---------------
Tất cả các hàm của system đều nằm trong các thư viện động DLL. Mỗi thư viện như thế có nhiều
section, có header. Riêng về các function trong thư viện thì: Khi DLL được load vào RAM thì nó
nằm ở một chỗ nào đó, địa chỉ nào đó trong RAM. Lúc này mỗi function cũng nằm ở một địa chỉ
nào đó trong RAM. DLL là "dùng chung" cho mọi process, tức nếu A, B, C cùng "gọi" bla.dll thì
bla.dll sẽ được ánh xạ vào mỗi "không gian địa chỉ" của mỗi process A, B, C. "Địa chỉ" của mỗi
function có trong DLL sẽ được ghi trong RAM ở "đâu đó" trong phần header, mỗi function có 1
trường để ghi địa chỉ của nó. Ta xét vd. hàm DialogBoxParam. Giả sử "ở đấy ở đấy" có giá trị là
"123456789" thì bình thường khi process gọi hàm DialogBoxParam thì system sẽ tới "chỗ ấy chỗ
ấy" để đọc ra địa chỉ của hàm DialogBoxParam - sẽ đọc được "123456789". Lúc này sẽ có 1
bước nhẩy tới địa chỉ "123456789" và thực hiện code của DialogBoxParam vì code của
DialogBoxParam nằm ở địa chỉ ấy mà.
Bây giờ ta hãy tưởng tượng là ta viết hàm MyDialogBoxParam (hàm nhái) mà nó nằm ở địa chỉ
"abc...xyz" (đọc ra bằng AddressOf). Code sau đó nhẩy tới "chỗ ấy chỗ ấy" và ghi giá trị "abc...xyz"
đè lên "123456789". Từ lúc này mỗi khi process nào đó gọi DialogBoxParam thì system nhẩy tới
"chỗ ấy chỗ ấy" và đọc ra địa chỉ "abc...xyz" (chứ không phải "123456789" nữa) và nhẩy tới địa chỉ
"abc...xyz" để thực hiện code. Chỉ có điều ở "abc...xyz" là code của hàm nhái MyDialogBoxParam
chứ không phải của hàm DialogBoxParam.
Tất nhiên trước khi đánh tráo địa chỉ của hàm được ghi ở "đâu đó" (trong header của DLL) trong
RAM thì ta phải ghi nhớ nó để sau đó trả về hiện trạng cũ - lại tới "chỗ ấy chỗ ấy" và ghi vào
"123456789" đè lên "abc...xyz"
Những kỹ thuật: xin phép thao tác trong RAM ở vùng nào đó, ghi trong RAM, đánh tráo địa chỉ hàm
... là những kỹ thuật cao cấp. Người có trình độ trung bình cũng có thể thao tác trong RAM nhưng để
đánh tráo địa chỉ thì phải thông hiểu nhiều hơn mới biết cách làm - thay đổi những bai nào trong
RAM, ở đâu ...
----------------
Trở lại code của quanghai gửi nếu tôi không lầm thì hiện thời code "chưa làm gì cả". Vì khi hiển thị
FrmHookMain và nhấn nút "RemoveVBAPassword" thì code đánh tráo địa chỉ của hàm
DialogBoxParam (thay vì hướng tới DialogBoxParam thì hướng tới hàm nhái MyDialogBoxParam)
nhưng ta không click được vào VBAProject để xem code. Phải đóng FrmHookMain mới click vào
được. Nhưng khi đóng FrmHookMain thì địa chỉ cũ lại được trả lại (đánh tráo lại) trong
UserForm_Terminate nên lúc này có nhấn VBAProject thì hàm DialogBoxParam lại được thực hiện
chứ không phải hàm nhái nên ta lại thấy hộp thoại bắt nhập mật khẩu hiện ra.
Vậy trong tập tin đính kèm tôi làm như sau:
a - Trên Sheet có 2 nút: "Đánh tráo" và "Trả lại"
b - Trước tiên ta nhấn "Đánh tráo", code của nó là:
Mã:
If Hook Then
        MsgBox "VBA Password is Removed!", vbInformation, "Excel Tool"
End If
Từ lúc này mọi cuộc gọi hàm DialogBoxParam thì thực chất là gọi hàm nhái MyDialogBoxParam
mà nó sẽ trả về 1, tức Excel sau đó kiểm tra thấy 1 được trả về thì tưởng rằng user nhập đúng mật
khẩu và nhấn OK - y như cái procedure của hộp thoại mà nó thiết kế trả về khi user nhập đúng mật
khẩu và nhấn OK.
c - Ta nhấn VBAProject để xem và copy code
d - Ta nhấn "Trả lại" để thực hiện code RecoverBytes. Nó sẽ trả lại (trong RAM) địa chỉ cũ của hàm
DialogBoxParam.
-----------------
Nói đến test thì tôi lại là vua lười.
Vậy ndu hãy test và thông báo kết quả thế nào
 

File đính kèm

  • Remove VBA password.xls
    44 KB · Đọc: 889
Lần chỉnh sửa cuối:
Upvote 0
Nói đến test thì tôi lại là vua lười.
Vậy ndu hãy test và thông báo kết quả thế nào

Trời ơi! Lợi hại quá, password là cái quỷ gì nó cũng remove tuốt
Ghê gớm hơn nữa là:
- Tôi tạo 1 file khác có pass VBA
- Tiếp theo mở file của siwtom lên đồng thời với file mới vừa tạo rồi nhấn nút Đánh tráo
- Kết quả nhận được là: "cánh cửa" đã được mở cho cả 2 file luôn
- Thử nghiệm tiếp trên 3, 4 file có password, cứ chạy code của siwtom là xem như "mời vào nhà!"
-------------------
Anh đúng là hacker siêu hạng
 
Upvote 0
Trời ơi! Lợi hại quá, password là cái quỷ gì nó cũng remove tuốt
Ghê gớm hơn nữa là:
- Tôi tạo 1 file khác có pass VBA
- Tiếp theo mở file của siwtom lên đồng thời với file mới vừa tạo rồi nhấn nút Đánh tráo
- Kết quả nhận được là: "cánh cửa" đã được mở cho cả 2 file luôn
- Thử nghiệm tiếp trên 3, 4 file có password, cứ chạy code của siwtom là xem như "mời vào nhà!"
-------------------
Anh đúng là hacker siêu hạng

Không phải, hiểu lầm nhau rồi.
Code là của tác giả tập tin mà quanghai gửi lên. Tất nhiên tôi cũng từng viết trong Delphi để đánh tráo hàm nhưng cái code này đã có sẵn nên chả cần viết gì cả.
Chỉ có điều tôi biết về "kỹ thuật đánh tráo" nên chỉ đọc lướt qua code của tập tin do quanghai gửi lên thì tôi nhận ra ngay là nó đã làm thế nào. Do hiểu được nên tôi sửa chút để không hiển thị Form nào cả mà "đánh tráo" lúc nào" và "Trả về" thế nào. Chỉ thế thôi.

Mà code không Remove password. Nói ngắn gọn thì thế này:
Excel gọi hàm của system để hiển thị hộp thoại. Nếu user nhập đúng password và nhấn OK thì hàm trả về 1. Nếu nhấn Cancel hoặc nhập sai password thì trả về 0. Khi hộp thoại đóng thì Excel kiểm tra kết quả trả về của hàm vừa gọi. Nếu là 1 thì nó "cho là" user nhập đúng password và nhấn OK. Vậy nó mở cho user xem code. Không phải xóa password vì lần sau mở ra thì lại phải đánh tráo mới xem được.
Bây giờ ta đánh tráo sang là gọi hàm "nhái" của ta. Hàm nhái chả hiển thị cóc khô gì mà về luôn cùng với giá trị 1. Và Excel kiểm tra giá trị trả về thì thấy là 1 nên "tưởng" là user nhập đúng password và nhấn OK

Công to là của quanghai sưu tầm.
 
Lần chỉnh sửa cuối:
Upvote 0
Phát hiện thêm 1 chuyện nữa: Sau khi gọi hết tất cả các Add-Ins của MS lên (đương nhiên mấy Add-Ins này đều có Pass). Sau đó chạy code của siwtom thì toàn bộ các Add-Ins đều "mở cửa" ---> Xem code thoải mái
Quá sốc!_)()(-
----------------
Ẹc... Ẹc... Từ nay thì mấy "chú tào lao" đừng mong mà Pass VBA code gì nữa nhé ---> Nếu siêu thì cứ tạo DLL đi, còn không thôi (có đặt pass của uổng công)
//..,,
 
Upvote 0
Phát hiện thêm 1 chuyện nữa: Sau khi gọi hết tất cả các Add-Ins của MS lên (đương nhiên mấy Add-Ins này đều có Pass). Sau đó chạy code của siwtom thì toàn bộ các Add-Ins đều "mở cửa" ---> Xem code thoải mái
Quá sốc!_)()(-
----------------
Ẹc... Ẹc... Từ nay thì mấy "chú tào lao" đừng mong mà Pass VBA code gì nữa nhé ---> Nếu siêu thì cứ tạo DLL đi, còn không thôi (có đặt pass của uổng công)
//..,,

Nếu sốc thật thì cũng dể hiểu thôi. Không phải vô cớ mà chuyện đánh tráo hàm này là một trong những món "đặc sản" của hacker và rootkit. Họ là những người rất am tường về system, hiểu cơ cấu và cách thức hoạt động của system nên họ có thể đột nhập vào system để làm mưa làm gió.
Ngay như đột nhập vào một căn nhà có hệ thống cảnh báo chẳng hạn. Người thường thì không biết cách nhưng người am tường thì biết vào đường nào. Cửa chính, phụ? Qua đường hệ thống thông gió? Chỗ nào là điểm yếu của căn nhà? Vào rồi thì do am tường về các hệ thống cảnh báo nên họ biết phải "tắt" cái gì, tắt ở đâu v...v

Còn về "thuật toán" thì đơn giản thôi.
Giả dụ ta có ông A (system Windows) trực. Khi khách hàng gọi điện tới đặt ông sửa ống nước chẳng hạn (process gọi hàm Windows - SuaOngNuoc) thì ông A "đi" tới bảng ghi số điện thoại và đọc số của ông sửa ống nước (mỗi ngày có 1 ông khác với số khác - tương đương với mỗi lần DLL được load vào RAM thì nó nằm ở một địa chỉ khác), sau đó gọi cho ông thợ (nhẩy tới địa chỉ của hàm) và "kích hoạt", "cử" ông thợ đi làm (thực hiện code ở địa chỉ vừa nhẩy tới).
Thế bây giờ nếu ta "lén" sửa lại số điện thoại được ghi trên bảng và thay vào đó ghi số của nhân viên của ta thì sao? Thì ông A sẽ gọi cho nhân viên của ta và "cử" nhân viên củ ta đi làm, thế thôi.
 
Upvote 0
Phát hiện thêm 1 chuyện nữa: Sau khi gọi hết tất cả các Add-Ins của MS lên (đương nhiên mấy Add-Ins này đều có Pass). Sau đó chạy code của siwtom thì toàn bộ các Add-Ins đều "mở cửa" ---> Xem code thoải mái
Quá sốc!_)()(-
----------------
Ẹc... Ẹc... Từ nay thì mấy "chú tào lao" đừng mong mà Pass VBA code gì nữa nhé ---> Nếu siêu thì cứ tạo DLL đi, còn không thôi (có đặt pass của uổng công)
//..,,

Với cái code này mở nhấp nháy sau cú click (chắc lẹ hơn 3s) mà lại coi tất cả các file đang mở, kể cả addins, ("thấy gúm quá") vậy có thủ tục nào mở file excel bị khóa không? (mà nhanh như vậy càng tốt).

Sẳn đã VBA làm rồi thì làm luôn cái File chắc cũng hỏng sao đâu hen!

Xin cám ơn trước.
 
Lần chỉnh sửa cuối:
Upvote 0
...........................
b - Trước tiên ta nhấn "Đánh tráo", code của nó là:
Mã:
If Hook Then
        MsgBox "VBA Password is Removed!", vbInformation, "Excel Tool"
End If

.............................

Mình không hiểu code này gọi hàm (thủ tục) kiểu gì? Đâu thấy call Hook, chỉ là một thông báo!
(Giống kiểu phát ngôn gây "sốc" hoặc là thần chú gì đó?)
Bạn nào giải thích giùm!
 
Upvote 0
Mình không hiểu code này gọi hàm (thủ tục) kiểu gì? Đâu thấy call Hook, chỉ là một thông báo!
(Giống kiểu phát ngôn gây "sốc" hoặc là thần chú gì đó?)
Bạn nào giải thích giùm!

Hàm Hook này là dạng boolean luôn trả về TRUE khi hoàn tất thủ tục, mở đầu Hook = False và kết thúc hàm là Hook = True

Theo em nghĩ, Khi ta dùng IF HOOK THEN tức là ta đã "gián tiếp" gọi hàm đó, dĩ nhiên nó phải kiểm tra HOOK và từ đó HOOK chạy từ False rồi thực hiện thủ tục, sau cùng trả về TRUE.


Mã:
Public Function Hook() As Boolean
    Dim TmpBytes(0 To 5) As Byte
    Dim p As Long
    Dim OriginProtect As Long
    
    [COLOR=#ff0000][B]Hook = False[/B][/COLOR]
    
'........................................
            [B][COLOR=#0000cd]Hook = True[/COLOR][/B]
        End If
    End If
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Hàm Hook này là dạng boolean luôn trả về TRUE khi hoàn tất thủ tục, mở đầu Hook = False và kết thúc hàm là Hook = True

Theo em nghĩ, Khi ta dùng IF HOOK THEN tức là ta đã "gián tiếp" gọi hàm đó, dĩ nhiên nó phải kiểm tra HOOK và từ đó HOOK chạy từ False rồi thực hiện thủ tục, sau cùng trả về TRUE.


Mã:
Public Function Hook() As Boolean
    Dim TmpBytes(0 To 5) As Byte
    Dim p As Long
    Dim OriginProtect As Long
    
    [COLOR=#ff0000][B]Hook = False[/B][/COLOR]
    
'........................................
            [B][COLOR=#0000cd]Hook = True[/COLOR][/B]
        End If
    End If
End Function

Hay nhỉ?
Mình mở một file mới và chạy đoạn code

Sub test()
Dim Hook As Boolean
MsgBox Hook
End Sub

Kết quả luôn là False. Tức là Hook đã có giá trị rồi mà hàm Hook vẫn làm việc?
 
Upvote 0
Mình không hiểu code này gọi hàm (thủ tục) kiểu gì? Đâu thấy call Hook, chỉ là một thông báo!
(Giống kiểu phát ngôn gây "sốc" hoặc là thần chú gì đó?)
Bạn nào giải thích giùm!
Tầm trình độ của chúng ta thường hay viết khác:
- Viết code cho Sub Hook (chứ không phải Function)
- Dùng 1 biến public chk kiểu Boolean để kiểm tra xem Sub Hook đã chạy hoàn tất chưa
- Xong, viết 1 Sub khác cho gọi sub Hook, đồng thơi kiểm tra biến chk, nếu chk=TRUE thì sẽ làm việc khác
Mã:
Public chk as Boolean
Sub Hook()
  If.... gì gì đo then  
     chk = True
  End If
End Sub
Sub Main
  Call Hook
  If chk then
    'Làm việc khac
  End If
End Sub
Tuy nhiên, các nhà lập trình chuyên nghiệp thường hay viết kiểu khác: Thay đổi Sub Hook thành Function Hook và Function này trả về giá trị kiểu Boolean luôn.
Vậy nếu code trong Hook hoàn tất thì hàm trả về kết quả = TRUE và ngược lại
Cách này có cái tiện là khỏi cần phải qua biến tạm dạng Public
-------------------
Hay nhỉ?
Mình mở một file mới và chạy đoạn code

Sub test()
Dim Hook As Boolean
MsgBox Hook
End Sub

Kết quả luôn là False. Tức là Hook đã có giá trị rồi mà hàm Hook vẫn làm việc?
Anh viết vậy không đúng ---> Biến Hook của anh hóa ra trùng với tên hàm à
Lý ra chỉ vầy là được
Mã:
Sub test()
MsgBox Hook
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Hay nhỉ?
Mình mở một file mới và chạy đoạn code

Sub test()
Dim Hook As Boolean
MsgBox Hook
End Sub

Kết quả luôn là False. Tức là Hook đã có giá trị rồi mà hàm Hook vẫn làm việc?

Với HOOK là một hàm trả về giá trị BOOLEAN, còn một đằng khai báo biến HOOK là một BOOLEAN, 2 trường hợp này hoàn toàn khác nhau.

Với hàm HOOK nó có tính Public, còn trong cái SUB của anh, biến HOOK chỉ là chạy "nội tại" mà đã là "nội tại" thì nó sẽ chạy trước, public nó chạy sau nếu nội tại không thỏa, tức chạy hết SUB nó sẽ hết tác dụng khi END SUB. Mặt khác, với HOOK trong SUB của anh nó chưa định giá trị TRUE hoặc FALSE cho nó vì vậy mặc định của biến này luôn là FALSE.

Thí nghiệm như vầy, cũng trên file đó, anh đặt Dim Hook As Boolean ở trên cùng rồi chạy thủ tục dưới đây như sau:

Mã:
[COLOR=#ff0000][B]Dim Hook As Boolean[/B][/COLOR]

'-----------------------------
Sub test()
    If Hook Then
        MsgBox "VBA Password is Removed!", vbInformation, "Excel Tool"
    End If
End Sub

Cho chạy Sub test bảo đảm với anh nó không thông báo gì cả!

Từ thí nghiệm này cho thấy, khi chạy thủ tục, nếu trùng tên Hàm/Sub nó sẽ thông báo lỗi, nếu Hàm trùng tên Biến, nó sẽ xét theo Biến.
 
Lần chỉnh sửa cuối:
Upvote 0
Với cái code này mở nhấp nháy sau cú click (chắc lẹ hơn 3s) mà lại coi tất cả các file đang mở, kể cả addins, ("thấy gúm quá") vậy có thủ tục nào mở file excel bị khóa không? (mà nhanh như vậy càng tốt).

Sẳn đã VBA làm rồi thì làm luôn cái File chắc cũng hỏng sao đâu hen!

Xin cám ơn trước.

Thât Bâ't ngo,Tks Bác siwtom nhiêù nhé!
Đúng là khôg có gì là không thê?!

Em nghi bài của Bác Nghĩa chăc là không thê thuc hiên = code dc rôì... vì de chay dc code thì file do' fai ActiveWindow thì code moi hoat dong dươc chú...
Theo em hieu la file chưa nhâpj pás Open thj ActiveWindow vân là Flase thi code chua thêr hoat dông dc dúng không ạ!
 
Upvote 0
Thât Bâ't ngo,Tks Bác siwtom nhiêù nhé!
Đúng là khôg có gì là không thê?!

Em nghi bài của Bác Nghĩa chăc là không thê thuc hiên = code dc rôì... vì de chay dc code thì file do' fai ActiveWindow thì code moi hoat dong dươc chú...
Theo em hieu la file chưa nhâpj pás Open thj ActiveWindow vân là Flase thi code chua thêr hoat dông dc dúng không ạ!

Tôi không chắc chắn lắm, nhưng nếu chọn mở khóa một File Excel nào đó thì sẽ hiện lên một Browser và ta chỉ chọn file Excel cần mở khóa, thông qua đó chạy thủ tục mở khóa thôi, đâu nhất thiết mở khóa khi file đang activate đâu nhỉ?
 
Upvote 0
Mình không hiểu code này gọi hàm (thủ tục) kiểu gì? Đâu thấy call Hook, chỉ là một thông báo!
(Giống kiểu phát ngôn gây "sốc" hoặc là thần chú gì đó?)
Bạn nào giải thích giùm!

Mã:
Sub Button1_Click()
    If Hook Then
        MsgBox "VBA Password is Removed!", vbInformation, "Excel Tool"
    End If
End Sub

Trong VBA để gọi Hook ta có thể viết Hook hoặc Call Hook

Nếu không cần thông báo thì code trên chỉ cần viết Hook là đủ

Mã:
Sub Button1_Click()   
Hook
End Sub
 
Upvote 0
Mã:
Sub Button1_Click()
    If Hook Then
        MsgBox "VBA Password is Removed!", vbInformation, "Excel Tool"
    End If
End Sub

Trong VBA để gọi Hook ta có thể viết Hook hoặc Call Hook

Nếu không cần thông báo thì code trên chỉ cần viết Hook là đủ

Mã:
Sub Button1_Click()   
Hook
End Sub

Mình biết rồi, nhưng ở đây là If Hook nên mới siêu!
 
Upvote 0
Mình biết rồi, nhưng ở đây là If Hook nên mới siêu!

Vẫn chỉ là cách viết thay vì If Hook = True Then người ta viết If Hook Then cho nó khỏe (nghe nói code chạy nhanh hơn)

Mã:
Sub Button1_Click()
    If Hook = True Then
        MsgBox "VBA Password is Removed!", vbInformation, "Excel Tool"
    End If
End Sub
 
Upvote 0
Mình biết rồi, nhưng ở đây là If Hook nên mới siêu!

Thì cũng giống vầy thôi
Mã:
Function [COLOR=#ff0000]SheetExist[/COLOR](WorkSheetName As String) [COLOR=#ff0000]As Boolean[/COLOR]
  On Error Resume Next
  SheetExist = Not Sheets(WorkSheetName) Is Nothing
End Function
Sub Main
  If [COLOR=#ff0000]SheetExist("ABC") [/COLOR]then
    MsgBox "Sheet 'ABC' này ton tai"
  End If
End Sub
Em không nghĩ là anh lại thắc mắc chuyện đơn giản này
Ẹc... Ẹc...
 
Upvote 0
Thì cũng giống vầy thôi
Mã:
Function [COLOR=#ff0000]SheetExist[/COLOR](WorkSheetName As String) [COLOR=#ff0000]As Boolean[/COLOR]
  On Error Resume Next
  SheetExist = Not Sheets(WorkSheetName) Is Nothing
End Function
Sub Main
  If [COLOR=#ff0000]SheetExist("ABC") [/COLOR]then
    MsgBox "Sheet 'ABC' này ton tai"
  End If
End Sub
Em không nghĩ là anh lại thắc mắc chuyện đơn giản này
Ẹc... Ẹc...

Lại hiểu sai ý của mình rồi!
Nếu như trước loạt bài này, muốn viết code Main trên thì mình phải viết là

Mã:
Sub Main()
    [COLOR=#ff0000]SheetExist ("ABC")    [/COLOR]' Hoac Call SheetExist("ABC")
    If SheetExist("ABC") Then
        MsgBox "Sheet 'ABC' này ton tai"
    End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Lại hiểu sai ý của mình rồi!
Nếu như trước loạt bài này, muốn viết code Main trên thì mình phải viết là

Mã:
Sub Main()
    [COLOR=#ff0000]SheetExist ("ABC")    [/COLOR]' Hoac Call SheetExist("ABC")
    If SheetExist("ABC") Then
        MsgBox "Sheet 'ABC' này ton tai"
    End If
End Sub
Anh viết vậy là... quá thừa rồi còn gì
SheetExist là 1 Function chứ đâu phải 1 Sub ---> Nếu nó chạy thì nó phải trả về giá trị gì đó và ta phải "nhận" lấy để tính toán xem sẽ làm gì tiếp
Còn cách anh vừa viết là anh đã tự xem SheetExist là 1 Sub (không phải Function) và giá trị trả về của nó anh cũng không thèm đếm xỉa đến luôn....
Dòng đỏ ở trên chẳng biết để làm cái gì nữa, có chăng thì vầy mới hợp lý:
Mã:
Sub Main()
  Dim bChk as Boolean
  bChk = SheetExist ("ABC")
  If bChk Then
    MsgBox "Sheet 'ABC' này ton tai"
  End If
End Sub
Nói cho cùng thì cũng y chang cách em đã viết ở bài 57 thôi
Ẹc... Ẹc... (ngộ hen.. tự nhiên anh lại théc méc rất.. kỳ cục...)
 
Upvote 0
Anh viết vậy là... quá thừa rồi còn gì
SheetExist là 1 Function chứ đâu phải 1 Sub ---> Nếu nó chạy thì nó phải trả về giá trị gì đó và ta phải "nhận" lấy để tính toán xem sẽ làm gì tiếp
Còn cách anh vừa viết là anh đã tự xem SheetExist là 1 Sub (không phải Function) và giá trị trả về của nó anh cũng không thèm đếm xỉa đến luôn....
Dòng đỏ ở trên chẳng biết để làm cái gì nữa, có chăng thì vầy mới hợp lý:
Mã:
Sub Main()
  Dim bChk as Boolean
  bChk = SheetExist ("ABC")
  If bChk Then
    MsgBox "Sheet 'ABC' này ton tai"
  End If
End Sub
Nói cho cùng thì cũng y chang cách em đã viết ở bài 57 thôi
Ẹc... Ẹc... (ngộ hen.. tự nhiên anh lại théc méc rất.. kỳ cục...)

Ờ, đúng ý mình đó, nếu trước đây, mình sẽ viết vậy! Dốt quá.
 
Upvote 0
Web KT
Back
Top Bottom