Макрос прайса должен связывать товары по устойчивому артикулу. Позиция строки или похожее название не являются надёжным ключом.

Построим словарь цен, заполним заказы и явно покажем отсутствующий артикул.

Что подготовить

На «Прайс» подготовьте A1:C5 Артикул, Товар, Цена с четырьмя учебными товарами. На «Заказы» нужны A1:D6 Артикул, Количество, Цена, Сумма.

Заказы: P-101 / 3, P-102 / 10, P-103 / 4, P-104 / 2, P-999 / 1. C:D свободны для результата. Прайс содержит уникальные текстовые коды и числовые цены, количество также числовое.

Исходные учебные данные перед выполнением процедуры.
Исходные учебные данные перед выполнением процедуры.

Код и порядок выполнения

Option Explicit
Sub FillPrices()
    Dim d As Object, data As Variant
    Dim ws As Worksheet, r As Long, i As Long, key As String
    Set d = CreateObject("Scripting.Dictionary")
    data = ThisWorkbook.Worksheets("Прайс").Range("A2:C5").Value2
    For i = 1 To 4
        key = CStr(data(i, 1))
        If d.Exists(key) Then Err.Raise 5, , "Дубль артикула в прайсе"
        d.Add key, data(i, 3)
    Next i
    Set ws = ThisWorkbook.Worksheets("Заказы")
    For r = 2 To 6
        key = CStr(ws.Cells(r, 1).Value)
        If d.Exists(key) Then
            ws.Cells(r, 3).Value = d(key)
            ws.Cells(r, 4).Value = ws.Cells(r, 2).Value * d(key)
        Else
            ws.Cells(r, 3).Value = "Не найдено"
            ws.Cells(r, 4).ClearContents
        End If
    Next r
End Sub

Перед заполнением заказов словарь проверяет дубли ключей. Если P-101 встречается в прайсе дважды, код прекращает работу, а не выбирает случайную цену.

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

Учебный код: Прайс-лист с макросом: заполнение цены по артикулу.
Учебный код: Прайс-лист с макросом: заполнение цены по артикулу.

Как проверить результат

Первые четыре заказа получают цены 150, 35, 90, 120. Для P-999 выводится «Не найдено», сумма пустая.
Первые четыре заказа получают цены 150, 35, 90, 120. Для P-999 выводится «Не найдено», сумма пустая.

Первые четыре заказа получают цены 150, 35, 90, 120. Для P-999 выводится «Не найдено», сумма пустая.

Ограничения и частые ошибки

Ключи здесь сравниваются по стандартному бинарному режиму словаря. Если правила каталога требуют другой регистр или очистку пробелов, задайте их одинаково для прайса и заказов до сравнения.

Макрос пишет значения. При смене прайса цены в заказах не обновятся без нового запуска. Если нужен живой пересчёт, рассмотрите формулу поиска вместо периодической записи.

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

Проверка перед рабочим запуском

  • Прайс не содержит дублей.
  • P-103 получает цену 90.
  • P-999 не превращается в нулевую цену.
  • Повторное обновление согласовано по смыслу заказа.

Сначала выполните пример на учебной копии с указанными именами листов и диапазонами. Сравните исходные данные и результат, затем сохраните проверенный вариант процедуры.

Продолжить изучение: Dictionary в VBA: поиск и накопление по ключу, Range.Find в VBA: поиск значения в столбце, ВПР через VBA: поиск цены и обработка отсутствия.

Разберитесь с макросами вместе с преподавателем

На занятии вы записываете действия, читаете код и проверяете результат на небольшом примере. Преподаватель подберёт задания под ваш уровень и поможет понять связь между командами VBA и изменениями в книге.

Начните с бесплатного вводного урока: 45 минут, один на один, без обязательств. Обсудите цель и попробуйте формат. Решение о продолжении — после занятия.

Записаться на бесплатный урок