I Have the below code which formats a sheet. There are multiple sheets in this workbook so i only want to take actions on the first one. However if i have any sheet other than the first activated such as the second the code throws a 1004 error. I am not sure why as i am specifying and defining the target worksheet.
Option Explicit
Sub SelectByJobNumber()
Dim LastRow As Long
Dim OperatingRow As Variant
Dim CountOfMatching As Long
Dim WB As Worksheet
Set WB = ThisWorkbook.Worksheets(1)
LastRow = WB.Cells(ActiveSheet.Rows.Count, "C").End(xlUp).Row
WB.Range(Cells(LastRow + 2, 19), Cells(LastRow + 2, 22)).Formula = "=" & "Sum(S74:S" & LastRow & ")"
WB.Range(Cells(LastRow + 2, 19), Cells(LastRow + 2, 22)).NumberFormat = "$#,##0.00"
For OperatingRow = 74 To LastRow
If WB.Cells(OperatingRow, 3) = WB.Cells(OperatingRow + 1, 3) Then
CountOfMatching = CountOfMatching + 1
Else
WB.Range(Cells(OperatingRow - CountOfMatching, 3), Cells(OperatingRow, 21)).BorderAround ColorIndex:=1, Weight:=xlMedium
WB.Cells(OperatingRow - CountOfMatching, 22) = Application.Sum(Range(Cells(OperatingRow - CountOfMatching, 21), Cells(OperatingRow, 21)))
If WB.Cells(OperatingRow - CountOfMatching, 22) = 0 Then
WB.Cells(OperatingRow - CountOfMatching, 23) = "Text for Zero Total Payable"
Else
WB.Cells(OperatingRow - CountOfMatching, 23) = "Not Paid"
End If
WB.Cells(OperatingRow - CountOfMatching, 22).NumberFormat = "$#,##0.00"
CountOfMatching = 0
End If
Next OperatingRow
If WB.Cells(LastRow + 2, 21) = WB.Cells(LastRow + 2, 22) Then
WB.Range(Cells(LastRow + 2, 21), Cells(LastRow + 2, 22)).BorderAround ColorIndex:=4, Weight:=xlMedium
Else
WB.Range(Cells(LastRow + 2, 21), Cells(LastRow + 2, 22)).BorderAround ColorIndex:=3, Weight:=xlMedium
End If
End Sub
The reason is that in code like this:
WB.Range(Cells(LastRow + 2, 19), Cells(LastRow + 2, 22))
The object Cells
isn't qualified and so it's defaulting to ActiveWorkbook.ActiveSheet.Cells()
. It feels silly though because you already qualified the Range()
which takes Cells()
as arguments, but those arguments are their own object and must also be qualified.
Consider instead:
With WB
.Range(.Cells(LastRow + 2, 19), .Cells(LastRow + 2, 22))
End With
Or you can just qualify them each individually with WB.
if that feels cleaner.