Forum Discussion
VBA
Sub Logout()
Call Unprotect
Range("O7").Select
If ActiveCell = "" Then
Exit Sub
End If
Call EndTimeNQ
' Log the logout details in the Report sheet
Sheets("Report").Activate
Sheets("Report").Unprotect Password:="ceswfis"
With ActiveCell
.Offset(0, 0).Value = Application.UserName
.Offset(0, 1).Value = "LOGOUT"
.Offset(0, 2).Value = "LOGOUT"
.Offset(0, 3).Value = Format(Now, "mm/dd/yyyy")
.Offset(0, 4).Value = Format(Now, "[$-409]hh:mm:ss AM/PM;@")
End With
ActiveSheet.Protect Password:="ceswfis"
' Back up the Report sheet to the specified file
Dim backupFilePath As String
backupFilePath = Sheets("Sheet1").Range("AD7").Value
If backupFilePath <> "" Then
Application.DisplayAlerts = False
Sheets("Report").Copy
With ActiveSheet
.Name = "Report"
.Move
ActiveWorkbook.SaveAs Filename:=backupFilePath
ActiveWorkbook.Close
End With
Application.DisplayAlerts = True
End If
' Clear specific ranges in Sheet1
Sheets("Sheet1").Select
UnmergeAndClear Range("A14:100")
UnmergeAndClear Range("O7:P7")
UnmergeAndClear Range("F7:F8")
UnmergeAndClear Range("F7:F18")
Call Protect
ActiveWorkbook.Close saveChanges:=True
End Sub
Private Sub Worksheet_Change(ByVal Target As Range) Dim ws As Worksheet Set ws = Me Dim selectedQueue As String Dim col As Integer Dim cell As Range Dim queueFound As Boolean Dim i As Long On Error GoTo ErrorHandler ' Handle queue selection in cell A1 If Not Intersect(Target, Range("A1")) Is Nothing Then selectedQueue = ws.Range("A1").Value queueFound = False ' Unhide/hide columns based on queue selection Application.ScreenUpdating = False ' Loop through columns G to CZ For col = 7 To 104 If ws.Cells(5, col).MergeCells Then Set cell = ws.Cells(5, col).MergeArea If Not IsError(cell.Cells(1, 1).Value) And Not IsEmpty(cell.Cells(1, 1).Value) Then If Trim(CStr(cell.Cells(1, 1).Value)) = Trim(selectedQueue) Or Trim(selectedQueue) = "All Queues" Then ' Unhide the columns if they are hidden If cell.Columns.Hidden Then cell.Columns.Hidden = False End If ' Select the first cell of the unhidden merged area cell.Cells(1, 1).Select queueFound = True Else ' Hide the columns if they are not the selected queue cell.Columns.Hidden = True End If End If Else ' If the column is blank, hide it ws.Columns(col).Hidden = True End If Next col ' If "All Queues" is selected, show all queues data If selectedQueue = "All Queues" Then For col = 7 To 104 ws.Columns(col).Hidden = False Next col queueFound = True End If ' If the queue is not found, show a message If Not queueFound Then MsgBox "Queue not found in row 5." End If Application.ScreenUpdating = True Exit Sub End If ' Handle status changes and timestamping If Not Intersect(Target, Range("G6:G1000")) Is Nothing Then If Not IsEmpty(Target) Then ' Define headers and their corresponding columns Dim headers As Variant headers = Array("Status", "Commence", "Awaiting", "Re-Picked", "Completed") Dim headerCol As Variant Dim statusCol As Integer Dim timestampCol As Integer ' Find the header columns For i = LBound(headers) To UBound(headers) headerCol = Application.Match(headers(i), ws.Rows(6), 0) If Not IsError(headerCol) Then If headers(i) = "Status" Then statusCol = headerCol If Target.Column = statusCol Then ' Get corresponding timestamp column Select Case Target.Value Case "Commence" timestampCol = Application.Match("Commence", ws.Rows(6), 0) Case "Awaiting" timestampCol = Application.Match("Awaiting", ws.Rows(6), 0) Case "Re-Picked" timestampCol = Application.Match("Re-Picked", ws.Rows(6), 0) Case "Completed" timestampCol = Application.Match("Completed", ws.Rows(6), 0) End Select ' Insert timestamp If Not IsError(timestampCol) And timestampCol > 0 Then ws.Cells(Target.Row, timestampCol).Value = Now End If End If End If Next i End If End If Exit Sub ErrorHandler: MsgBox "An error occurred: " & Err.Description Application.ScreenUpdating = True End Sub
Corrected Code with Comments.
Placed On Error GoTo ErrorHandler at the beginning to cover the whole subroutine.
Added checks to ensure that Application.Match does not return an error before using the matched column.
My answers are voluntary and without guarantee!
Hope this will help you.
- NikolinoDEGold Contributor
Private Sub Worksheet_Change(ByVal Target As Range) Dim ws As Worksheet Set ws = Me Dim selectedQueue As String Dim col As Integer Dim cell As Range Dim queueFound As Boolean Dim i As Long On Error GoTo ErrorHandler ' Handle queue selection in cell A1 If Not Intersect(Target, Range("A1")) Is Nothing Then selectedQueue = ws.Range("A1").Value queueFound = False ' Unhide/hide columns based on queue selection Application.ScreenUpdating = False ' Loop through columns G to CZ For col = 7 To 104 If ws.Cells(5, col).MergeCells Then Set cell = ws.Cells(5, col).MergeArea If Not IsError(cell.Cells(1, 1).Value) And Not IsEmpty(cell.Cells(1, 1).Value) Then If Trim(CStr(cell.Cells(1, 1).Value)) = Trim(selectedQueue) Or Trim(selectedQueue) = "All Queues" Then ' Unhide the columns if they are hidden If cell.Columns.Hidden Then cell.Columns.Hidden = False End If ' Select the first cell of the unhidden merged area cell.Cells(1, 1).Select queueFound = True Else ' Hide the columns if they are not the selected queue cell.Columns.Hidden = True End If End If Else ' If the column is blank, hide it ws.Columns(col).Hidden = True End If Next col ' If "All Queues" is selected, show all queues data If selectedQueue = "All Queues" Then For col = 7 To 104 ws.Columns(col).Hidden = False Next col queueFound = True End If ' If the queue is not found, show a message If Not queueFound Then MsgBox "Queue not found in row 5." End If Application.ScreenUpdating = True Exit Sub End If ' Handle status changes and timestamping If Not Intersect(Target, Range("G6:G1000")) Is Nothing Then If Not IsEmpty(Target) Then ' Define headers and their corresponding columns Dim headers As Variant headers = Array("Status", "Commence", "Awaiting", "Re-Picked", "Completed") Dim headerCol As Variant Dim statusCol As Integer Dim timestampCol As Integer ' Find the header columns For i = LBound(headers) To UBound(headers) headerCol = Application.Match(headers(i), ws.Rows(6), 0) If Not IsError(headerCol) Then If headers(i) = "Status" Then statusCol = headerCol If Target.Column = statusCol Then ' Get corresponding timestamp column Select Case Target.Value Case "Commence" timestampCol = Application.Match("Commence", ws.Rows(6), 0) Case "Awaiting" timestampCol = Application.Match("Awaiting", ws.Rows(6), 0) Case "Re-Picked" timestampCol = Application.Match("Re-Picked", ws.Rows(6), 0) Case "Completed" timestampCol = Application.Match("Completed", ws.Rows(6), 0) End Select ' Insert timestamp If Not IsError(timestampCol) And timestampCol > 0 Then ws.Cells(Target.Row, timestampCol).Value = Now End If End If End If Next i End If End If Exit Sub ErrorHandler: MsgBox "An error occurred: " & Err.Description Application.ScreenUpdating = True End Sub
Corrected Code with Comments.
Placed On Error GoTo ErrorHandler at the beginning to cover the whole subroutine.
Added checks to ensure that Application.Match does not return an error before using the matched column.
My answers are voluntary and without guarantee!
Hope this will help you.
- cherrypolisettiCopper ContributorThanks it worked good n also I've made few more changes