Thủ tục BeforeClose, BeforeSave trong workbook

Liên hệ QC

nvtnet

Thành viên thường trực
Tham gia
31/5/11
Bài viết
269
Được thích
15
em tạo hai thủ tục như sau
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim PASS As String
PASS = InputBox("nhap mat khau")
If PASS <> "2020" Then
ThisWorkbook.Saved = True
Else
ThisWorkbook.Saved = False

End If

End Sub

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim PASS As String
PASS = InputBox("nhap mat khau")
If PASS <> "2020" Then
ThisWorkbook.Saved = True
Else
ThisWorkbook.Saved = False

End If

End Sub

thủ tục trước khi thoát, hoặc trước khi save (bấm chuột vào icon lưu, hoặc Ctrl+S) nếu nhập sai mật khẩu sẽ thoát ko lưu gì cả, ngược lại thì lưu
cái thủ tục trên thì chạy đúng, thủ tục sau thì chạy sai. Tức là khi Ctrl+S nó hỏi pass, nhập sai pass nó vẫn lưu
các bác xem em viết sai chỗ nào với ạ
 
Pass = “2020” chứ bạn, sao lại là <>
nhập khác 2020 nó save là đúng rồi
 
Upvote 0
# Module 1
PHP:
Option Explicit
Private const mat_khau = "bí mật bí đường"
Public bln_close as boolean
Public Sub ChinhCodeDay()
Dim str_pw as string, mgb as vbmsgboxResult
str_pw = InputBox("Nhap mat khau de luu du lieu truoc khi dong:", "Hoi truoc khi dong")
If str_pw = mat_khau then
ThisWorkbook.Saved = True
Else
ThisWorkbook.Saved = False
mgb = MsgBox("Mật khẩu không đúng rồi cưng ơi!" & vbnewline & "Co muon dong file luon khong?", vbYesNo + vbQuestion, "Thong bao")
If mgb = vbyes then 
bln_close=True
ThisWorkbook.close Savechanges:=False
End if
End If
End Sub
# Thisworkbook
PHP:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If bln_close = False Then Call ChinhCodeDay
End Sub
'
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Call ChinhCodeDay
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
@nvtnet

Không phải lệnh ThisWorkbook.Saved = True để hủy lưu. Lệnh này là để sự kiện BeforeSave và BeforeClose bỏ qua bắt sự kiện Save.
Phải là Cancel = True/False
----------------------------
Mã:
Dim PASS As String
PASS = InputBox("nhap mat khau")
Cancel = PASS <> "2020"

Sự kiện BeforeClose thêm dòng lệnh để xử lý.
Mã:
Application.DislayAlerts = False
Dim PASS As String
L:PASS = InputBox("nhap mat khau để lưu")
If PASS = "2020" Then
  ThisWorkbook.Saved = True
  ThisWorkbook.Save
Else
  If MsgBox("Sai MK, Bạn có muốn nhập lại không?", vbOKCancel) = vbOK Then
     Goto L
  Else
     ThisWorkbook.Saved = True
     ThisWorkbook.Close False
  End if
End if
Application.DislayAlerts = True
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ cảm ơn các bác ạ, em xem trên support của Microsoft, nhưng chắc em đọc không hiểu hết ạ.
 
Upvote 0
# Module 1
PHP:
Option Explicit
Private const mat_khau = "bí mật bí đường"
Public bln_close as boolean
Public Sub ChinhCodeDay()
Dim str_pw as string, mgb as vbmsgboxResult
str_pw = InputBox("Nhap mat khau de luu du lieu truoc khi dong:", "Hoi truoc khi dong")
If str_pw = mat_khau then
ThisWorkbook.Saved = True
Else
ThisWorkbook.Saved = False
mgb = MsgBox("Mật khẩu không đúng rồi cưng ơi!" & vbnewline & "Co muon dong file luon khong?", vbYesNo + vbQuestion, "Thong bao")
If mgb = vbyes then
bln_close=True
ThisWorkbook.close Savechanges:=False
End if
End If
End Sub
# Thisworkbook
PHP:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If bln_close = False Then Call ChinhCodeDay
End Sub
'
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Call ChinhCodeDay
End Sub
code này có 1 vấn đề với sự kiện thoát ạ.
Tắt file chương trình (CT) hỏi pass, em nhập sai pass sai, CT hỏi có đóng không, chọn không, CT tiếp tục hỏi pass, em lại nhập sai, CT thoát nhưng nó lại lưu các thay đổi ạ
 
Upvote 0
@nvtnet

Không phải lệnh ThisWorkbook.Saved = True để hủy lưu. Lệnh này là để sự kiện BeforeSave và BeforeClose bỏ qua bắt sự kiện Save.
Phải là Cancel = True/False
----------------------------
Mã:
Dim PASS As String
PASS = InputBox("nhap mat khau")
Cancel = PASS <> "2020"

Sự kiện BeforeClose thêm dòng lệnh để xử lý.
Mã:
Application.DislayAlerts = False
Dim PASS As String
L:PASS = InputBox("nhap mat khau để lưu")
If PASS = "2020" Then
  ThisWorkbook.Saved = True
  ThisWorkbook.Save
Else
  If MsgBox("Sai MK, Bạn có muốn nhập lại không?", vbOKCancel) = vbOK Then
     Goto L
  Else
     ThisWorkbook.Saved = True
     ThisWorkbook.Close False
  End if
End if
Application.DislayAlerts = True
code này chạy ổn ạ, nhưng chỗ sự kiện trước khi thoát thêm bẫy lỗi On Error Resume Next
vì nếu save rồi sau mới thoát sẽ dính lỗi. cảm ơn bác
à với lại em hỏi thêm tý. sự kiện thoát thì nó kéo theo cả sự kiện save, thành ra phải nhập đúng mật khẩu 2 lần.
muốn bỏ qua sự kiện save khi chạy sự kiện thoát thì sao ạ
 
Lần chỉnh sửa cuối:
Upvote 0
code này chạy ổn ạ, nhưng chỗ sự kiện trước khi thoát thêm bẫy lỗi On Error Resume Next
vì nếu save rồi sau mới thoát sẽ dính lỗi. cảm ơn bác
à với lại em hỏi thêm tý. sự kiện thoát thì nó kéo theo cả sự kiện save, thành ra phải nhập đúng mật khẩu 2 lần.
muốn bỏ qua sự kiện save khi chạy sự kiện thoát thì sao ạ

Bạn sử dụng đoạn mã dưới đây:


---------------------
JavaScript:
Const PassCheck = "2020"
Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Application.DisplayAlerts = False
  ThisWorkbook.Save
  ThisWorkbook.Saved = True
  Application.DisplayAlerts = True
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
L:
  If inputPass <> PassCheck Then
    Cancel = True
    If Alert = vbOK Then Cancel = False: GoTo L
  End If
End Sub
Private Function inputPass()
  inputPass = InputBox("nhâp mât khâu Ðê luu:")
End Function
Private Function Alert()
  Alert = MsgBox("Sai MK, Ban có muôn thu lai không?", vbOKCancel)
End Function
 
Upvote 0
Bạn sử dụng đoạn mã dưới đây:


---------------------
JavaScript:
Const PassCheck = "2020"
Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Application.DisplayAlerts = False
  ThisWorkbook.Save
  ThisWorkbook.Saved = True
  Application.DisplayAlerts = True
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
L:
  If inputPass <> PassCheck Then
    Cancel = True
    If Alert = vbOK Then Cancel = False: GoTo L
  End If
End Sub
Private Function inputPass()
  inputPass = InputBox("nhâp mât khâu Ðê luu:")
End Function
Private Function Alert()
  Alert = MsgBox("Sai MK, Ban có muôn thu lai không?", vbOKCancel)
End Function
Anh cho em hỏi, giả sử trong file có sheet1 và ở cell A1 em để pass là 2020
và code trên
Mã:
Const PassCheck = "2020"
em sửa thành
Mã:
Const PassCheck = Sheets("Sheet1").Range("A1").Value
thì không được, cho em hỏi muốn làm như vậy thì sửa sao? Em cảm ơn!
 
Upvote 0
Anh cho em hỏi, giả sử trong file có sheet1 và ở cell A1 em để pass là 2020
và code trên
Mã:
Const PassCheck = "2020"
em sửa thành
Mã:
Const PassCheck = Sheets("Sheet1").Range("A1").Value
thì không được, cho em hỏi muốn làm như vậy thì sửa sao? Em cảm ơn!
Sửa chổ này
Mã:
If inputPass <> PassCheck Then
thành
Mã:
If inputPass <> Sheets("Sheet1").Range("A1").Value Then
 
Upvote 0
Bạn sử dụng đoạn mã dưới đây:


---------------------
JavaScript:
Const PassCheck = "2020"
Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Application.DisplayAlerts = False
  ThisWorkbook.Save
  ThisWorkbook.Saved = True
  Application.DisplayAlerts = True
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
L:
  If inputPass <> PassCheck Then
    Cancel = True
    If Alert = vbOK Then Cancel = False: GoTo L
  End If
End Sub
Private Function inputPass()
  inputPass = InputBox("nhâp mât khâu Ðê luu:")
End Function
Private Function Alert()
  Alert = MsgBox("Sai MK, Ban có muôn thu lai không?", vbOKCancel)
End Function
Được rồi bác ạ. Cảm ơn bác
 
Upvote 0
Web KT

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

Back
Top Bottom