Доброго времени суток! Есть два листа. Нужно, чтобы с Лист2 на Лист1 переносились даты производства по артикулу и номенклатуре. Сложность в том, что одна и та же номенклатура может иметь разные даты производства, поэтому впр-ом я это сделать никак не могу.
Файл-пример приложила.
Доброго времени суток! Есть два листа. Нужно, чтобы с Лист2 на Лист1 переносились даты производства по артикулу и номенклатуре. Сложность в том, что одна и та же номенклатура может иметь разные даты производства, поэтому впр-ом я это сделать никак не могу.
Можно так попробовать, права порядок немного другой
Спасибо большое, завтра уже буду пробовать. С формулой разобралась, теперь главное правильно применить. А вообще подобный макрос возможно написать? С ним файл будет быстрее.
Можно так попробовать, права порядок немного другой
Спасибо большое, завтра уже буду пробовать. С формулой разобралась, теперь главное правильно применить. А вообще подобный макрос возможно написать? С ним файл будет быстрее.uhtiithu
Можно так попробовать, права порядок немного другой
Приложила файл. Формула не работает, т.к. у меня между названиями номенклатуры на листе2 есть пробелы (в которых название группы). И ещё данные на Лист2 и на Лист1 начинаются с разных строк по порядку: на первом - с шестой, а на втором - с четвёртой.
Можно так попробовать, права порядок немного другой
Приложила файл. Формула не работает, т.к. у меня между названиями номенклатуры на листе2 есть пробелы (в которых название группы). И ещё данные на Лист2 и на Лист1 начинаются с разных строк по порядку: на первом - с шестой, а на втором - с четвёртой.uhtiithu
Sub www() dim s&, i& With Sheets("Лист1") s = 7 For i = 5 To Range("A" & Rows.Count).End(xlUp).Row If Cells(i, 2) <> "" Then .Cells(s, 1) = Cells(i, 3) .Cells(s, 2) = Cells(i, 2) .Cells(s, 3) = Cells(i, 4) .Cells(s, 4) = Cells(i, 5) s = s + 1 End If Next End With End Sub
[/vba]
Макросом. [vba]
Код
Sub www() dim s&, i& With Sheets("Лист1") s = 7 For i = 5 To Range("A" & Rows.Count).End(xlUp).Row If Cells(i, 2) <> "" Then .Cells(s, 1) = Cells(i, 3) .Cells(s, 2) = Cells(i, 2) .Cells(s, 3) = Cells(i, 4) .Cells(s, 4) = Cells(i, 5) s = s + 1 End If Next End With End Sub
Спасибо, но данный макрос просто переносит значения ячейки с листа2 на лист1, при условии, что проверяемая ячейка на листе2 не равна нулю. А у меня условий больше: значение должно переноситься только в том случае, когда у нас совпадает артикул и название на втором листе с теми, которые уже указаны в первом. И при этом нужно понимать, что на втором листе с одним и тем же артикулом и названием есть разные даты.
Спасибо, но данный макрос просто переносит значения ячейки с листа2 на лист1, при условии, что проверяемая ячейка на листе2 не равна нулю. А у меня условий больше: значение должно переноситься только в том случае, когда у нас совпадает артикул и название на втором листе с теми, которые уже указаны в первом. И при этом нужно понимать, что на втором листе с одним и тем же артикулом и названием есть разные даты.uhtiithu
Sub data_transfer() Dim sheet1 As Worksheet Set sheet1 = ActiveWorkbook.Sheets(1) 'ññûëêà íà ïåðâûé ëèñò êíèãè Dim sheet2 As Worksheet Set sheet1 = ActiveWorkbook.Sheets(2) 'ññûëêà íà âòîðîé ëèñò êíèãè Dim str1 As Date Dim str2 As Date Dim i As Integer i = 6 Dim last_i As Integer last_i = 6 Dim j As Integer j = 2 Dim last_j As Integer last_j = 2 For Each cell In sheet1.Range("A:A") If cell.Row > 2 Then If cell.Value > "" Then last_i = cell.Row Else Exit For End If End If Next cell For Each cell In sheet2.Range("A:A") If cell.Row > 2 Then If cell.Value > "" Then last_i = cell.Row Else Exit For End If End If Next cell For j = 2 To last_j str2 = sheet2.Cells(j, 2).Value & "-" & sheet2.Cells(j, 3) For i = 3 To last_i str1 = sheet1.Cells(i, 2).Value & "-" & shett1.Cells(i, 1) If str2 = str1 Then sheet1.Cells(i, 3).Value = sheet2.Cells(j, 4).Value Exit For End If Next i Next j
End Sub
[/vba]
Но выдаёт ошибку: 'object variable or with block variable not set'.
Что нужно исправлять?
Наваяла следующее:
End Sub[vba]
Код
Sub data_transfer() Dim sheet1 As Worksheet Set sheet1 = ActiveWorkbook.Sheets(1) 'ññûëêà íà ïåðâûé ëèñò êíèãè Dim sheet2 As Worksheet Set sheet1 = ActiveWorkbook.Sheets(2) 'ññûëêà íà âòîðîé ëèñò êíèãè Dim str1 As Date Dim str2 As Date Dim i As Integer i = 6 Dim last_i As Integer last_i = 6 Dim j As Integer j = 2 Dim last_j As Integer last_j = 2 For Each cell In sheet1.Range("A:A") If cell.Row > 2 Then If cell.Value > "" Then last_i = cell.Row Else Exit For End If End If Next cell For Each cell In sheet2.Range("A:A") If cell.Row > 2 Then If cell.Value > "" Then last_i = cell.Row Else Exit For End If End If Next cell For j = 2 To last_j str2 = sheet2.Cells(j, 2).Value & "-" & sheet2.Cells(j, 3) For i = 3 To last_i str1 = sheet1.Cells(i, 2).Value & "-" & shett1.Cells(i, 1) If str2 = str1 Then sheet1.Cells(i, 3).Value = sheet2.Cells(j, 4).Value Exit For End If Next i Next j
End Sub
[/vba]
Но выдаёт ошибку: 'object variable or with block variable not set'.
В cell In sheet1.Range("A:A") 1 048 576 ячеек. Все значения, конечно же, целые. Выбирайте:
Byte - Для хранения положительного числа от 0 до 255 Boolean - Для хранения логических значений; может содержать только значения True и False Date - Для хранения комбинации информации о дате и времени. Диапазон может быть от 1 января 100 года до 31 декабря 9999 года. Диапазон времени 00:00:00 до 23:59:59. Integer - Все целые числа от -32 768 до 32 767 Long - Все целые числа от - 2 147 483 648 до 2 147 483 647 Single - Отрицательные числа от -3.4х1038 до -1.4х10-45; Положительные числа от 1.4х10-45 до 3.4х1038 String - Используется для хранения текста. Может содержать от 0 символов до приблизительно 2 миллиардов символов Variant - Тип Variant может хранить любой другой тип данных. Диапазон для данных типа Variant зависит от фактически сохраняемых данных. В случае текста диапазон соответствует строковому типу; в случае чисел диапазон такой, как у типа Double Double - Отрицательные числа от -1.8х10308 до -4.9х10-324; Положительные числа от 4.9х10-324 до 1.8х10308 Currency - Тип Currency используется для хранения чисел, когда точность крайне важна, что бывает при вычислениях с денежными единицами
[p.s.]А формула моя не подошла?
В cell In sheet1.Range("A:A") 1 048 576 ячеек. Все значения, конечно же, целые. Выбирайте:
Byte - Для хранения положительного числа от 0 до 255 Boolean - Для хранения логических значений; может содержать только значения True и False Date - Для хранения комбинации информации о дате и времени. Диапазон может быть от 1 января 100 года до 31 декабря 9999 года. Диапазон времени 00:00:00 до 23:59:59. Integer - Все целые числа от -32 768 до 32 767 Long - Все целые числа от - 2 147 483 648 до 2 147 483 647 Single - Отрицательные числа от -3.4х1038 до -1.4х10-45; Положительные числа от 1.4х10-45 до 3.4х1038 String - Используется для хранения текста. Может содержать от 0 символов до приблизительно 2 миллиардов символов Variant - Тип Variant может хранить любой другой тип данных. Диапазон для данных типа Variant зависит от фактически сохраняемых данных. В случае текста диапазон соответствует строковому типу; в случае чисел диапазон такой, как у типа Double Double - Отрицательные числа от -1.8х10308 до -4.9х10-324; Положительные числа от 4.9х10-324 до 1.8х10308 Currency - Тип Currency используется для хранения чисел, когда точность крайне важна, что бывает при вычислениях с денежными единицами
формула класс, но: на листе 1 данные по артикулу и наименованию НЕ ДОЛЖНЫ тянуться с листа2. Они должны быть точкой сравнения, которая не может меняться. Я внизу укажу ссылку на рабочий свой файлик, посмотрите какой там масштаб данных. Так будет понятно. Удалено администрацией [moder] Не, ссылку нельзя. Нужно сам файлик. Можно в усеченном виде.
формула класс, но: на листе 1 данные по артикулу и наименованию НЕ ДОЛЖНЫ тянуться с листа2. Они должны быть точкой сравнения, которая не может меняться. Я внизу укажу ссылку на рабочий свой файлик, посмотрите какой там масштаб данных. Так будет понятно. Удалено администрацией [moder] Не, ссылку нельзя. Нужно сам файлик. Можно в усеченном виде.uhtiithu