Макрос прайса должен связывать товары по устойчивому артикулу. Позиция строки или похожее название не являются надёжным ключом.
Построим словарь цен, заполним заказы и явно покажем отсутствующий артикул.
Что подготовить
На «Прайс» подготовьте 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 выводится «Не найдено», сумма пустая.
Ограничения и частые ошибки
Ключи здесь сравниваются по стандартному бинарному режиму словаря. Если правила каталога требуют другой регистр или очистку пробелов, задайте их одинаково для прайса и заказов до сравнения.
Макрос пишет значения. При смене прайса цены в заказах не обновятся без нового запуска. Если нужен живой пересчёт, рассмотрите формулу поиска вместо периодической записи.
Рабочая версия дополнительно проверяет пустые коды, ошибки ячеек и тип цены. До проверки полного набора можно собирать результаты в памяти, чтобы исключить частичный вывод при ошибке в середине заказов.
Проверка перед рабочим запуском
- Прайс не содержит дублей.
- P-103 получает цену 90.
- P-999 не превращается в нулевую цену.
- Повторное обновление согласовано по смыслу заказа.
Сначала выполните пример на учебной копии с указанными именами листов и диапазонами. Сравните исходные данные и результат, затем сохраните проверенный вариант процедуры.
Продолжить изучение: Dictionary в VBA: поиск и накопление по ключу, Range.Find в VBA: поиск значения в столбце, ВПР через VBA: поиск цены и обработка отсутствия.
Разберитесь с макросами вместе с преподавателем
На занятии вы записываете действия, читаете код и проверяете результат на небольшом примере. Преподаватель подберёт задания под ваш уровень и поможет понять связь между командами VBA и изменениями в книге.
Начните с бесплатного вводного урока: 45 минут, один на один, без обязательств. Обсудите цель и попробуйте формат. Решение о продолжении — после занятия.