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

Задание: Книжный магазин продал за 3 месяца различное количество книг 10 наименований по цене, устанавливаемым в начале каждого месяца (т.е. каждый месяц цены на книги менялись).
Написать программу на языке VBA, которая вводит исходные данные, выполняет расчёты и выводит на экран:
- исходные данные в виде таблицы, где указаны наименования книг, цена книги в каждом месяце, кол-во проданных книг за каждый месяц;
- доход по каждой книге за 3 месяца
- доход за каждый месяц по всем книгам;
- общий доход по всем книгам за 3 месяца;
- наименование книги, принёсший наибольший доход

Лист с исходными данными

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

Sub Funct()
'Сначала объявляем переменные, используемые в программе.
'стоимость книги (по месяцам)
Dim cena(10, 3) As Double
'количество (по месяцам)
Dim koll(10, 3) As Integer
' количество проданных книг
Dim kol_m(10) As Integer
' прибыль в месяц
Dim prib(3) As Double
' книга с наибольшей прибылью.
Dim kniga As Integer
' Доход с книги, принесшей наибольший доход
Dim pribl As Double
' счетчики циклов
Dim i As Integer, j As Integer, p As Integer
' Далее всем переменным присваивается нулевое значение
For i = 1 To 10
kol_m(i) = 0
Next i
For j = 1 To 3
prib(j) = 0
Next j
For p = 1 To 3
Next p
kniga = 0
prib = 0
'В этом фрагменте кода происходит считывание начальных
'данных с листа <<Нач_д>>, и в каждую ячейку массива
'cena(10) записывается стоимость каждой книги, а в
'ячейках двумерного массива 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) = "Три мушкетера (А. Дюма)"
' В этом фрагменте происходит вывод на рабочий лист
' стоимости книг и доход по каждой книге в течение 3 месяцев и
' количество книг проданных за месяц
For i = 1 To 10
Cells(3 + i, 1 + p) = cena(i, p)
For j = 1 To 5
Сеlls(3 + i, 2 + j) = koll(i, j)
koll_n(i) = koll_n(i) + koll(i, j)
Next j
Сеlls(3 + i, 8) = koll_n(i)
Next i
Cells(3 + i, 1 + p) = cena(i, p)
Next p
For j = 1 To 3
Cells(3 + i, 4 + j) = kol_n(i)
kol_m(i) = kol_m + koll(i, j)
Next j
Next i
Cells(17, 1) = "Результат в денежном эквиваленте"
Cells(18, 1) = "Наименование"
Cells(18, 2) = "Стоимость"
Cells(18, 5) = "Доход"
Cells(18, 8) = "Всего"  'Общий доход за 3 месяца
Cells(18, 9) = "Книга"
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 12
For p = 1 To 3
Cells(19 + i, 1 + p) = cena(i, p)
Next p
For j = 1 To 3
Cells(19 + i, 4 + j) = koll(i, j) * cena(i, p)
prib(j) = prib(j) + koll(i, j) * cena(i, p)
prib(4) = prib(4) + koll(i, j) * cena(i, p)
Next j
Cells(19 + i, 8) = cena(i, p) * kol_m(i)
Next i
' Здесь описан алгоритм сравнения некоторого
' дохода с доходом, полученным
' в один из 3 месяцев. Если рассматриваемая
' больше другой, то сумме наибольшего дохода
' присваивается текущее значение, а днем с
' максимальным заработком становится день
' под номером j.
For j = 1 To 3
Сеlls(30, 2 + j) = prib(j)
If prib(j) > pribl Then
pribl = prib(j)
kniga = j
End If
Next j
' Ниже выводится на лист с результатом работы прогрммы
' заработок рабочего за неделю, день максимального
' заработка и сколько он заработал в этот день.
Сеlls(30, 8) = prib(6)
Сеlls(31, 1) = "Доход за 3 месяца"
Сеlls(31, 5) = prib(6)
Сеlls(32, 1) = "Книга с наибольшим доходом"
Сеlls(32, 5) = kniga
Сеlls(32, 6) = "Доход"
Сеlls(32, 8) = pribl
End Sub

Программа почему - то ругается на строчку:
prib = 0

Так ругается-то как именно?

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

так что непонятно зачем эта строка

C этим я разобрался. Но тут проблема одна. Программа пишет, что функция не определена, но она вроде как определена

В какой строке?
Если в той, что выделена, то речь видимо о Cells.
Может быть там почему-то нет активного листа. :man_shrugging:

Может быть выше надо Activate, а не Select.
https://www.automateexcel.com/vba/activate-select-sheet/

Или можно попробовать просто указать Worksheet и т.п.
https://docs.microsoft.com/en-us/office/vba/api/excel.worksheet.cells

А, и там не те кавычки

:-1:

:+1:

спасибо. Теперь следующий вопрос
вот мой код

Sub fuctoind()
'Сначала объявляем переменные, используемые в программе.
'стоимость детали
Dim cena(10, 3) As Double
'количество (по месяцам)
Dim koll(10, 3) As Integer
'доход в месяц
Dim doh(3) As Double
' количество книг за 3 месяцa
Dim kol_n(10) As Integer
' книга с наибольшей прибылью.
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(7) записывается стоимость каждой книги, а в
'ячейках двумерного массива 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
 
'Далее на листе <<Результат>> в ячейку с определенным
'номером вводится ее название.
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, 2 + j) = koll(i, j)
kol_n(i) = koll_n + koll(i, j)
Next j
Cells(3 + i, 1 + p) = kol_n(i)
Next i
'Ниже происходит ввод названий соответствующих
'столбцов и строк.
Cells(17, 1) = "Результат в денежном эквиваленте"
Cells(18, 1) = "Наименование"
Cells(18, 2) = "Стоимость"
Cells(18, 5) = "Доход"
Cells(18, 8) = "Всего"  'Общий доход за 3 месяца
Cells(18, 9) = "Книга"
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, 2 + 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) * koll_n(i)
Next p
Next i
'Здесь описан алгоритм сравнения некоторого
'дохода с доходом, полученным
'в один из трех месяцев. Если рассматриваемый
'больше другого, то сумме наибольшего дохода
'присваивается текущее значение, а днем с
'максимальным заработком становится день
'под номером j.
For j = 1 To 3
Cells(30, 2 + j) = doh(j)
If doh(j) > dohl Then
dohl = doh(j)
kniga = j
End If
Next j
'Ниже выводится на лист с результатом работы программы
'доход за 3 месяца, книга с максимальным
'доходом и сколько она принесла дохода.
Cells(30, 8) = doh(6)
Cells(31, 1) = "Доход за 3 месяца"
Cells(31, 5) = doh(6)
Cells(32, 1) = "Книга с наибольшим доходом"
Cells(32, 5) = kniga
Cells(32, 6) = "Доход"
Cells(32, 8) = dohl
End Sub

Я так понимаю у меня ошибка в выводе данных с листа с исходными данными, так как вместо полной таблицы, у меня получилась таблица без 2 х других столбиков со стоимостью

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

это все теоретически вроде как правильно, а вроде программа считывает как то не понятно

Я уже 1000 раз испробовал этот цикл, но ни в какую не получается сделать нормальную таблицу с исходными данными

Зачем теоретически?
Посмотрите в отладчике или добавьте отладочную печать.

http://blog.algoprog.ru/how-to-debug-small-programs/

можно же сразу цикл задать от 4 до 13

То же самое, думаю, и со вторым циклом. Тогда не будет необходимости суммирования в параметрах Cells

А ещё мне кажется, вот в этом блоке кода Вы цикл по p забыли

For i = 1 To 10
Cells(3 + i, 1 + p) = cena(i, p)
For j = 1 To 5
Сеlls(3 + i, 2 + j) = koll(i, j)
koll_n(i) = koll_n(i) + koll(i, j)
Next j
Сеlls(3 + i, 8) = koll_n(i)
Next i
Cells(3 + i, 1 + p) = cena(i, p)
Next p

Вот это тоже можно было из исходных данных циклом перетащить

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) = "Три мушкетера (А. Дюма)"
For i = 20 to 29
  Cells(i, 1) = Cells(i - 16, 1)
Next i

Ещё момент: у Вас doh объявлена как массив из трёх элементов

Dim doh(3) As Double

Но при этом в коде попадаются обращения к элементам за пределами массива

doh(4) = doh(4) + koll(i, j) * cena(i, p)
Cells(30, 8) = doh(6)
Cells(31, 1) = "Äîõîä çà 3 ìåñÿöà"
Cells(31, 5) = doh(6)

В двух местах используется нигде не обьявленная переменная koll_n

kol_n(i) = koll_n + koll(i, j)
Cells(19 + i, 8) = cena(i, p) * koll_n(i)

Потому что prib объявлен как массив

тогда будет выход за пределы массива, разве не так?

не получается

пробовал и вот так, результат не изменился

Sheets(“Íà÷_ä”).Select

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