我有一个工作簿,其中包含不一致数量的工作表(因此在任何给定时间可以是<10或> 100)。
值列将始终位于每个工作表的G列中。我在每个工作表的G列的底部编写了以下代码:-
Sub WorksheetLoop()
Dim WS_Count As Integer
Dim I As Integer
Dim LR As Long
WS_Count = ActiveWorkbook.Worksheets.Count
For I = 1 To WS_Count
LR = Range("G" & Rows.Count).End(xlUp).Row
Range("G" & LR + 1).Formula = "=SUM(G4:G" & LR & ")"
Worksheets(ActiveSheet.Index + 1).Select
Next I
End Sub
它运行,但是一旦汇总了最终的工作表,就会出现以下运行时错误:-
运行时错误'9':下标超出范围
我一直在研究其他线程并应用不同的方法,一些方法也可以工作,但是会触发运行时错误91 。
如果我在for语句的结尾或出口处进行处理,则仅在一次计算后失败。
我认为问题出在Worksheets(ActiveSheet.Index + 1).Select
上,当没有活动表要处理时,问题就会落空。
答案 0 :(得分:1)
工作簿中的工作表是Collection
。关于集合的好处是,您可以使用For...Each
循环遍历集合中的每个项目。
下面的代码将逐步浏览包含代码(Worksheet
)的工作簿中Worksheets
集合中的每个ThisWorkbook
。您可以将其更改为ActiveWorkbook
,这对于当时正处于活动状态的任何工作簿都将执行相同的操作。
该代码不是返回G列中最后一个单元格的行号,而是返回对实际单元格的引用,然后返回Offset
一行,以获取下一个空白行。
R1C1
样式用于范围引用-R4C
表示公式所在的第4行。 R[-1]C
表示公式上方的行,无论该公式位于哪一列。因此,R4C:R[-1]C
放在单元格G8
中的意思是G4:G7
。
Sub WorkSheetLoop()
Dim wrkSht As Worksheet
Dim rLastCell As Range
For Each wrkSht In ThisWorkbook.Worksheets
Set rLastCell = wrkSht.Cells(wrkSht.Rows.Count, 7).End(xlUp)
If rLastCell.Row > 4 Then
rLastCell.Offset(1).FormulaR1C1 = "=SUM(R4C:R[-1]C)"
End If
Next wrkSht
End Sub
为什么您的版本不起作用
出现运行时错误#9的原因是因为您的代码试图选择不存在的工作表。
例如,您的代码从两张工作簿中选择的第一张纸开始:
循环1:
LR
。 SUM
公式已添加到第一张工作表。循环2:
LR
。SUM
公式已添加到第二张工作表中。如果您删除了Worksheets(ActiveSheet.Index + 1).Select
行并添加了Worksheets(I).Select
作为循环的第一行,那么您的代码将起作用。
此外,您的代码可以从所选的任何工作表开始-如果代码启动时最后一个工作表处于活动状态,则它将总和添加到该工作表中,然后尝试选择下一个工作表,导致它在第一个循环中失败。
答案 1 :(得分:0)
一旦到达工作表集合中的最后一个工作表,尝试worksheets(ActiveSheet.Index + 1).Select
就会尝试选择不存在的东西。
由于没有实际理由选择工作表来添加公式avoid using Select。
Dim I As Integer, LR As Long
For I = 1 To ActiveWorkbook.Worksheets.Count
with ActiveWorkbook.Worksheets(I)
LR = .Range("G" & .Rows.Count).End(xlUp).Row
.Range("G" & LR + 1).Formula = "=SUM(G4:G" & LR & ")"
end with
Next I