Добрый день!
Есть данные из 1С и данные с сайта, которые постоянно меняются по объему. Т.е. колонки стандарт, а количество вариативно.
Что делает макрос, преобразовывает данные из 1С в удобоваримые для сайта, сравнивает штрихкода на сайте и в 1С, и формирует данные для поставки.
Что сделано: Через запись макроса, сформировано тело макроса. С помощью всемогущего Интернет код ужат по возможности, через форумы добавлены отдельные элементы.
Вопрос: В макросе использую формулы ВПР, но есть затык, который меня беспокоит.
1. Формулу сформировал макросом и у нее есть обращение к таблице определенного размера. Как то можно эту переменную в формуле подстраивать под размеры таблицы? Плюс есть нюанс, когда макрос заканчивается то появляются расхождения между ШК. Но по факту оба ШК из разных источников "на вид" идентичны, т.е. цифра в цифру, и это самый большой минус
3. Не могу разобраться почему в коде ниже если убрать первую строку результат не появляется. Код взят тоже из Интернет и адаптирован под мои задачи
Любая критика приветствуется! Я уверен что код можно еще больше сжать и использовать более удобные и "правильные" конструкции.
И если Вам не сложно пишите комментарии к Вашему коду, чтоб была возможность потом самостоятельно повторить написанное.
Спасибо!
Есть данные из 1С и данные с сайта, которые постоянно меняются по объему. Т.е. колонки стандарт, а количество вариативно.
Что делает макрос, преобразовывает данные из 1С в удобоваримые для сайта, сравнивает штрихкода на сайте и в 1С, и формирует данные для поставки.
Что сделано: Через запись макроса, сформировано тело макроса. С помощью всемогущего Интернет код ужат по возможности, через форумы добавлены отдельные элементы.
Вопрос: В макросе использую формулы ВПР, но есть затык, который меня беспокоит.
1. Формулу сформировал макросом и у нее есть обращение к таблице определенного размера. Как то можно эту переменную в формуле подстраивать под размеры таблицы? Плюс есть нюанс, когда макрос заканчивается то появляются расхождения между ШК. Но по факту оба ШК из разных источников "на вид" идентичны, т.е. цифра в цифру, и это самый большой минус
Код |
---|
'проверяем на совпадение баркодов c WB Sheets("Номенклатура WB").Range("I:I").Cut Sheets("Номенклатура WB").Range("A:A").Insert Shift:=xlShiftToRight Sheets("Номенклатура WB").Range("A:A") = Sheets("Номенклатура WB").Range("A:A").Value LastRow = Cells(Rows.Count, "A").End(xlUp).Row Sheets("Сводные данные").Range("I2").FormulaR1C1 = "=IFERROR(VLOOKUP(RC[-1],'Номенклатура WB'!R[-1]C[-8]:R[414]C[2],1,FALSE),0)" Sheets("Сводные данные").Range("I2").AutoFill Destination:=Sheets("Сводные данные").Range("I2:I" & LastRow) Sheets("Сводные данные").Range("J2").FormulaR1C1 = "=IF(RC[-2]=RC[-1],""Нет"",""Есть"")" Sheets("Сводные данные").Range("J2").AutoFill Destination:=Sheets("Сводные данные").Range("J2:J" & LastRow) Sheets("Сводные данные").Range("I:J") = Sheets("Сводные данные").Range("I:J").Value 'Worksheets("Номенклатура WB").Cells.ClearContents |
2. Перфекто не дремлет, и хотелось бы реализовать эту функцию в VBA. Готовые конструкции находил, но не смог разобраться с механикой функции и перекроить ее под себя. Взято с другого тематического форума.
Код |
---|
Sub ee150604_0806() Dim i, n, s1 Dim ws1 As Worksheet Dim ws2 As Worksheet Set ws1 = Excel.Worksheets("лист1") ''справочник Set ws2 = Excel.Worksheets("лист2") ''основной For i = 1 To 5 s1 = ws2.Cells(i, 1) For n = 1 To 5 If ws1.Cells(n, 1) = s1 Then ws2.Cells(i, 2) = ws1.Cells(n, 2) Exit For End If Next n Next i End Sub |
3. Не могу разобраться почему в коде ниже если убрать первую строку результат не появляется. Код взят тоже из Интернет и адаптирован под мои задачи
Код |
---|
Sheets("Упаковочные листы").Select 'почему без этой строки цикл ниже не выдает результата? Dim vItem, avArr, li As Long ReDim avArr(1 To ActiveWorkbook.Worksheets("Упаковочные листы").Rows.Count, 1 To 1) With New Collection On Error Resume Next For Each vItem In ActiveWorkbook.Worksheets("Упаковочные листы").Range("C2", Cells(ActiveWorkbook.Worksheets("Упаковочные листы").Rows.Count, 3).End(xlUp)).Value 'Cells(Rows.Count, 1).End(xlUp) – определяет последнюю заполненную ячейку в столбце А .Add vItem, CStr(vItem) If Err = 0 Then li = li + 1: avArr(li, 1) = vItem Else: Err.Clear End If Next End With If li Then Sheets("ШК_коробов").Range("A2").Resize(li).Value = avArr ActiveWorkbook.Worksheets("ШК_коробов").Sort.SortFields.Clear ActiveWorkbook.Worksheets("ШК_коробов").Sort.SortFields.Add2 Key:=Range("A:A"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("ШК_коробов").Sort .SetRange Range("A:A") .Header = xlGuess .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With |
Любая критика приветствуется! Я уверен что код можно еще больше сжать и использовать более удобные и "правильные" конструкции.
И если Вам не сложно пишите комментарии к Вашему коду, чтоб была возможность потом самостоятельно повторить написанное.
Спасибо!