Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA-主工作表总计_Excel_Vba_Function_Sum - Fatal编程技术网

Excel VBA-主工作表总计

Excel VBA-主工作表总计,excel,vba,function,sum,Excel,Vba,Function,Sum,好了,开始吧。我有一份工作手册,每天都有单独的工作表,详细说明股票交易活动。我目前还有一个VBA,它为每个工作表上的指定列提供总计,这很好 但是,我想做的是将VBA添加到主工作表中,以便它为这些列提供总计 因此,例如:如果工作表1中2018年10月1日的交易活动总数为400万,工作表2中2018年10月2日的交易活动总数为300万,我希望在主工作表中显示700万 我在下面附上了我当前的vba,每个工作表上当前汇总的列是J。各个工作表上汇总的列没有变化,但是这些列中包含的数据量显然会根据交易活动而

好了,开始吧。我有一份工作手册,每天都有单独的工作表,详细说明股票交易活动。我目前还有一个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的新手

编辑:我在下面的主工作表上附上了一个模拟屏幕截图,展示了我想要实现的目标:

尝试:


我建议如下

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.cellsmaster.Rows.Count、A.EndxlUp的列名从A更改为eg L

到目前为止,您的代码是否正常工作?究竟是什么问题?有错误吗?你的问题是什么?你没有问。代码正在运行,我想做的是找出是否有办法将它在各个工作表上产生的当前总和也移到主工作表上。例如,如果我回去查看10月1日至5日第39周的数据,我可以从主工作表上的各个工作表中找到总数。嗨,我应该补充一下,我已经有了一个主工作表,我已经编辑了我的文章,其中有一个屏幕截图,其中包含其他数据。是否仍要指定我希望数据显示的列?例如,是否可以通过VBA在F列中显示日期范围(例如10月1日至5日),在J列的相邻单元格中显示这些日期的总和?我的截图将尝试演示这一点谢谢,我已经尝试了你的代码,它创建了一个名为master的新工作表,并在其中添加了一个图形。然而,它现在已经停止在各个工作表上包含总计,有没有办法也保留这些合计?此外,在主工作表a列运行VBA并进行计算后,是否有方法将日期添加到主工作表a列?这仍然会在J列中的每个工作表上创建总和,并将J3和最后使用的单元格相加。调试你的代码使用F8一步一步地检查它,看看每一步都发生了什么。我错了,你是对的,你建议的代码是有效的。非常感谢你!
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