Attribute VB_Name = "ClearClearedData" Option Explicit ' ============================================================================= ' Clear Data button macro for the "Cleared Data" worksheet. ' ' INSTALL: ' 1. Import ClearClearedData.bas into Template.xlsm ' 2. On Cleared Data sheet: Developer → Insert → Button (Form Control) ' Draw the button, assign macro: ClearClearedDataSheet ' Edit button text to: Clear Data ' Or run: CreateClearDataButton (once) to place the button automatically ' ' Clears A2 onward (including ItemCode in column A); preserves row 1 headers. ' Does not delete rows/columns, formatting, buttons, or sheet structure. ' Independent of AmazonUrlCleaner and ClearSheet.ClearSheetData. ' ============================================================================= Private Const CLEARED_DATA_SHEET As String = "Cleared Data" Private Const FIRST_DATA_ROW As Long = 2 Private Const FIRST_DATA_COL As Long = 1 Public Sub ClearClearedDataSheet() Dim ws As Worksheet Dim dataRange As Range Dim previousEnableEvents As Boolean Dim previousScreenUpdating As Boolean Dim answer As VbMsgBoxResult On Error GoTo ErrorHandler Set ws = GetClearedDataSheet() If ws Is Nothing Then MsgBox "Worksheet '" & CLEARED_DATA_SHEET & "' was not found.", _ vbExclamation, "Clear Data" Exit Sub End If answer = MsgBox( _ "Are you sure you want to clear all data from the Cleared Data sheet?", _ vbYesNo + vbExclamation, _ "Clear Data") If answer <> vbYes Then Exit Sub previousEnableEvents = Application.EnableEvents previousScreenUpdating = Application.ScreenUpdating Application.EnableEvents = False Application.ScreenUpdating = False Set dataRange = GetClearedDataClearRange(ws) If Not dataRange Is Nothing Then ' ClearContents keeps formatting, formulas structure, buttons, sheet layout dataRange.ClearContents End If Application.EnableEvents = previousEnableEvents Application.ScreenUpdating = previousScreenUpdating MsgBox "Cleared Data sheet has been successfully cleared.", _ vbInformation, "Clear Data" Exit Sub ErrorHandler: Application.EnableEvents = previousEnableEvents Application.ScreenUpdating = previousScreenUpdating MsgBox "Clear Data could not be completed." & vbCrLf & _ Err.Description, vbCritical, "Clear Data" End Sub ' Place / refresh a Form Control button labeled "Clear Data" on Cleared Data. Public Sub CreateClearDataButton() Dim ws As Worksheet Dim btn As Button Dim existing As Shape Dim leftPos As Double Dim topPos As Double On Error GoTo ErrorHandler Set ws = GetClearedDataSheet() If ws Is Nothing Then MsgBox "Worksheet '" & CLEARED_DATA_SHEET & "' was not found.", _ vbExclamation, "Clear Data" Exit Sub End If ' Remove previous auto-created button if present On Error Resume Next For Each existing In ws.Shapes If existing.Type = msoFormControl Then If StrComp(existing.OnAction, "ClearClearedDataSheet", vbTextCompare) = 0 Or _ StrComp(existing.Name, "btnClearClearedData", vbTextCompare) = 0 Then existing.Delete End If End If Next existing On Error GoTo ErrorHandler leftPos = ws.Range("L1").Left topPos = ws.Range("L1").Top Set btn = ws.Buttons.Add(leftPos, topPos, 100, 28) With btn .Name = "btnClearClearedData" .OnAction = "ClearClearedDataSheet" .Characters.Text = "Clear Data" End With MsgBox "Clear Data button added to the Cleared Data sheet.", _ vbInformation, "Clear Data" Exit Sub ErrorHandler: MsgBox "Could not create the Clear Data button." & vbCrLf & _ Err.Description, vbCritical, "Clear Data" End Sub Private Function GetClearedDataSheet() As Worksheet On Error Resume Next Set GetClearedDataSheet = ThisWorkbook.Worksheets(CLEARED_DATA_SHEET) On Error GoTo 0 End Function ' Data area: A2 through last used cell (keeps row 1 headers only). Private Function GetClearedDataClearRange(ByVal ws As Worksheet) As Range Dim lastRow As Long Dim lastCol As Long Dim colIndex As Long Dim colLastRow As Long Dim used As Range On Error Resume Next Set used = ws.UsedRange On Error GoTo 0 If used Is Nothing Then Exit Function lastRow = FIRST_DATA_ROW - 1 lastCol = used.Column + used.Columns.Count - 1 If lastCol < FIRST_DATA_COL Then Exit Function For colIndex = FIRST_DATA_COL To lastCol colLastRow = ws.Cells(ws.Rows.Count, colIndex).End(xlUp).Row If colLastRow > lastRow Then lastRow = colLastRow Next colIndex If lastRow < FIRST_DATA_ROW Then Exit Function Set GetClearedDataClearRange = ws.Range( _ ws.Cells(FIRST_DATA_ROW, FIRST_DATA_COL), _ ws.Cells(lastRow, lastCol)) End Function