Подскажите пожалуйста как вычислить общую сумму чистой прибыли по всем городам используя окно 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
Спасибо, всё работает.