В D2:D7 посчитайте средний чек (выручка / чеков), а там, где деление невозможно, запишите «нет данных» — как макрос.
Теория урока
Ошибки бывают трёх видов: синтаксические (редактор подсветит красным), ошибки выполнения (деление на ноль, нет листа с таким именем, текст вместо числа) и логические (код работает, но считает не то). Против второго вида — обработчик:
Sub Импорт()
On Error GoTo Ошибка
Worksheets("Данные").Range("A1").Value = "Старт"
' … основная работа …
Exit Sub ' без этой строки обработчик выполнится всегда
Ошибка:
MsgBox "Ошибка " & Err.Number & ": " & Err.Description
End SubOn Error GoTo метка— при ошибке перейти к метке;Err.NumberиErr.Description— код и текст ошибки;On Error Resume Next— пропускать ошибочную строку. Удобно для одной проверки, опасно для всего макроса: ошибки станут невидимыми;On Error GoTo 0— вернуть обычное поведение;Err.Clear— сбросить код ошибки;- частые коды: 9 — нет такого элемента (листа, книги), 11 — деление на ноль, 13 — несовпадение типов, 91 — объект не задан (забыли
Set).
Отладка: F8 — выполнить одну строку; F9 — точка останова; Debug.Print x печатает значение
в окно Immediate (Ctrl+G); окно Locals показывает все переменные; строка Stop останавливает макрос в нужном месте.
Макрос ниже считает средний чек и не падает на плохих данных. Воспроизведите его результат формулой с ЕСЛИОШИБКА:
это то же «попробуй посчитать, при ошибке запиши запасное значение».
Sub СреднийЧек()
Dim r As Long
On Error Resume Next
For r = 2 To 7
Err.Clear
Cells(r, 4).Value = Cells(r, 2).Value / Cells(r, 3).Value
If Err.Number <> 0 Then Cells(r, 4).Value = "нет данных"
Next r
On Error GoTo 0
Range("G1").Value = WorksheetFunction.CountIf(Range("D2:D7"), "нет данных")
End SubТренажёр не выполняет макросы и скрипты. Код из урока запускайте в настольном Excel (VBA) или в Excel для Интернета (Office Scripts). Здесь вы учитесь читать код и проверяете себя формулами и тестом.
Проверьте себя
Практика — в Pro
Живая таблица, проверка заданий и файлы .xlsx во всех 170 уроках. Прогресс хранится в этом браузере; синхронизация между устройствами появится позже.