Man*_*uel 0 excel vba rubberduck
我有下面的代码来格式化工作表。该工作簿中有多个工作表,因此我只想对第一个工作表执行操作。但是,如果我有除第一个激活之外的任何工作表(例如第二个工作表),则代码会引发 1004 错误。我不知道为什么,因为我正在指定和定义目标工作表。
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
Run Code Online (Sandbox Code Playgroud)
原因是在这样的代码中:
WB.Range(Cells(LastRow + 2, 19), Cells(LastRow + 2, 22))
Run Code Online (Sandbox Code Playgroud)
该对象Cells不合格,因此默认为ActiveWorkbook.ActiveSheet.Cells(). 虽然这感觉很愚蠢,因为您已经限定了将其Range()作为Cells()参数,但这些参数是它们自己的对象,也必须进行限定。
请考虑:
With WB
.Range(.Cells(LastRow + 2, 19), .Cells(LastRow + 2, 22))
End With
Run Code Online (Sandbox Code Playgroud)
WB.或者,如果感觉更清晰,您可以单独对它们进行限定。