Общая сумма Чистой прибыли по всем листам в окне Msg box

Автор Посетитель, 16 марта 2023, 21:31

Посетитель

Подскажите пожалуйста как вычислить общую сумму чистой прибыли по всем городам используя окно Msg box из процедуры представленной ниже,если чистая прибыль на каждом листе отличается по названию, но всегда есть пробел в начале.

Sub massiv()

Dim n As Integer, i As Integer, l As Integer, j As Integer ' Счётчики для циклов
Dim cities_revenue() As Variant
n = ActiveWorkbook.Worksheets.Count ' количество листов в активной рабочей книге
ReDim cities_revenue(n, 2)
For i = 1 To n
    cities_revenue(i, 1) = ActiveWorkbook.Worksheets(i).Name ' город по названию листа
    row_num = 1 ' Счётчик строк для поиска"Чистой прибыли"
   
    'Цикл для поиска"Чистой прибылью"
    Do Until ActiveWorkbook.Worksheets(i).Cells(row_num, 1) = "Чистая прибль"
        row_num = row_num + 1
    Loop
   
    cities_revenue(i, 2) = ActiveWorkbook.Worksheets(i).Cells(row_num, 2) ' данные по выручке к соответствующему городу
Next i
' Окно отладки
For l = 1 To n
    For j = 1 To 2
        Debug.Print cities_revenue(l, j)
    Next j
Next l
End Sub

Администратор

По этому пункту у вас вопрос:?
    'Цикл для поиска"Чистой прибылью"
    Do Until ActiveWorkbook.Worksheets(i).Cells(row_num, 1) = "Чистая прибыль"
        row_num = row_num + 1
    Loop

Всё остальное у вас правильно?

Посетитель

Здравствуйте. Да по этому пункту, он отмечается как ошибка и выделяется жёлтым цветом. Я скинул файл в котором примерное задание, показатель «Чистая прибыль» называется по-разному: "Чистая прибыль", "Прибыль" и т.д. Но в ячейках с названием этого показателя всегда есть отступ, плюс ответ надо вывести не в окне immediate, а сумму общей по всем листам "Чистой прибыли" в окне Msg box.

Администратор

В столбце A чистая прибыль всегда находится в самом низу или под чистой прибылью могут бы ещё другие данные?

Посетитель

Да, в столбце А чистая прибыль всегда находится внизу, но на некоторых листах первые строки столбца А пустые(но чистая прибыль всегда последняя запись).

Посетитель

Здравствуйте. Там где в ячейках с текстом  "чистая прибыль";"ЧП";" Прибыль", не пробел, а отступ, для поиска этой ячейки нужно использовать IndentLevel и как то сложить все числа общей прибыли в одно число.

Администратор

В вашем случае нужно искать последнюю заполненную строку в столбце A.
Если на листе скрытых строк нет (с помощью автофильтра или просто скрытых строк), то можно использовать "End(xlUp)".
Если есть скрытые строки, то есть два варианта:
1) перед поиском последней строки отобразите скрытые строки;
2) используйте другой способ поиска последней строки.

Макрос
Sub massiv()

Dim row_num As Long, Msg As String
Dim n As Integer, i As Integer, j As Integer ' счетчики для циклов
Dim cities_revenue() As Variant

n = ActiveWorkbook.Worksheets.Count ' количество листов в активной рабочей книге

ReDim cities_revenue(n, 2)

For i = 1 To n
    cities_revenue(i, 1) = ActiveWorkbook.Worksheets(i).Name ' заносим в массив название города (из названия листа)
   
    ' Поиск строки с "Чистой прибылью".
        ' Предполагается, что она всегда в самом низу.
    row_num = ActiveWorkbook.Worksheets(i).Cells(ActiveWorkbook.Worksheets(i).Rows.Count, "A").End(xlUp).Row
    ' Заносим в массив данные по выручке к соответствующему городу.
    cities_revenue(i, 2) = ActiveWorkbook.Worksheets(i).Cells(row_num, 2)

Next i

' Выводим данные из массива в окно отладки - для проверки
For i = 1 To n
    Msg = Msg & cities_revenue(i, 1) & ": " & cities_revenue(i, 2) & vbCr
Next i
Msg = Left(Msg, Len(Msg) - 1)
MsgBox Msg, vbInformation

End Sub
[свернуть]

Посетитель

Почти получилось, но итог должен выглядеть вот так, посмотрите пожалуйста, скинул скрин во вкладке.

Администратор

Макрос
Sub massiv()

Dim row_num As Long, Sum As Double
Dim n As Integer, i As Integer, j As Integer ' счетчики для циклов
Dim cities_revenue() As Variant

n = ActiveWorkbook.Worksheets.Count ' количество листов в активной рабочей книге

ReDim cities_revenue(n, 2)

For i = 1 To n
    cities_revenue(i, 1) = ActiveWorkbook.Worksheets(i).Name ' заносим в массив название города (из названия листа)
   
    ' Поиск строки с "Чистой прибылью".
        ' Предполагается, что она всегда в самом низу.
    row_num = ActiveWorkbook.Worksheets(i).Cells(ActiveWorkbook.Worksheets(i).Rows.Count, "A").End(xlUp).Row
    ' Заносим в массив данные по выручке к соответствующему городу.
    cities_revenue(i, 2) = ActiveWorkbook.Worksheets(i).Cells(row_num, 2)

Next i

' Суммирование прибылей со всех листов и отображение суммы в сообщении.
For i = 1 To n
    Sum = Sum + cities_revenue(i, 2)
Next i
MsgBox "Общая прибыль: " & Sum, vbInformation

End Sub
[свернуть]

Посетитель