Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Макрос для переноса данных. - Мир MS Excel

Регистрация · Логин: · Пароль: · · Забыли пароль?
Страница 1 из 11
Модератор форума: _Boroda_, Pelena, Manyasha, SLAVICK 
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Макрос для переноса данных. (Макросы/Sub)
Макрос для переноса данных.
uhtiithu Дата: Четверг, 21.01.2016, 21:25 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 11
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Доброго времени суток!
Есть два листа. Нужно, чтобы с Лист2 на Лист1 переносились даты производства по артикулу и номенклатуре. Сложность в том, что одна и та же номенклатура может иметь разные даты производства, поэтому впр-ом я это сделать никак не могу.

Файл-пример приложила.
К сообщению приложен файл: _Microsoft_Exce.xlsx(24Kb)


Сообщение отредактировал uhtiithu - Четверг, 21.01.2016, 21:26
 
Ответить
СообщениеДоброго времени суток!
Есть два листа. Нужно, чтобы с Лист2 на Лист1 переносились даты производства по артикулу и номенклатуре. Сложность в том, что одна и та же номенклатура может иметь разные даты производства, поэтому впр-ом я это сделать никак не могу.

Файл-пример приложила.

Автор - uhtiithu
Дата добавления - 21.01.2016 в 21:25
gling Дата: Четверг, 21.01.2016, 22:02 | Сообщение № 2
Группа: Друзья
Ранг: Старожил
Сообщений: 1512
Репутация: 376 ±
Замечаний: 0% ±

2010
Можно так попробовать, права порядок немного другой
Код
=ИНДЕКС(Лист2!$D$1:$D$7;СУММПРОИЗВ(НАИБОЛЬШИЙ((Лист2!$C$2:$C$7=A2)*СТРОКА($A$2:$A$7);СЧЁТЕСЛИ($A$1:A2;A2))))
К сообщению приложен файл: 8579511.xlsx(25Kb)


Сообщение отредактировал gling - Четверг, 21.01.2016, 22:03
 
Ответить
СообщениеМожно так попробовать, права порядок немного другой
Код
=ИНДЕКС(Лист2!$D$1:$D$7;СУММПРОИЗВ(НАИБОЛЬШИЙ((Лист2!$C$2:$C$7=A2)*СТРОКА($A$2:$A$7);СЧЁТЕСЛИ($A$1:A2;A2))))

Автор - gling
Дата добавления - 21.01.2016 в 22:02
uhtiithu Дата: Четверг, 21.01.2016, 23:03 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 11
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Можно так попробовать, права порядок немного другой

Спасибо большое, завтра уже буду пробовать. С формулой разобралась, теперь главное правильно применить.
А вообще подобный макрос возможно написать? С ним файл будет быстрее.
 
Ответить
Сообщение
Можно так попробовать, права порядок немного другой

Спасибо большое, завтра уже буду пробовать. С формулой разобралась, теперь главное правильно применить.
А вообще подобный макрос возможно написать? С ним файл будет быстрее.

Автор - uhtiithu
Дата добавления - 21.01.2016 в 23:03
uhtiithu Дата: Пятница, 22.01.2016, 11:13 | Сообщение № 4
Группа: Пользователи
Ранг: Новичок
Сообщений: 11
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Можно так попробовать, права порядок немного другой

Приложила файл. Формула не работает, т.к. у меня между названиями номенклатуры на листе2 есть пробелы (в которых название группы). И ещё данные на Лист2 и на Лист1 начинаются с разных строк по порядку: на первом - с шестой, а на втором - с четвёртой.
К сообщению приложен файл: 1297496.xlsx(25Kb)
 
Ответить
Сообщение
Можно так попробовать, права порядок немного другой

Приложила файл. Формула не работает, т.к. у меня между названиями номенклатуры на листе2 есть пробелы (в которых название группы). И ещё данные на Лист2 и на Лист1 начинаются с разных строк по порядку: на первом - с шестой, а на втором - с четвёртой.

Автор - uhtiithu
Дата добавления - 22.01.2016 в 11:13
Wasilich Дата: Пятница, 22.01.2016, 12:17 | Сообщение № 5
Группа: Друзья
Ранг: Старожил
Сообщений: 1195
Репутация: 316 ±
Замечаний: 0% ±

2003
Макросом.
[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
[/vba]
К сообщению приложен файл: uhtiithu.xls(25Kb)


Сообщение отредактировал Wasilic - Пятница, 22.01.2016, 12:21
 
Ответить
СообщениеМакросом.
[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
[/vba]

Автор - Wasilich
Дата добавления - 22.01.2016 в 12:17
uhtiithu Дата: Пятница, 22.01.2016, 13:05 | Сообщение № 6
Группа: Пользователи
Ранг: Новичок
Сообщений: 11
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Макросом.

Спасибо, но данный макрос просто переносит значения ячейки с листа2 на лист1, при условии, что проверяемая ячейка на листе2 не равна нулю. А у меня условий больше: значение должно переноситься только в том случае, когда у нас совпадает артикул и название на втором листе с теми, которые уже указаны в первом. И при этом нужно понимать, что на втором листе с одним и тем же артикулом и названием есть разные даты.
 
Ответить
Сообщение
Макросом.

Спасибо, но данный макрос просто переносит значения ячейки с листа2 на лист1, при условии, что проверяемая ячейка на листе2 не равна нулю. А у меня условий больше: значение должно переноситься только в том случае, когда у нас совпадает артикул и название на втором листе с теми, которые уже указаны в первом. И при этом нужно понимать, что на втором листе с одним и тем же артикулом и названием есть разные даты.

Автор - uhtiithu
Дата добавления - 22.01.2016 в 13:05
_Boroda_ Дата: Пятница, 22.01.2016, 14:03 | Сообщение № 7
Группа: Модераторы
Ранг: Экселист
Сообщений: 10334
Репутация: 4357 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
А такой вариант?
Формула массива. Вводится одновременным нажатием Контрл Шифт Ентер
Код
=ЕСЛИОШИБКА(ИНДЕКС(Лист2!C$1:C$20;НАИМЕНЬШИЙ(ЕСЛИ(Лист2!$C$5:$C$20<>"";СТРОКА(Лист2!C$5:C$20));СТРОКА(F1)));"")
К сообщению приложен файл: 1297496_1.xlsx(26Kb)


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеА такой вариант?
Формула массива. Вводится одновременным нажатием Контрл Шифт Ентер
Код
=ЕСЛИОШИБКА(ИНДЕКС(Лист2!C$1:C$20;НАИМЕНЬШИЙ(ЕСЛИ(Лист2!$C$5:$C$20<>"";СТРОКА(Лист2!C$5:C$20));СТРОКА(F1)));"")

Автор - _Boroda_
Дата добавления - 22.01.2016 в 14:03
uhtiithu Дата: Пятница, 22.01.2016, 14:50 | Сообщение № 8
Группа: Пользователи
Ранг: Новичок
Сообщений: 11
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Наваяла следующее:

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'.

Что нужно исправлять?
 
Ответить
СообщениеНаваяла следующее:

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'.

Что нужно исправлять?

Автор - uhtiithu
Дата добавления - 22.01.2016 в 14:50
Hugo Дата: Пятница, 22.01.2016, 14:57 | Сообщение № 9
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2671
Репутация: 599 ±
Замечаний: 0% ±

sheet2 не указали.
И вообще Integer тут не годится.


excel@nxt.ru
webmoney: E265281470651 R418926282008 Z422237915069
 
Ответить
Сообщениеsheet2 не указали.
И вообще Integer тут не годится.

Автор - Hugo
Дата добавления - 22.01.2016 в 14:57
uhtiithu Дата: Пятница, 22.01.2016, 15:11 | Сообщение № 10
Группа: Пользователи
Ранг: Новичок
Сообщений: 11
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
И вообще Integer тут не годится.

String?
 
Ответить
Сообщение
И вообще Integer тут не годится.

String?

Автор - uhtiithu
Дата добавления - 22.01.2016 в 15:11
_Boroda_ Дата: Пятница, 22.01.2016, 15:21 | Сообщение № 11
Группа: Модераторы
Ранг: Экселист
Сообщений: 10334
Репутация: 4357 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
В 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.]А формула моя не подошла?


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеВ 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.]А формула моя не подошла?

Автор - _Boroda_
Дата добавления - 22.01.2016 в 15:21
uhtiithu Дата: Пятница, 22.01.2016, 15:57 | Сообщение № 12
Группа: Пользователи
Ранг: Новичок
Сообщений: 11
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
А формула моя не подошла?

формула класс, но: на листе 1 данные по артикулу и наименованию НЕ ДОЛЖНЫ тянуться с листа2. Они должны быть точкой сравнения, которая не может меняться. Я внизу укажу ссылку на рабочий свой файлик, посмотрите какой там масштаб данных. Так будет понятно.
Удалено администрацией
[moder]
Не, ссылку нельзя. Нужно сам файлик. Можно в усеченном виде.
К сообщению приложен файл: 9835737.xlsx(12Kb)


Сообщение отредактировал uhtiithu - Пятница, 22.01.2016, 16:19
 
Ответить
Сообщение
А формула моя не подошла?

формула класс, но: на листе 1 данные по артикулу и наименованию НЕ ДОЛЖНЫ тянуться с листа2. Они должны быть точкой сравнения, которая не может меняться. Я внизу укажу ссылку на рабочий свой файлик, посмотрите какой там масштаб данных. Так будет понятно.
Удалено администрацией
[moder]
Не, ссылку нельзя. Нужно сам файлик. Можно в усеченном виде.

Автор - uhtiithu
Дата добавления - 22.01.2016 в 15:57
gling Дата: Пятница, 22.01.2016, 20:01 | Сообщение № 13
Группа: Друзья
Ранг: Старожил
Сообщений: 1512
Репутация: 376 ±
Замечаний: 0% ±

2010
Формула не работает, т.к. у меня между названиями номенклатуры на листе2 есть пробелы
Пробелы не при чем, нужно сменить диапазоны в формуле так
Код
=ИНДЕКС(Лист2!$D$1:$D$13;СУММПРОИЗВ(НАИБОЛЬШИЙ((Лист2!$C$4:$C$13=A7)*СТРОКА($A$4:$A$13);СЧЁТЕСЛИ($A$6:A7;A7))))
или так
Код
=ИНДЕКС(Лист2!$D$1:$D$13;СУММПРОИЗВ(НАИБОЛЬШИЙ((Лист2!$C$1:$C$13=A7)*СТРОКА($A$1:$A$13);СЧЁТЕСЛИ($A$6:A7;A7))))
К сообщению приложен файл: 2052674.xlsx(25Kb)


Сообщение отредактировал gling - Пятница, 22.01.2016, 20:04
 
Ответить
Сообщение
Формула не работает, т.к. у меня между названиями номенклатуры на листе2 есть пробелы
Пробелы не при чем, нужно сменить диапазоны в формуле так
Код
=ИНДЕКС(Лист2!$D$1:$D$13;СУММПРОИЗВ(НАИБОЛЬШИЙ((Лист2!$C$4:$C$13=A7)*СТРОКА($A$4:$A$13);СЧЁТЕСЛИ($A$6:A7;A7))))
или так
Код
=ИНДЕКС(Лист2!$D$1:$D$13;СУММПРОИЗВ(НАИБОЛЬШИЙ((Лист2!$C$1:$C$13=A7)*СТРОКА($A$1:$A$13);СЧЁТЕСЛИ($A$6:A7;A7))))

Автор - gling
Дата добавления - 22.01.2016 в 20:01
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Макрос для переноса данных. (Макросы/Sub)
Страница 1 из 11
Поиск:

Яндекс цитирования
© 2010-2017 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!