VBA, Обработка массивов

Верно, я об этом не подумал :frowning:

Просто я обычно в подобных циклах пляшу от координат ячеек, чтоб проще было ориентироваться на листе

Что именно? В том сообщении речь не о том, как исправить конкретную проблему (для этого надо сначала понять причину), а об универсальном способе поиска причин неправильно работающего кода.

Sub fuctoind()
'Сначала объявляем переменные, используемые в программе.
'стоимость книги
Dim cena(10, 3) As Double
'количество (по месяцам)
Dim koll(10, 3) As Integer
’ количество книг за 3 месяцa
Dim kol_n(10) As Integer
'доход за каждый месяц и общий доход за весь период
Dim doh(4) As Double
’ книга с наибольшей прибылью.
Dim kniga As Integer
’ доход с книги, принесшей наибольший доход
Dim dohl As Double
'счетчики циклов
Dim i As Integer, j As Integer, p As Integer

’ Далее всем переменным присваивается нулевое значение
For i = 1 To 10
kol_n(i) = 0
Next
For j = 1 To 3
doh(j) = 0
Next
For p = 1 To 3
Next
doh1 = 0
kniga = 0

'В этом фрагменте кода происходит считывание начальных
'данных с листа <<Нач_д>>, и в каждую ячейку массива
'cena(10,3) записывается стоимость каждой книги, а в
'ячейках двумерного массива koll(10,3) теперь находится
'количество книг каждого вида, изготовленных в
'каждый из месяцев.
Sheets(“Нач_д”).Select
For i = 1 To 10
For p = 1 To 3
cena(i, p) = Cells(3 + i, 1 + p)
Next p
Next i

For i = 1 To 10
For j = 1 To 3
koll(i, j) = Cells(3 + i, 4 + j)
Next j
Next i

'Далее на листе <<Результат>> в ячейку с определенным
'номером вводится ее название.
Sheets(“Результат”).Select
Cells(1, 1) = “Количество проданных книг”
Cells(2, 1) = “Наименование”
Cells(2, 2) = “Стоимость”
Cells(2, 5) = “Количество”
Cells(3, 2) = “1 месяц”
Cells(3, 3) = “2 месяц”
Cells(3, 4) = “3 месяц”
Cells(3, 5) = “1 месяц”
Cells(3, 6) = “2 месяц”
Cells(3, 7) = “3 месяц”
Cells(4, 1) = “Молодая гвардия (A.Фадеев)”
Cells(5, 1) = “Война и мир (Л.Н.Толстой)”
Cells(6, 1) = “Детство Никиты (А.Н. Толстой)”
Cells(7, 1) = “Два капитана (В. Каверин)”
Cells(8, 1) = “Рассказы (Т.Драйзер)”
Cells(9, 1) = “Избранное (Э. Хемингуэй)”
Cells(10, 1) = “Молдавские народные сказки”
Cells(11, 1) = “Поэмы. Стихи (А. Твардовский)”
Cells(12, 1) = “Мастер и Маргарита (М. Булгаков)”
Cells(13, 1) = “Три мушкетера (А. Дюма)”
Cells(2, 8) = " Количество книг за 3 месяца"

'В этом фрагменте происходит вывод на рабочий лист
'доходов по книгам в каждый месяц и
’ количество проданных книг за месяц
For i = 1 To 10
For p = 1 To 3
Cells(3 + i, 1 + p) = cena(i, p)
Next p
For j = 1 To 3
Cells(3 + i, 4 + j) = koll(i, j)
kol_n(i) = kol_n(i) + koll(i, j)
Next j
Cells(3 + i, 8) = kol_n(i)
Next i

'Ниже происходит ввод названий соответствующих
'столбцов и строк.
Cells(17, 1) = “Результат в денежном эквиваленте”
Cells(18, 1) = “Наименование”
Cells(18, 2) = “Стоимость”
Cells(18, 5) = “Доход”
Cells(18, 8) = “Всего” 'Общий доход за 3 месяца
Cells(19, 2) = “1 месяц”
Cells(19, 3) = “2 месяц”
Cells(19, 4) = “3 месяц”
Cells(19, 5) = “1 месяц”
Cells(19, 6) = “2 месяц”
Cells(19, 7) = “3 месяц”
Cells(20, 1) = “Молодая гвардия (A.Фадеев)”
Cells(21, 1) = “Война и мир (Л.Н.Толстой)”
Cells(22, 1) = “Детство Никиты (А.Н. Толстой)”
Cells(23, 1) = “Два капитана (В. Каверин)”
Cells(24, 1) = “Рассказы (Т.Драйзер)”
Cells(25, 1) = “Избранное (Э. Хемингуэй)”
Cells(26, 1) = “Молдавские народные сказки”
Cells(27, 1) = “Поэмы. Стихи (А. Твардовский)”
Cells(28, 1) = “Мастер и Маргарита (М. Булгаков)”
Cells(29, 1) = “Три мушкетера (А. Дюма)”
Cells(30, 1) = “Итого”

'Во внутреннем цикле происходит вычисление суммы
'дохода по i-му изделию в j-й месяц с выводом
'результата, а во внешнем цикле (после получения
'результатов внутреннего цикла, происходит вывод
'стоимости одной книги и по всем книгам. Расчет
'дохода за каждый месяц организован в
'этом же внутреннем цикле.
For i = 1 To 10
For p = 1 To 3
Cells(19 + i, 1 + p) = cena(i, p)
For j = 1 To 3
Cells(19 + i, 4 + j) = koll(i, j) * cena(i, p)
doh(j) = doh(j) + koll(i, j) * cena(i, p)
doh(4) = doh(4) + koll(i, j) * cena(i, p)
Next j
Cells(19 + i, 2) = cena(i, p)
Cells(19 + i, 8) = cena(i, p) * kol_n(i)
Next p
Next i

'Здесь описан алгоритм сравнения некоторого
'дохода с доходом, полученным
'в один из трех месяцев. Если рассматриваемый
'больше другого, то сумме наибольшего дохода
'присваивается текущее значение, а днем с
'максимальным заработком становится день
'под номером j.
For j = 1 To 3
Cells(30, 4 + j) = doh(j)
If doh(j) > doh1 Then
doh1 = doh(j)
kniga = j
End If
Next j

'Ниже выводится на лист с результатом работы программы
'доход за 3 месяца, книга с максимальным
'доходом и сколько она принесла дохода.
Cells(30, 8) = doh(4)
Cells(31, 1) = “Доход за 3 месяца”
Cells(31, 5) = doh(4)
Cells(32, 1) = “Книга с наибольшим доходом”
Cells(32, 5) = kniga
Cells(32, 7) = “Доход c книги”
Cells(32, 8) = doh1
End Sub

Я все исправил, только теперь проблема в том, что книга с наибольшим доходом у меня обозначается числом. Как сделать так, Чтобы в ячейку (32, 6) вводилось название этой книги

спасибо, я разобрался. Можете теперь предложить, что нибудь, чтобы в ячейке (32, 6) вводилось название книги?

Cells(32, 6) = Cells(kniga, 1)

спасибо большое



Sub fuctoind()
'Сначала объявляем переменные, используемые в программе.
'стоимость книги
Dim cena(10, 3) As Double
'количество (по месяцам)
Dim koll(10, 3) As Integer
' количество книг за 3 месяцa
Dim kol_n(10) As Integer
'доход за каждый месяц и общий доход за весь период
Dim doh(4) As Double
' книга с наибольшей прибылью.
Dim kniga As Integer
' доход с книги, принесшей наибольший доход
Dim dohl As Double
'счетчики циклов
Dim i As Integer, j As Integer, p As Integer

' Далее всем переменным присваивается нулевое значение
For i = 1 To 10
kol_n(i) = 0
Next
For j = 1 To 3
doh(j) = 0
Next
For p = 1 To 3
Next
doh1 = 0
kniga = 0

'В этом фрагменте кода происходит считывание начальных
'данных с листа <<Нач_д>>, и в каждую ячейку массива
'cena(10,3) записывается стоимость каждой книги, а в
'ячейках двумерного массива koll(10,3) теперь находится
'количество книг каждого вида, изготовленных в
'каждый из месяцев.
Sheets("Нач_д").Select
For i = 1 To 10
For p = 1 To 3
cena(i, p) = Cells(3 + i, 1 + p)
Next p
Next i

For i = 1 To 10
For j = 1 To 3
koll(i, j) = Cells(3 + i, 4 + j)
Next j
Next i

'Далее на листе <<Результат>> в ячейку с определенным
'номером вводится ее название.
Sheets("Результат").Select
Cells(1, 1) = "Количество проданных книг"
Cells(2, 1) = "Наименование"
Cells(2, 2) = "Стоимость"
Cells(2, 5) = "Количество"
Cells(3, 2) = "1 месяц"
Cells(3, 3) = "2 месяц"
Cells(3, 4) = "3 месяц"
Cells(3, 5) = "1 месяц"
Cells(3, 6) = "2 месяц"
Cells(3, 7) = "3 месяц"
Cells(4, 1) = "Молодая гвардия (A.Фадеев)"
Cells(5, 1) = "Война и мир (Л.Н.Толстой)"
Cells(6, 1) = "Детство Никиты (А.Н. Толстой)"
Cells(7, 1) = "Два капитана (В. Каверин)"
Cells(8, 1) = "Рассказы (Т.Драйзер)"
Cells(9, 1) = "Избранное (Э. Хемингуэй)"
Cells(10, 1) = "Молдавские народные сказки"
Cells(11, 1) = "Поэмы. Стихи (А. Твардовский)"
Cells(12, 1) = "Мастер и Маргарита (М. Булгаков)"
Cells(13, 1) = "Три мушкетера (А. Дюма)"

'В этом фрагменте происходит вывод на рабочий лист
'доходов по книгам в каждый месяц и
' количество проданных книг за месяц
For i = 1 To 10
For p = 1 To 3
Cells(3 + i, 1 + p) = cena(i, p)
Next p
For j = 1 To 3
Cells(3 + i, 4 + j) = koll(i, j) * cena(i, p)
Next j
Next i

'Ниже происходит ввод названий соответствующих
'столбцов и строк.
Cells(17, 1) = "Результат в денежном эквиваленте"
Cells(18, 1) = "Наименование"
Cells(18, 2) = "Стоимость"
Cells(18, 5) = "Доход"
Cells(18, 8) = "Всего"  'Общий доход за 3 месяца
Cells(19, 2) = "1 месяц"
Cells(19, 3) = "2 месяц"
Cells(19, 4) = "3 месяц"
Cells(19, 5) = "1 месяц"
Cells(19, 6) = "2 месяц"
Cells(19, 7) = "3 месяц"
Cells(20, 1) = "Молодая гвардия (A.Фадеев)"
Cells(21, 1) = "Война и мир (Л.Н.Толстой)"
Cells(22, 1) = "Детство Никиты (А.Н. Толстой)"
Cells(23, 1) = "Два капитана (В. Каверин)"
Cells(24, 1) = "Рассказы (Т.Драйзер)"
Cells(25, 1) = "Избранное (Э. Хемингуэй)"
Cells(26, 1) = "Молдавские народные сказки"
Cells(27, 1) = "Поэмы. Стихи (А. Твардовский)"
Cells(28, 1) = "Мастер и Маргарита (М. Булгаков)"
Cells(29, 1) = "Три мушкетера (А. Дюма)"
Cells(30, 1) = "Итого"

'Во внутреннем цикле происходит вычисление суммы
'дохода по i-му изделию в j-й месяц с выводом
'результата, а во внешнем цикле (после получения
'результатов внутреннего цикла, происходит вывод
'стоимости одной книги и по всем книгам. Расчет
'дохода за каждый месяц организован в
'этом же внутреннем цикле.
For i = 1 To 10
 For p = 1 To 3
 Cells(19 + i, 1 + p) = cena(i, p)
  For j = 1 To 3
  Cells(19 + i, 4 + j) = koll(i, j) * cena(i, p)
  doh(j) = doh(j) + koll(i, j) * cena(i, p)
  doh(4) = doh(4) + koll(i, j) * cena(i, p)
  Next j
 Cells(19 + i, 8) = cena(i, p) * kol_n(i)
 Next p
Next i

'Здесь описан алгоритм сравнения некоторого
'дохода с доходом, полученным
'в один из трех месяцев. Если рассматриваемый
'больше другого, то сумме наибольшего дохода
'присваивается текущее значение, а днем с
'максимальным заработком становится день
'под номером j.
For j = 1 To 3
If doh(j) > doh1 Then
doh1 = doh(j)
kniga = j
End If
Next j

'Ниже выводится на лист с результатом работы программы
'доход за 3 месяца, книга с максимальным
'доходом и сколько она принесла дохода.
Cells(30, 8) = doh(4)
Cells(31, 1) = "Книга с наибольшим доходом"
Cells(31, 2) = kniga
Cells(31, 3) = Cells(3 + kniga, 1)
Cells(31, 6) = "Доход c книги"
Cells(31, 8) = doh1
End Sub

я не могу понять, почему у меня доход за месяц неправильно вычисляется

то есть выделенные ячейки показывают мне неправильные вычисления

Вот тут у Вас в цикле по j cena(i, p) используется вне цикла по p. То есть p в этой формуле всегда будет равен 3.

For p = 1 To 3
Cells(3 + i, 1 + p) = cena(i, p)
Next p
For j = 1 To 3
Cells(3 + i, 4 + j) = koll(i, j) * cena(i, p)
Next j

Я правильно понял, что сюда вставлять надо?

я не понял где исправлять этот цикл

Надо форматировать код нормально, выставлять отступы. Тогда всё будет понятно.
И используйте кнопку Код при вставке кода на форум, чтоб отступы оставались (если конечно они были во вставленном коде).

Например, так (закинул в https://www.automateexcel.com/vba-code-indenter/):

Sub fuctoind()
    'Сначала объявляем переменные, используемые в программе.
    'стоимость книги
    Dim cena(10, 3) As Double
    'количество (по месяцам)
    Dim koll(10, 3) As Integer
    ' количество книг за 3 месяцa
    Dim kol_n(10)   As Integer
    'доход за каждый месяц и общий доход за весь период
    Dim doh(4)      As Double
    ' книга с наибольшей прибылью.
    Dim kniga       As Integer
    ' доход с книги, принесшей наибольший доход
    Dim dohl        As Double
    'счетчики циклов
    Dim i           As Integer, j As Integer, p As Integer
    
    ' Далее всем переменным присваивается нулевое значение
    For i = 1 To 10
        kol_n(i) = 0
    Next
    For j = 1 To 3
        doh(j) = 0
    Next
    For p = 1 To 3
    Next
    doh1 = 0
    kniga = 0
    
    'В этом фрагменте кода происходит считывание начальных
    'данных с листа <<Нач_д>>, и в каждую ячейку массива
    'cena(10,3) записывается стоимость каждой книги, а в
    'ячейках двумерного массива koll(10,3) теперь находится
    'количество книг каждого вида, изготовленных в
    'каждый из месяцев.
    Sheets("Нач_д").Select
    For i = 1 To 10
        For p = 1 To 3
            cena(i, p) = Cells(3 + i, 1 + p)
        Next p
    Next i
    
    For i = 1 To 10
        For j = 1 To 3
            koll(i, j) = Cells(3 + i, 4 + j)
        Next j
    Next i
    
    'Далее на листе <<Результат>> в ячейку с определенным
    'номером вводится ее название.
    Sheets("Результат").Select
    Cells(1, 1) = "Количество проданных книг"
    Cells(2, 1) = "Наименование"
    Cells(2, 2) = "Стоимость"
    Cells(2, 5) = "Количество"
    Cells(3, 2) = "1 месяц"
    Cells(3, 3) = "2 месяц"
    Cells(3, 4) = "3 месяц"
    Cells(3, 5) = "1 месяц"
    Cells(3, 6) = "2 месяц"
    Cells(3, 7) = "3 месяц"
    Cells(4, 1) = "Молодая гвардия (A.Фадеев)"
    Cells(5, 1) = "Война и мир (Л.Н.Толстой)"
    Cells(6, 1) = "Детство Никиты (А.Н. Толстой)"
    Cells(7, 1) = "Два капитана (В. Каверин)"
    Cells(8, 1) = "Рассказы (Т.Драйзер)"
    Cells(9, 1) = "Избранное (Э. Хемингуэй)"
    Cells(10, 1) = "Молдавские народные сказки"
    Cells(11, 1) = "Поэмы. Стихи (А. Твардовский)"
    Cells(12, 1) = "Мастер и Маргарита (М. Булгаков)"
    Cells(13, 1) = "Три мушкетера (А. Дюма)"
    
    'В этом фрагменте происходит вывод на рабочий лист
    'доходов по книгам в каждый месяц и
    ' количество проданных книг за месяц
    For i = 1 To 10
        For p = 1 To 3
            Cells(3 + i, 1 + p) = cena(i, p)
        Next p
        For j = 1 To 3
            Cells(3 + i, 4 + j) = koll(i, j) * cena(i, p)
        Next j
    Next i
    
    'Ниже происходит ввод названий соответствующих
    'столбцов и строк.
    Cells(17, 1) = "Результат в денежном эквиваленте"
    Cells(18, 1) = "Наименование"
    Cells(18, 2) = "Стоимость"
    Cells(18, 5) = "Доход"
    Cells(18, 8) = "Всего"        'Общий доход за 3 месяца
    Cells(19, 2) = "1 месяц"
    Cells(19, 3) = "2 месяц"
    Cells(19, 4) = "3 месяц"
    Cells(19, 5) = "1 месяц"
    Cells(19, 6) = "2 месяц"
    Cells(19, 7) = "3 месяц"
    Cells(20, 1) = "Молодая гвардия (A.Фадеев)"
    Cells(21, 1) = "Война и мир (Л.Н.Толстой)"
    Cells(22, 1) = "Детство Никиты (А.Н. Толстой)"
    Cells(23, 1) = "Два капитана (В. Каверин)"
    Cells(24, 1) = "Рассказы (Т.Драйзер)"
    Cells(25, 1) = "Избранное (Э. Хемингуэй)"
    Cells(26, 1) = "Молдавские народные сказки"
    Cells(27, 1) = "Поэмы. Стихи (А. Твардовский)"
    Cells(28, 1) = "Мастер и Маргарита (М. Булгаков)"
    Cells(29, 1) = "Три мушкетера (А. Дюма)"
    Cells(30, 1) = "Итого"
    
    'Во внутреннем цикле происходит вычисление суммы
    'дохода по i-му изделию в j-й месяц с выводом
    'результата, а во внешнем цикле (после получения
    'результатов внутреннего цикла, происходит вывод
    'стоимости одной книги и по всем книгам. Расчет
    'дохода за каждый месяц организован в
    'этом же внутреннем цикле.
    For i = 1 To 10
        For p = 1 To 3
            Cells(19 + i, 1 + p) = cena(i, p)
            For j = 1 To 3
                Cells(19 + i, 4 + j) = koll(i, j) * cena(i, p)
                doh(j) = doh(j) + koll(i, j) * cena(i, p)
                doh(4) = doh(4) + koll(i, j) * cena(i, p)
            Next j
            Cells(19 + i, 8) = cena(i, p) * kol_n(i)
        Next p
    Next i
    
    'Здесь описан алгоритм сравнения некоторого
    'дохода с доходом, полученным
    'в один из трех месяцев. Если рассматриваемый
    'больше другого, то сумме наибольшего дохода
    'присваивается текущее значение, а днем с
    'максимальным заработком становится день
    'под номером j.
    For j = 1 To 3
        If doh(j) > doh1 Then
            doh1 = doh(j)
            kniga = j
        End If
    Next j
    
    'Ниже выводится на лист с результатом работы программы
    'доход за 3 месяца, книга с максимальным
    'доходом и сколько она принесла дохода.
    Cells(30, 8) = doh(4)
    Cells(31, 1) = "Книга с наибольшим доходом"
    Cells(31, 2) = kniga
    Cells(31, 3) = Cells(3 + kniga, 1)
    Cells(31, 6) = "Доход c книги"
    Cells(31, 8) = doh1
End Sub

Тогда сразу видно, что тут во втором цикле используется переменная из предыдущего уже завершенного цикла:

        For p = 1 To 3
            Cells(3 + i, 1 + p) = cena(i, p)
        Next p
        For j = 1 To 3
            Cells(3 + i, 4 + j) = koll(i, j) * cena(i, p)
        Next j

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

это вообще другой кусок кода.
И @Sciv выше не говорил, что надо что-то куда-то вставлять. Только то, что в том куске вашего кода (показанном в его сообщении) вероятно ошибка.

то есть надо написать вот так?

Эксель мне пишет , что p здесь всегда равно 3. Почему так происходит?

Sheets(“Íà÷_ä”).Select
For i = 1 To 10
For p = 1 To 3
cena(i, p) = Cells(3 + i, 1 + p)
Next p
Next i

По-моему, там достаточно одного цикла

        For j = 1 To 3
            Cells(3 + i, 1 + j) = cena(i, j)
            Cells(3 + i, 4 + j) = koll(i, j) * cena(i, j)
        Next j

исправил, как теперь подсчитать сумму каждой строки в прибыли? и как исправить цикл, чтобы он смотрел прибыл с книги, а не с месяца? (это нужно для того, чтобы найти книгу с наибольшим доходом)

Option Explicit
' создать и работать на новом листе

Sub Task_1()
    '- исходные данные в виде таблицы, где указаны наименования книг, цена книги в каждом месяце, кол-во проданных книг за каждый месяц;
    With ActiveSheet
        .Range("$A$1") = "Исходные данные"
        .Range("$A$2") = "Наименование книги"
        .Range("$B$2") = "стоимость"
        .Range("$E$2") = "количество"
        .Range("$B$3") = "1-й месяц"
        .Range("$C$3") = "2-й месяц"
        .Range("$D$3") = "3-й месяц"
        .Range("$E$3") = "1-й месяц"
        .Range("$F$3") = "2-й месяц"
        .Range("$G$3") = "3-й месяц"
        .Range("$A$4") = """Молодая гвардия"" А.Фадеев"
        .Range("$B$4") = 270
        .Range("$C$4") = 290
        .Range("$D$4") = 280
        .Range("$E$4") = 187
        .Range("$F$4") = 231
        .Range("$G$4") = 256
        .Range("$A$5") = """Война и мир"" Л.Н.Толстой"
        .Range("$B$5") = 450
        .Range("$C$5") = 500
        .Range("$D$5") = 440
        .Range("$E$5") = 290
        .Range("$F$5") = 356
        .Range("$G$5") = 387
        .Range("$A$6") = """Детство Никиты"" А.Н.Толстой"
        .Range("$B$6") = 230
        .Range("$C$6") = 200
        .Range("$D$6") = 210
        .Range("$E$6") = 157
        .Range("$F$6") = 223
        .Range("$G$6") = 265
        .Range("$A$7") = """Два капитана"" В.Каверин"
        .Range("$B$7") = 350
        .Range("$C$7") = 370
        .Range("$D$7") = 380
        .Range("$E$7") = 215
        .Range("$F$7") = 275
        .Range("$G$7") = 253
        .Range("$A$8") = """Рассказы"" Т.Драйзер"
        .Range("$B$8") = 150
        .Range("$C$8") = 130
        .Range("$D$8") = 145
        .Range("$E$8") = 297
        .Range("$F$8") = 345
        .Range("$G$8") = 313
        .Range("$A$9") = """Избранное"" Э.Хемингуэй"
        .Range("$B$9") = 280
        .Range("$C$9") = 250
        .Range("$D$9") = 265
        .Range("$E$9") = 134
        .Range("$F$9") = 234
        .Range("$G$9") = 198
        .Range("$A$10") = "Молдавские народные сказки"
        .Range("$B$10") = 420
        .Range("$C$10") = 450
        .Range("$D$10") = 435
        .Range("$E$10") = 298
        .Range("$F$10") = 315
        .Range("$G$10") = 398
        .Range("$A$11") = """Поэмы.Стихи"" А.Твардовский"
        .Range("$B$11") = 380
        .Range("$C$11") = 400
        .Range("$D$11") = 390
        .Range("$E$11") = 321
        .Range("$F$11") = 298
        .Range("$G$11") = 387
        .Range("$A$12") = """Мастер и Маргарита"" М.Булгаков"
        .Range("$B$12") = 400
        .Range("$C$12") = 380
        .Range("$D$12") = 410
        .Range("$E$12") = 265
        .Range("$F$12") = 364
        .Range("$G$12") = 324
        .Range("$A$13") = """Три мушкетера"" А.Дюма"
        .Range("$B$13") = 360
        .Range("$C$13") = 350
        .Range("$D$13") = 370
        .Range("$E$13") = 143
        .Range("$F$13") = 269
        .Range("$G$13") = 249
        .Columns.AutoFit
    End With
    
End Sub

Sub Task_2()
    ' - доход по каждой книге за 3 месяца
    Dim i As Integer, j As Integer
    Dim arrAmount As Variant
    Dim arrPrice As Variant
    Dim profitByBook As Double
    With ActiveSheet
        .Range("H3") = "доход по каждой книге за 3 месяца vba"
        .Range("I3") = "доход по каждой книге за 3 месяца формула"
        For i = 4 To 13
            profitByBook = 0
            arrAmount = Application.Transpose(Application.Transpose(.Range(.Cells(i, "E"), .Cells(i, "G"))))
            arrPrice = Application.Transpose(Application.Transpose(.Range(.Cells(i, "B"), .Cells(i, "D"))))
            For j = LBound(arrAmount) To UBound(arrAmount)
                profitByBook = profitByBook + CDbl(arrAmount(j)) * CDbl(arrPrice(j))
            Next j
            .Cells(i, "H") = profitByBook
            .Cells(i, "I").FormulaR1C1 = "=RC2*RC5+RC3*RC6+RC4*RC7"
        Next i
    End With
End Sub

Sub Task_3()
    '- доход за каждый месяц по всем книгам;
    Dim i As Integer, j As Integer
    Dim arrAmount As Variant
    Dim arrPrice As Variant
    Dim profitByMonth As Double
    With ActiveSheet
        .Range("B15") = "доход за каждый месяц по всем книгам vba"
        .Range("C15") = "доход за каждый месяц по всем книгам формула"
        .Range("A16") = .Range("B3")
        .Range("A17") = .Range("C3")
        .Range("A18") = .Range("D3")
        .Range("C16").FormulaR1C1 = "=SUMPRODUCT(R4C2:R14C2,R4C5:R14C5)"
        .Range("C17").FormulaR1C1 = "=SUMPRODUCT(R4C3:R14C3,R4C6:R14C6)"
        .Range("C18").FormulaR1C1 = "=SUMPRODUCT(R4C4:R14C4,R4C7:R14c7)"
        For i = 2 To 4
            profitByMonth = 0
            arrAmount = Application.Transpose(.Range(.Cells(4, i), .Cells(13, i)))
            arrPrice = Application.Transpose(.Range(.Cells(4, i + 3), .Cells(13, i + 3)))
            For j = LBound(arrAmount) To UBound(arrAmount)
                profitByMonth = profitByMonth + CDbl(arrAmount(j)) * CDbl(arrPrice(j))
            Next j
            .Range("B15").Offset(i - 1) = profitByMonth
        Next i
    End With
End Sub


Sub Task_4()
    '- общий доход по всем книгам за 3 месяца;
    Dim i As Integer, j As Integer
    Dim arrAmount As Variant
    Dim arrPrice As Variant
    Dim profitTotal As Double
    With ActiveSheet
        .Range("A20") = "общий доход по всем книгам за 3 месяца vba"
        .Range("A21") = "общий доход по всем книгам за 3 месяца формула"
        .Range("B21").FormulaR1C1 = "=R[-5]C3+R[-4]C3+R[-3]C3"
        profitTotal = 0
        For i = 2 To 4
            arrAmount = Application.Transpose(.Range(.Cells(4, i), .Cells(13, i)))
            arrPrice = Application.Transpose(.Range(.Cells(4, i + 3), .Cells(13, i + 3)))
            For j = LBound(arrAmount) To UBound(arrAmount)
                profitTotal = profitTotal + CDbl(arrAmount(j)) * CDbl(arrPrice(j))
            Next j
            
        Next i
        .Range("B20") = profitTotal
    End With
End Sub


Sub Task_5()
    '- наименование книги, принёсший наибольший доход
    Dim i As Integer, j As Integer
    Dim arrAmount As Variant
    Dim arrPrice As Variant
    Dim mostProfitable As Double
    Dim mostProfitableIndex As Integer
    Dim currentProfitByBook As Double
    With ActiveSheet
        .Range("A24") = "наименование книги, принёсший наибольший доход vba"
        .Range("A25") = "наименование книги, принёсший наибольший доход формула"
        
        
        arrAmount = .Range("E4:G13")
        arrPrice = .Range("B4:D13")
        mostProfitable = 0
        For i = LBound(arrAmount, 1) To UBound(arrAmount, 1) ' 1 - 10
            currentProfitByBook = 0
            For j = LBound(arrAmount, 2) To UBound(arrAmount, 2)
                currentProfitByBook = currentProfitByBook + arrAmount(i, j) * arrPrice(i, j)
            Next j
            If currentProfitByBook > mostProfitable Then
                mostProfitable = currentProfitByBook
                mostProfitableIndex = i
            End If
        Next i
        .Range("B24") = .Range("A3").Offset(mostProfitableIndex)
        .Range("C24") = mostProfitable
        .Range("B25").Formula = "=OFFSET(A3,MATCH(C25,I4:I13,0),0)"
        .Range("C25").Formula = "=LARGE(I4:I13,1)"
    End With
End Sub

1 лайк