首页 文章

Excel VBA - 跨工作表的总和值

提问于
浏览
0

我有一份工作手册,每周报告一次 . 到本周末,它将包含8个工作表,一个用于一周中的每一天,第八个工作表用于报告整周的值 . 工作表:周一,周二,周三,周四,周五,周六,周日,周

每个工作表的格式完全相同,并从模板表中复制 .

为了保持简单,我把它煮成一个单元格B12 .

工作中的B12“周”需要等于:=星期一!B12星期二!B12星期三!B12星期四!B12星期五!B12星期六!B12太阳!B12

我打算用VBA将上面的公式插入到工作表“Week”的Cell B12中,但是我有几个问题:

1)并非所有日常工作表都存在,例如,如果我在星期三运行报告,则仅存在“星期一”和“星期二” . 如果我在星期六运行报告,将会出现“星期一”,“星期二”,“星期三”,“星期四”和“星期五” . 这意味着我不能只将上面的公式插入到“周”的单元格B12中,因为我得到了#REF!由于不存在的工作表导致的错误 .

因此,我需要一些代码来添加7张日常工作表中的任何一张的所有B12值,但仅限于该工作表存在时 .

因此,如果我在星期三运行报告它等于:=星期一!B12星期二!B12

如果我在星期六运行报告它等于:=星期一!B12星期二!B12星期三!B12星期四!B12星期五!B12

2)我的第二个问题是,这不仅适用于单元格B12,也不适用于另外100个单元格,它们不是全部在一个范围内,它们是分散的,有些是合并的单元格等等 . 所以虽然我是谈到B12试图简化这篇文章,我希望能够轻松地将解决方案应用于许多其他单元格而无需写出数百个if语句等 .

希望这是有道理的 .

这是我到目前为止所处的地方,但它不起作用:

Sub test()

Dim ws As Worksheet
Dim testVar As Double
Dim wsName As String
wsName = ws.Name
For Each ws In ActiveWorkbook.Worksheets
Select Case wsName
    Case "Mon", "Tue", "Wed", "Thur", "Fri", "Sat", "Sun"
        testVar = testVar + Worksheets(wsName).Range("B12").Value
End Select
Next ws

Worksheets("Week").Range("B12").Value = testVar

End Sub

干杯

4 回答

  • 0

    试一试 .

    Sub test()
    
    Dim ws As Worksheet
    Dim testVar As Double
    Dim rng As Range
    
    Set rng = Selection
    
    For Each c In rng
    
        For Each ws In ActiveWorkbook.Worksheets
            Select Case ws.Name
                Case "Mon", "Tue", "Wed", "Thur", "Fri", "Sat", "Sun"
                    testVar = testVar + ws.Range(c.Address).Value
            End Select
        Next ws
    
        Worksheets("Week").Range(c.Address).Value = testVar
        testVar = 0
    
    Next c
    
    End Sub
    

    您应该能够在“周”工作表中选择任何范围或单个单元格,然后点击宏以获取日常工作表中匹配单元格的总和 .

  • 0

    如果我理解正确,您每天都会有一个包含一定数量的工作表的文件,另外还有报告表作为最后一页 .
    然后你可以使用n = ThisWorkbook.Sheets.Count,这将是总页数并获得表(1)到表(n-1)的总和 .
    像这样的东西:

    x = 0
    n = ActiveWorkbook.Sheets.Count
    For i = 1 To n - 1
    x = x + Sheets(i).Range("B12").Value
    Next i
    Sheets(n).Range("B12") = x
    
  • 0

    好吧,我让它工作,但我决定将它用作函数,而不是最小化我需要编写的代码量 .

    我写了以下作为例子:

    Function sumWeekly(cellToSum As Range)
    
    Dim ws As Worksheet
    Dim cumulativeVar As Double
    Dim wsName As String
    For Each ws In ActiveWorkbook.Worksheets
    wsName = ws.Name
    Select Case wsName
        Case "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"
            cumulativeVar = cumulativeVar + Worksheets(wsName).Range(cellToSum.Column & cellToSum.Row).Value
    End Select
    Next ws
    
    Worksheets("Week").Range(cellToSum.Column & cellToSum.Row).Value = cumulativeVar
    
    End Function
    
    Sub test()
    
    Dim ppcsessions As Range
    
    Set ppcsessions = Worksheets("Mon").Range("B12:B12")
    
    sumWeekly (ppcsessions)
    
    End Sub
    

    但当我打电话给“测试”时,我得到了一个对象!错误?

  • 0

    以下是适当函数的代码:

    Function sumWeekly(cellToSum As String) As Double
    
    Dim ws As Worksheet
    Dim cumulativeVar As Double
    
    For Each ws In ActiveWorkbook.Worksheets
    Select Case ws.Name
        Case "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"
            cumulativeVar = cumulativeVar + Worksheets(ws.Name).Range(cellToSum).Value
    End Select
    Next ws
    
    sumWeekly = cumulativeVar
    
    End Function
    

    然后会像这样调用它:

    Sub test()
    
    Dim ppcsessions() As String
    Dim i As Long
    
    'load this array with all the ranges desired.
    ppcsessions = Array("B12", "I11", "G13")
    
    For i = LBound(ppcseesions) To UBound(ppcsessions)
        Worksheets("WEEK").Range(ppcseesions(i)).Value = sumWeekly(ppcsessions(i))
    Next i
    
    End Sub
    

相关问题