VBA - итоговые суммы на основной лист - PullRequest
0 голосов
/ 17 октября 2018

Хорошо, вот и все.У меня есть рабочая тетрадь с отдельными рабочими листами на каждый день, подробно описывающая деятельность по торговле акциями.В настоящее время у меня также есть VBA, который предоставляет итоговую сумму для указанных столбцов на каждой из этих таблиц, и это прекрасно работает.

Однако я хотел бы добавить это к моему VBA, чтобы он предоставлял суммуитого для этих столбцов в главную рабочую таблицу.

Так, например: Если на 1 октября 2018 года на рабочем листе 1 была торговая активность на общую сумму 4 млн, а на рабочем листе 2 на общую сумму 3 млн. на 2 октября 2018 года, яхотел бы, чтобы это общее количество 7 м показывалось на главном рабочем листе.

Я приложил свой текущий 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

Любой совет о том, как подойти к этому, был бы великолепен, так как я новичок во всех вещах VBA.

Редактировать: я приложил макет скриншота того, чего я пытаюсь достичь, на главном рабочем листе ниже:

master worksheet example of what i need

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Я рекомендую следующее…

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) с *От 1019 * до "L"

0 голосов
/ 17 октября 2018

Попробуйте:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...