Thoát tất cả Sub trong VBA

Liên hệ QC

Trần_Minh_5695

Thành viên mới
Tham gia
27/9/21
Bài viết
34
Được thích
4
Cho e hỏi có code nào để mình thoát tất cả các Sub đang chạy ngầm trong VBA ko ạ?
Em tìm trên mạng code để AutoSave file excel sau 1 phút, nhưg khi tắt file đi => Sau 1 phút thì file lại tự bật lại để save do chạy code.
Em có thử hàm Exit Sub trong event Workbook_BeforeClose nhưg ko đc.
Mong mn giúp đỡ!
(Có file đính kèm)

1653444806786.png

1653444682302.png
 

File đính kèm

  • Material_Controll.xlsm
    108.9 KB · Đọc: 15
Bạn có thể tham khảo hai cách đơn giản sau:

Cách 1: Tạo biến lưu trữ thời gian sẽ gọi hàm
Public OnTimeProc As Date

OnTimeProc = VBA.Now + TimeSerial(0,1,0)
Application.Ontime OnTimeProc, "Auto_Save"

Và Thoát, đặt mã thoát vào Workbook Close:
Application.Ontime OnTimeProc, "Auto_Save", , False

Cách 2: Lưu trữ vào một Dictionary, cách này dành cho dự án lớn
AOT2 TimeSerial(0,1,0), "Auto_Save"

Gọi OnTimeStopAll từ Workbook Close


JavaScript:
Private dAllOnTime As Object
Sub AOTCallback(procedure$)
  On Error Resume Next
  dAllOnTime.Remove procedure
  AOT2 , procedure, True
End Sub
Sub AOT2(Optional time As Date, Optional Proc$, Optional ByVal Schedule As Boolean = True)
  If dAllOnTime Is Nothing Then
    Set dAllOnTime = VBA.CreateObject("Scripting.Dictionary")
    dAllOnTime.CompareMode = 1
  End If
  On Error Resume Next
  If Not Schedule Then
    time = dAllOnTime(Proc)
    GoSub e
    dAllOnTime.Remove Proc
  Else
    If time < VBA.Now() Then
      time = VBA.Now() + time
    End If
    GoSub e
    dAllOnTime(Proc) = time
  End If
Exit Sub
e:
  'Debug.Print Schedule, onProject(Proc)
  Application.OnTime time, onProject(Proc), , Schedule
Return
End Sub

Sub OnTimeStopAll()
  On Error Resume Next
  If dAllOnTime Is Nothing Then
    Exit Sub
  End If
  Dim k
  For Each k In dAllOnTime.Keys()
    AOT2 dAllOnTime(k), CStr(k), False
  Next
  dAllOnTime.RemoveAll
  Set dAllOnTime = Nothing
End Sub
Function onProject(ByVal procedure As String, Optional ByVal Style As String = "") As String
  ' OnTime: 'Procedure 1'
  ' OnAction: Procedure (1)
  ' AssignMacro: Procedure (1)
  If procedure Like "'*'!*" Then
    onProject = procedure
  Else
    If procedure Like "*)" Or Not procedure Like "* *" Then
      onProject = "'" & ThisWorkbook.Name & "'!" & procedure
    Else
      onProject = "'" & ThisWorkbook.Name & "'!'" & procedure & "'"
    End If
  End If
End Function
 
Upvote 0
Bạn có thể tham khảo hai cách đơn giản sau:

Cách 1: Tạo biến lưu trữ thời gian sẽ gọi hàm
Public OnTimeProc As Date

OnTimeProc = VBA.Now + TimeSerial(0,1,0)
Application.Ontime OnTimeProc, "Auto_Save"

Và Thoát, đặt mã thoát vào Workbook Close:
Application.Ontime OnTimeProc, "Auto_Save", , False

Cách 2: Lưu trữ vào một Dictionary, cách này dành cho dự án lớn
AOT2 TimeSerial(0,1,0), "Auto_Save"

Gọi OnTimeStopAll từ Workbook Close


JavaScript:
Private dAllOnTime As Object
Sub AOTCallback(procedure$)
  On Error Resume Next
  dAllOnTime.Remove procedure
  AOT2 , procedure, True
End Sub
Sub AOT2(Optional time As Date, Optional Proc$, Optional ByVal Schedule As Boolean = True)
  If dAllOnTime Is Nothing Then
    Set dAllOnTime = VBA.CreateObject("Scripting.Dictionary")
    dAllOnTime.CompareMode = 1
  End If
  On Error Resume Next
  If Not Schedule Then
    time = dAllOnTime(Proc)
    GoSub e
    dAllOnTime.Remove Proc
  Else
    If time < VBA.Now() Then
      time = VBA.Now() + time
    End If
    GoSub e
    dAllOnTime(Proc) = time
  End If
Exit Sub
e:
  'Debug.Print Schedule, onProject(Proc)
  Application.OnTime time, onProject(Proc), , Schedule
Return
End Sub

Sub OnTimeStopAll()
  On Error Resume Next
  If dAllOnTime Is Nothing Then
    Exit Sub
  End If
  Dim k
  For Each k In dAllOnTime.Keys()
    AOT2 dAllOnTime(k), CStr(k), False
  Next
  dAllOnTime.RemoveAll
  Set dAllOnTime = Nothing
End Sub
Function onProject(ByVal procedure As String, Optional ByVal Style As String = "") As String
  ' OnTime: 'Procedure 1'
  ' OnAction: Procedure (1)
  ' AssignMacro: Procedure (1)
  If procedure Like "'*'!*" Then
    onProject = procedure
  Else
    If procedure Like "*)" Or Not procedure Like "* *" Then
      onProject = "'" & ThisWorkbook.Name & "'!" & procedure
    Else
      onProject = "'" & ThisWorkbook.Name & "'!'" & procedure & "'"
    End If
  End If
End Function
Cảm ơn bạn!
Để mình thử :D
 
Upvote 0
Bạn có thể tham khảo hai cách đơn giản sau:

Cách 1: Tạo biến lưu trữ thời gian sẽ gọi hàm
Public OnTimeProc As Date

OnTimeProc = VBA.Now + TimeSerial(0,1,0)
Application.Ontime OnTimeProc, "Auto_Save"

Và Thoát, đặt mã thoát vào Workbook Close:
Application.Ontime OnTimeProc, "Auto_Save", , False

Cách 2: Lưu trữ vào một Dictionary, cách này dành cho dự án lớn
AOT2 TimeSerial(0,1,0), "Auto_Save"

Gọi OnTimeStopAll từ Workbook Close


JavaScript:
Private dAllOnTime As Object
Sub AOTCallback(procedure$)
  On Error Resume Next
  dAllOnTime.Remove procedure
  AOT2 , procedure, True
End Sub
Sub AOT2(Optional time As Date, Optional Proc$, Optional ByVal Schedule As Boolean = True)
  If dAllOnTime Is Nothing Then
    Set dAllOnTime = VBA.CreateObject("Scripting.Dictionary")
    dAllOnTime.CompareMode = 1
  End If
  On Error Resume Next
  If Not Schedule Then
    time = dAllOnTime(Proc)
    GoSub e
    dAllOnTime.Remove Proc
  Else
    If time < VBA.Now() Then
      time = VBA.Now() + time
    End If
    GoSub e
    dAllOnTime(Proc) = time
  End If
Exit Sub
e:
  'Debug.Print Schedule, onProject(Proc)
  Application.OnTime time, onProject(Proc), , Schedule
Return
End Sub

Sub OnTimeStopAll()
  On Error Resume Next
  If dAllOnTime Is Nothing Then
    Exit Sub
  End If
  Dim k
  For Each k In dAllOnTime.Keys()
    AOT2 dAllOnTime(k), CStr(k), False
  Next
  dAllOnTime.RemoveAll
  Set dAllOnTime = Nothing
End Sub
Function onProject(ByVal procedure As String, Optional ByVal Style As String = "") As String
  ' OnTime: 'Procedure 1'
  ' OnAction: Procedure (1)
  ' AssignMacro: Procedure (1)
  If procedure Like "'*'!*" Then
    onProject = procedure
  Else
    If procedure Like "*)" Or Not procedure Like "* *" Then
      onProject = "'" & ThisWorkbook.Name & "'!" & procedure
    Else
      onProject = "'" & ThisWorkbook.Name & "'!'" & procedure & "'"
    End If
  End If
End Function
Mình có thử nhưg nó lại báo lỗi
1653447109132.png
 
Upvote 0
Bạn có thể tham khảo hai cách đơn giản sau:

Cách 1: Tạo biến lưu trữ thời gian sẽ gọi hàm
Public OnTimeProc As Date

OnTimeProc = VBA.Now + TimeSerial(0,1,0)
Application.Ontime OnTimeProc, "Auto_Save"

Và Thoát, đặt mã thoát vào Workbook Close:
Application.Ontime OnTimeProc, "Auto_Save", , False

Cách 2: Lưu trữ vào một Dictionary, cách này dành cho dự án lớn
AOT2 TimeSerial(0,1,0), "Auto_Save"

Gọi OnTimeStopAll từ Workbook Close


JavaScript:
Private dAllOnTime As Object
Sub AOTCallback(procedure$)
  On Error Resume Next
  dAllOnTime.Remove procedure
  AOT2 , procedure, True
End Sub
Sub AOT2(Optional time As Date, Optional Proc$, Optional ByVal Schedule As Boolean = True)
  If dAllOnTime Is Nothing Then
    Set dAllOnTime = VBA.CreateObject("Scripting.Dictionary")
    dAllOnTime.CompareMode = 1
  End If
  On Error Resume Next
  If Not Schedule Then
    time = dAllOnTime(Proc)
    GoSub e
    dAllOnTime.Remove Proc
  Else
    If time < VBA.Now() Then
      time = VBA.Now() + time
    End If
    GoSub e
    dAllOnTime(Proc) = time
  End If
Exit Sub
e:
  'Debug.Print Schedule, onProject(Proc)
  Application.OnTime time, onProject(Proc), , Schedule
Return
End Sub

Sub OnTimeStopAll()
  On Error Resume Next
  If dAllOnTime Is Nothing Then
    Exit Sub
  End If
  Dim k
  For Each k In dAllOnTime.Keys()
    AOT2 dAllOnTime(k), CStr(k), False
  Next
  dAllOnTime.RemoveAll
  Set dAllOnTime = Nothing
End Sub
Function onProject(ByVal procedure As String, Optional ByVal Style As String = "") As String
  ' OnTime: 'Procedure 1'
  ' OnAction: Procedure (1)
  ' AssignMacro: Procedure (1)
  If procedure Like "'*'!*" Then
    onProject = procedure
  Else
    If procedure Like "*)" Or Not procedure Like "* *" Then
      onProject = "'" & ThisWorkbook.Name & "'!" & procedure
    Else
      onProject = "'" & ThisWorkbook.Name & "'!'" & procedure & "'"
    End If
  End If
End Function
Sao mình thử (Application.Ontime OnTimeProc, "Auto_Save", , False) không được bạn?
Mình có search trên mạng thì cũg có chỉ giốg vậy nhưg nó cứ báo lỗi :((
1653453798794.png

1653453777596.png
 
Upvote 0
Thớt thử code này (ở module), xóa hết code trong ThisWorkbook đi.
Mã:
Dim dTime As Double
Sub Auto_Save()
    Application.DisplayAlerts = False
    ThisWorkbook.Save
    Application.DisplayAlerts = True
    SetSchedule
End Sub
Private Sub Auto_Open()
    SetSchedule
    'Material_Scan.Show
End Sub
Private Sub Auto_Close()
    Application.OnTime dTime, "Auto_Save", , False
End Sub
Private Sub SetSchedule()
    dTime = Now + TimeValue("00:01:00")
    Application.OnTime dTime, "Auto_Save"
End Sub
 
Upvote 0
Thớt thử code này (ở module), xóa hết code trong ThisWorkbook đi.
Mã:
Dim dTime As Double
Sub Auto_Save()
    Application.DisplayAlerts = False
    ThisWorkbook.Save
    Application.DisplayAlerts = True
    SetSchedule
End Sub
Private Sub Auto_Open()
    SetSchedule
    'Material_Scan.Show
End Sub
Private Sub Auto_Close()
    Application.OnTime dTime, "Auto_Save", , False
End Sub
Private Sub SetSchedule()
    dTime = Now + TimeValue("00:01:00")
    Application.OnTime dTime, "Auto_Save"
End Sub
Code ok r @@
Cho mình hỏi Sub Autopen() với Auto_Close() là mặc định chạy lúc mở/đóng file excel hay sao vậy?
 
Upvote 0
Cho mình hỏi Sub Autopen() với Auto_Close() là mặc định chạy lúc mở/đóng file excel hay sao vậy?
Đúng vậy, Auto_ Open tương đương với Workbook_Open và Auto_Close tương đương với Workbook_BeforeClose. Tuy có một vài điểm khác biệt nhưng về cơ bản thì tương tự nhau, nếu bạn muốn tìm hiểu sâu hơn thì có thể tìm trên internet.
 
Upvote 0
Đúng vậy, Auto_ Open tương đương với Workbook_Open và Auto_Close tương đương với Workbook_BeforeClose. Tuy có một vài điểm khác biệt nhưng về cơ bản thì tương tự nhau, nếu bạn muốn tìm hiểu sâu hơn thì có thể tìm trên internet.
Cảm ơn bạn rất nhiều
Mình mới tìm được trên mạng :D

 
Upvote 0
Web KT

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

Back
Top Bottom