VBA: Циклы с заранее неизвестным числом повторений

Автор Fartiboy, 27 ноября 2017, 19:56

Fartiboy

Помогите пожалуйста с программой, с этим заданием сижу уже вторую неделю.
Задание
Фабрика "GRM pic" выпускает два вида каш для завтрака -"Crunchy" и "Chewy". Используемые в производстве обоих продук¬тов ингредиенты в основном одинаковы и, как правило, не являются дефицитными. На настоящий момент нет никаких ограничений на возможные объемы продаж. Имеется возможность продать всю произведенную продукцию. В табл. К 13.1 указано число человеко-часов, требуемое для производства 1 т продукта, доход ($) от производства 1 т продукта каждого вида и объем выпуска (т) за месяц.

Требуется составить макрос для подсчета фонда рабочего времени, необходимого на изготовление всей продукции в каждом цехе, и дохода от реализации продукции каждого вида. Макрос должен выполнять вычисления для произвольного числа видов работ и продукции и записывать вычисленные значения затрат времени в колонку, следующую за последней колонкой таблицы, а вычисленные значения дохода - в строку, следующую за последней строкой. Результаты вычислений приведены в табл. К 13.2.

Для подготовки контрольного примера №2 необходимо добавить несколько строк дополнительных видов работ и несколько колонок дополнительной продукции, ввести данные норм расхода рабочего времени на 1 т продукта каждого вида, дохода от производства 1 т продукта и объема выпуска.
[свернуть]

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

Public Sub GRM_pic()

    'В макросе используются следующие переменные:
    'М- номер последней заполненной строки
    'N - номер последней заполненной колонки
    'i- номер текущей строки
    'j - номер текущей колонки
    'Sum - суммарное количество сырья каждого вида (кг)
    Dim M As Long, N As Long, i As Long, j As Long, Money As Single


    '1. Найдем номер последней заполненной строки
    i = 1
    Do  ' Цикл до тех пор, пока не встретится пустая строка
        ' Cells(i, 3) - обращение к ячейке в текущей строке i и в 3 колонке
        If CStr(Cells(i, 3)) = "" Then
            M = i - 1
            Exit Do ' Выход из цикла
        Else
            i = i + 1   ' Увеличение номера строки на 1
        End If
    Loop
   
    '2. Найдем номер последней заполненной колонки
    j = 1
    Do  ' Цикл до тех пор, пока не встретится пустая колонка
        ' Cells(3, j) - обращение к ячейке в 3 строке и в текущей колонке j
        If CStr(Cells(3, j)) = "" Then
            N = j - 1
            Exit Do ' Выход из цикла
        Else
            j = j + 1 ' Увеличение номера колонки на 1
        End If
    Loop
   
    '3. Вставка заголовка для строки.
        ' Функция Chr(10) переводит курсор в начало новой строки
        ' данной ячейки
    Cells(M + 1, 1) = "Доход ($) от производства " & Chr(10) & "продукта за месяц"
   
    For j = 2 To N      ' Цикл по колонкам
        For i = 3 To M   ' Цикл по строкам
            ' Cells(i, 2) - обращение к ячейке в текущей строке i и во 2 колонке
            ' Cells(i, j) - обращение к ячейке в текущей строке i и в текущей
                ' колонке j
            Money = Cells(i, 2) * Cells(i, j)
        Next i
        ' Задание полужирного начертания шрифта
        Cells(M + 1, j).Font.Bold = True
        ' Задание горизонтального выравнивания в ячейке
        Cells(M + 1, j).HorizontalAlignment = xlHAlignCenter
        ' Запись вычисленного планового расхода
        Cells(M + 1, j) = Money
    Next j
   
End Sub
[свернуть]

[вложение удалено администратором]

[вложение удалено администратором]

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

Вот здесь что-то не то:
For i = M - 1 To M   ' Цикл по строкам

Строки начинаются со строки и до M. Значит цикл по строкам должен быть такой:
For i = 3 To M   ' Цикл по строкам

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

Здесь логика не понятна:
Money = Cells(i, 2) * Cells(i, j)

Почему используется всегда столбец 2? Что в нём такое:?
Cells(i, 2)

Это столбец "Crunchy". Почему этот столбец используется при подсчёте данных для столбца "Chewy"?

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

Внесите эти изменения, если не получится, то я дальше посмотрю.

В ходе чтения кода я изменял оформление кода, поэтому используйте код в таком виде, как я сделал.
Код вы можете взять из первого сообщения, из самого сообщения и из файла (я файл перевложил).