将总和添加到每个工作表

时间:2018-12-04 10:49:47

标签: excel

我有一个工作簿,其中包含不一致数量的工作表(因此在任何给定时间可以是<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上,当没有活动表要处理时,问题就会落空。

2 个答案:

答案 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