Форум по VBA, Excel и Word

VBA, Excel => VBA, макросы в Excel => Тема начата: Посетитель 05.03.2023 от 16 марта 2023, 21:31

Название: Общая сумма Чистой прибыли по всем листам в окне Msg box
Отправлено: Посетитель 05.03.2023 от 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
Название: От: Общая сумма Чистой прибыли по всем листам в окне Msg box
Отправлено: Администратор от 16 марта 2023, 22:28
По этому пункту у вас вопрос:?
    'Цикл для поиска"Чистой прибылью"
    Do Until ActiveWorkbook.Worksheets(i).Cells(row_num, 1) = "Чистая прибыль"
        row_num = row_num + 1
    Loop

Всё остальное у вас правильно?
Название: От: Общая сумма Чистой прибыли по всем листам в окне Msg box
Отправлено: Посетитель 05.03.2023 от 17 марта 2023, 19:52
Здравствуйте. Да по этому пункту, он отмечается как ошибка и выделяется жёлтым цветом. Я скинул файл в котором примерное задание, показатель «Чистая прибыль» называется по-разному: "Чистая прибыль", "Прибыль" и т.д. Но в ячейках с названием этого показателя всегда есть отступ, плюс ответ надо вывести не в окне immediate, а сумму общей по всем листам "Чистой прибыли" в окне Msg box.
Название: От: Общая сумма Чистой прибыли по всем листам в окне Msg box
Отправлено: Администратор от 17 марта 2023, 21:36
В столбце A чистая прибыль всегда находится в самом низу или под чистой прибылью могут бы ещё другие данные?
Название: От: Общая сумма Чистой прибыли по всем листам в окне Msg box
Отправлено: Посетитель 05.03.2023 от 17 марта 2023, 22:16
Да, в столбце А чистая прибыль всегда находится внизу, но на некоторых листах первые строки столбца А пустые(но чистая прибыль всегда последняя запись).
Название: От: Общая сумма Чистой прибыли по всем листам в окне Msg box
Отправлено: Посетитель 05.03.2023 от 18 марта 2023, 11:19
Здравствуйте. Там где в ячейках с текстом  "чистая прибыль";"ЧП";" Прибыль", не пробел, а отступ, для поиска этой ячейки нужно использовать IndentLevel и как то сложить все числа общей прибыли в одно число.
Название: От: Общая сумма Чистой прибыли по всем листам в окне Msg box
Отправлено: Администратор от 18 марта 2023, 11:30
В вашем случае нужно искать последнюю заполненную строку в столбце 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
[свернуть]
Название: От: Общая сумма Чистой прибыли по всем листам в окне Msg box
Отправлено: Посетитель 05.03.2023 от 18 марта 2023, 16:50
Почти получилось, но итог должен выглядеть вот так, посмотрите пожалуйста, скинул скрин во вкладке.
Название: От: Общая сумма Чистой прибыли по всем листам в окне Msg box
Отправлено: Администратор от 18 марта 2023, 16:54
Макрос
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
[свернуть]
Название: От: Общая сумма Чистой прибыли по всем листам в окне Msg box
Отправлено: Посетитель 05.03.2023 от 18 марта 2023, 17:08
Спасибо, всё работает.