【问题标题】:VBA - sum totals to a master worksheetVBA - 汇总到主工作表
【发布时间】:2018-10-17 08:20:22
【问题描述】:

好的,到此为止。我有一个工作簿,每天都有单独的工作表,详细说明股票交易活动。我目前还有一个 VBA,它为每个工作表上的指定列提供总和,这很好用。

但是,我想做的是添加到我的 VBA 中,以便它在主工作表中提供这些列的总和。

因此,例如:如果工作表 1 上 2018 年 10 月 1 日的交易活动总计 400 万,工作表 2 上 2018 年 10 月 2 日的交易活动总计 300 万,我希望在主表上显示总计 700 万工作表。

我在下面附上了我当前的 vba,当前在每个工作表上求和的列是 J。在单个工作表上求和的列不会改变,但是这些列中包含的数据量显然取决于交易活动.

Sub autoSum_AllSheets()
    Dim ws As Worksheet
    Dim cel1 As String, cel2 As String
    Dim firstCel As Range

    For Each ws In ActiveWorkbook.Worksheets
        With ws
            Set firstCel = .Range("J3").End(xlDown).Offset(2, 0)
            cel1 = firstCel.Offset(-2, 0).End(xlUp).Address
            cel2 = firstCel.Offset(-1).Address
            firstCel.Value = "=SUM(" & cel1 & ":" & cel2 & ")"
        End With
    Next ws
End Sub

我还附上了从随机日期截取的当前模拟工作表的屏幕截图,运行 vba 后得到的总和以粗体显示并以红色突出显示。

任何关于如何解决这个问题的建议都会很棒,因为我是 VBA 的新手。

编辑:我在下面的主工作表上附上了我想要实现的模拟截图:

【问题讨论】:

  • 您的代码到目前为止是否正常工作? 究竟是什么问题?有什么错误吗?你的问题是什么?你没有问。
  • 代码正在运行,我想做的是找出是否有办法将它在各个工作表上产生的当前总和也移动到主工作表上。例如,如果我回头查看第 39 周(10 月 1 日至 5 日)的数据,我可以从主工作表上的各个工作表中找到总和。

标签: excel vba function sum


【解决方案1】:

我推荐以下……

Option Explicit

Public Sub AutoSumAllWorkheets()
    Const MasterName As String = "Master" 'specify name of master sheet

    Dim wsMaster As Worksheet
    On Error Resume Next 'test if master exists
    Set wsMaster = ActiveWorkbook.Worksheets(MasterName)
    On Error GoTo 0

    If wsMaster Is Nothing Then 'add master if not exists
        Set wsMaster = ActiveWorkbook.Worksheets.Add(Before:=ActiveWorkbook.Worksheets(1))
        wsMaster.Name = MasterName
        'instead you can throw a message and exit here
        'MsgBox "No master found"
        'Exit Sub
    End If

    Dim FirstCell As Range, LastCell As Range

    Dim ws As Worksheet
    For Each ws In ActiveWorkbook.Worksheets
        With ws
            If .Name <> MasterName Then 'don't sum on master sheet
                Set FirstCell = .Range("J3")
                Set LastCell = FirstCell.End(xlDown)
                LastCell.Offset(2, 0).Formula = "=SUM(" & FirstCell.Address & ":" & LastCell.Address & ")"

                'write in master
                With wsMaster.Cells(wsMaster.Rows.Count, "A").End(xlUp)
                    .Offset(1, 0).Value = ws.Name
                    .Offset(1, 1).Formula = "=" & LastCell.Offset(2, 0).Address(External:=True)
                End With
            End If
        End With
    Next ws

    'sum all sheets up
    With wsMaster.Cells(wsMaster.Rows.Count, "A").End(xlUp)
        .Offset(2, 0).Value = "Total sum:"
        .Offset(2, 1).Formula = "=SUM(" & wsMaster.Cells(1, "B").Address & ":" & .Offset(0, 1).Address & ")"
    End With
End Sub

第一部分检查主表是否存在,如果不存在则添加一个。

然后我稍微改进了你的代码:

  • 我建议使用清晰的变量名称(使其更容易)。例如,您的 firstCel 实际上不是第一个而是总和单元格。这非常令人困惑,您很容易失败。
  • 使用.Formula 编写公式。
  • 我添加了一些代码来将每张表的总和写入主表。请注意,这会在主表中附加条目。因此,如果您运行两次,则需要先清除主表中的条目。

如果您想写入主表的另一列,只需将wsMaster.Cells(wsMaster.Rows.Count, "A").End(xlUp) 的列名从"A" 更改为例如"L"

【讨论】:

  • 谢谢,我已经尝试过您的代码,它会创建一个名为 master 的新工作表并在其中添加一个图形。然而,它现在已经停止包括各个工作表上的总和,有没有办法仍然保留这些?此外,有没有办法在运行 VBA 并进行计算后将日期添加到主工作表上的 a 列?
  • 这仍然会在 J 列中的每个单独的工作表上创建总和,并从 J3 到最后使用的单元格进行总和。调试您的代码(使用 F8 逐步检查)以查看每个步骤中发生的情况。
  • 我的错误,你是对的,你建议的代码有效。非常感谢!
【解决方案2】:

试试:

Sub test4()

Dim ws As Worksheet
Dim LastRowJ As Long
Dim MasterTotal As Double

For Each ws In ActiveWorkbook.Worksheets
    LastRowJ = ws.Cells(ws.Rows.Count, "J").End(xlUp).Row
    MasterTotal = MasterTotal + ws.Range("J" & LastRowJ).Value '<= Let us assume that total appears in each sheet at the last line in column J
Next ws

Sheet1.Range("A1").Value = MasterTotal '<= Change where you want to import the total of totals

End Sub

【讨论】:

  • 嗨,我应该补充一下,我已经有一个主工作表(我已经用它的屏幕截图编辑了我的帖子),其中包含其他数据。无论如何要指定我希望数据出现的列?因此,例如,是否有可能通过 VBA 以便在 F 列中我可以有一个显示日期范围的单元格(例如 10 月 1 日至 5 日),而在 J 列的相邻单元格中显示这些日期的总和值?我的截图将尝试证明这一点
猜你喜欢
  • 1970-01-01
  • 2019-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多