Страницы: 1
RSS
VBA Копирование данных между таблицами (в соответствии с критериями), Макросы/Sub
 
Добрый вечер.
Hужна помощь в создании макрокоманды.
У меня есть три таблицы:
'ORDER'
Cтолбцы:

  • ITEM
  • STATUS
  • DATE
'BOM'
Cтолбцы:

  • ITEM
  • COMPONENT
'TASK'
Cтолбцы:

  • COMPONENT
  • DATE
Значение "ITEM" является продуктом, компоненты которого приведены в таблице "BOM", здесь записываются все товары и включающие детали. Мне нужно скопировать все детали продукта который был записан в таблице „ORDER“ (когда столбец „STATUS“ таблицы "ORDER" = “OPEN”) в таблицу „TASK“. Для каждого значений элементa скопировать дату из таблицы „ORDER“
 
Код
Sub tt()
    Dim a, i&, d1 As Object, d2 As Object, r As Range

    Set d1 = CreateObject("scripting.dictionary"): d1.comparemode = 1
    Set d2 = CreateObject("scripting.dictionary"): d2.comparemode = 1

    a = ActiveSheet.ListObjects("Order").DataBodyRange.Value
    For i = 1 To UBound(a)
        If a(i, 2) = "OPEN" Then d1.Item(a(i, 1)) = a(i, 3)
    Next

    a = ActiveSheet.ListObjects("BOM").DataBodyRange.Value
    For i = 1 To UBound(a)
        If d1.exists(a(i, 1)) Then d2.Item(a(i, 2)) = d1.Item(a(i, 1))
    Next

    Set r = ActiveSheet.ListObjects("task").DataBodyRange
    r.Cells(1).Offset(r.Rows.Count).Resize(d2.Count, 2) = Application.Transpose(Array(d2.keys, d2.items))

End Sub
 
еще вариант
Код
Sub test()
Dim i&, a1, a2, b, ii&
On Error Resume Next
i = Application.Match("OPEN", [order[status]], 0)
If Err.Number <> 0 Then Exit Sub
a1 = [Order].Cells(i, 1).Value
a2 = [Order].Cells(i, 3).Value
b = [bom].Value
For i = LBound(b) To UBound(b)
 If b(i, 1) = a1 Then ii = ii + 1: b(ii, 1) = b(i, 2): b(ii, 2) = a2
Next
With [task]
.Cells(.Rows.Count + 1, 1).Resize(ii, 2) = b
End With
End Sub
Изменено: B.Key - 18.02.2016 23:37:06
 
Цитата
B.Key написал: еще вариант
очень хороший вариант. но есть недостаток.
1. Выполните только одно значение. если строки со значением "OPEN" два или более. операции осуществляются только на первю линию
2. после операции, должен изменить "OPEN" на "CLOSED" - Это моя ошибка, я писал только В SAMPLE.xls
Цитата
Hugo написал:
2. после операции, должен изменить "OPEN" на "CLOSED" - Это моя ошибка, я писал только В SAMPLE.xls

Мне жаль, что я не упомянул

оценке скорости работы:
B.Key 10/10
Hugo 10/10
замечательный
 
Минимально изменил:
Код
Sub tt()
    Dim a, i&, d1 As Object, d2 As Object, r As Range
 
    Set d1 = CreateObject("scripting.dictionary"): d1.comparemode = 1
    Set d2 = CreateObject("scripting.dictionary"): d2.comparemode = 1
 
    Set a = [Order]
    For i = 1 To a.Rows.Count
        If a.Rows(i).Cells(2) = "OPEN" Then d1.Item(a.Rows(i).Cells(1).Value) = a.Rows(i).Cells(3).Value: a.Rows(i).Cells(2) = "CLOSED"
    Next
 
    a = ActiveSheet.ListObjects("BOM").DataBodyRange.Value
    For i = 1 To UBound(a)
        If d1.exists(a(i, 1)) Then d2.Item(a(i, 2)) = d1.Item(a(i, 1))
    Next
 
 If d2.Count Then
    Set r = ActiveSheet.ListObjects("task").DataBodyRange
    r.Cells(1).Offset(r.Rows.Count).Resize(d2.Count, 2) = Application.Transpose(Array(d2.keys, d2.items))
 End If
 
End Sub
 
Цитата
Hugo написал: Минимально изменил:
Дата из таблицы "ORDER" в таблицy "TASK" падает в виде текста Не число
Мне жаль, что только сейчас заметил
 
Не, она попадает датой (вернее тем, что взялось из исходного диапазона). Но ячейка не форматируется под дату - я это изучал...
Можно навесить формат диапазона в нужном виде - размер и место ведь известны.
Ну или отформатировать заранее с запасом вручную.
Изменено: Hugo - 19.02.2016 12:06:47
 
Цитата
Hugo написал:

Я совершенно зеленый в этом. Я учусь на основе ваших образцов
но на этот раз для меня непонятно
Вы можете помочь? Я попытался сделать более сложный вариант, но мне не выходить
Может быть, если решите этот мне будет яснее - SAMPLE2.xls

Могу ли я вернуть новые значения в старую таблицу, и повторно проверить пока не найдет никаких значений.
SAMPLE3.xls
Изменено: Arnoldas - 23.02.2016 16:47:43
 
Как-то не получается понять задачу. Даже обе задачи.
Попробуйте объяснить словами
 
Цитата
Hugo написал:
Как-то не получается понять задачу. Даже обе задачи.
Sample2.xls Я сделал более сложный вариант первого варианта (Sample1.xls)

У меня есть три таблицы
 'ORDER'     'BOM'  'TASK'
Cтолбцы:
  • ITEM
  • STATUS
  • ORDER NR
  • ORDER DATE
 Cтолбцы:
  • ITEM
  • COMPONENT
  • QTY
Cтолбцы:
  • COMPONENT
  • QTY
  • ORDER DATE
  • ORDER NR
Значение "ITEM" является продуктом, компоненты которого приведены в таблице "BOM", здесь записываются все товары и включающие детали (на этот раз и их число в продукте - QTY). Мне нужно скопировать все детали продукта (их число) который был записан в таблице „ORDER“ (когда столбец „STATUS“ таблицы "ORDER" = “OPEN”) в таблицу „TASK“. Для каждого значений элементa скопировать дату (и номер заказа - ORDER NR) -  из таблицы „ORDER“ и скопировать число - QTY из таблицы „BOM“

выделила красным то, что появилось новое

Sample3.xls Я сделал вариант из двух таблиц
'BOM' 'TASK'
Cтолбцы:
  • ITEM
  • COMPONENT
  • QTY
Cтолбцы:
  • COMPONENT
  • STATUS
  • QTY
  • ORDER DATE
  • ORDER NR
(когда столбец „STATUS“ таблицы "TASK" = “OPEN”) найти и скопировать данные в ту же таблицу „TASK“ .  принцип, как и в первом случае, но данные не передаются в новую таблицу а вернуть их в туже таблицу как новые данные.к онечно, новая линия должна иметь старыи ORDER NR, ORDER DATE и новыи QTY = NEW QTY (FRO "BOM" * OLD QTY (FROM "TASK")

...
 
Или это невозможно?  :)  Я сам пытаюсь, но ничего мне не получается
Изменено: Arnoldas - 01.03.2016 16:09:10
 
На основе макроса Игоря(как понял):
Скрытый текст


P.S. и не надо писать мне в личку, если не собираетесь оплачивать мою работу.
Изменено: KuklP - 03.03.2016 16:50:37
Я сам - дурнее всякого примера! ...
 
решение толка на  SAMPLE2.xls  нету SAMPLE3.xls :)
 
Добрый вечер. Решение неправильно. если в столбце "ITEM" два одинаковых значение со статусам "OPEN" тогда макрос работает толка на первое
 
Не вполне понятно что нужно получить, т.к. нет примера для случая "если в столбце "ITEM" два одинаковых значение со статусам "OPEN"", но я постарался представить что нужно так.

P.S. по третьему файлу ничего не понял, и честно говоря не хочется ломать голову пытаясь понять то, что можно ведь в принципе объяснить доходчиво.
Изменено: Hugo - 06.03.2016 14:37:19
 
Игорь, привет. Третий  я сделал, вопрос решен.
Я сам - дурнее всякого примера! ...
 
Привет, Сергей!
Спасибо, снял проблему. Может и второй уже сделал, а Арнольд молчит? А я зря сегодня время терял?
 
Не, второй так и не понял
Цитата
Hugo написал:
т.к. нет примера для случая "если в столбце "ITEM" два одинаковых значение со статусам "OPEN""
:)
Я сам - дурнее всякого примера! ...
 
Ну я конечно не настолько ленив, чтоб самому не сделать такие исходные данные :)
Но хотелось бы видеть результат - может там нужно всё суммировать вообще, или нужно суммировать если совпадают даты, или ещё как...
 
извенити бил в поездки   те пер всё посмотрю
 
Цитата
Hugo написал:
Не вполне понятно что нужно получить, т.к. нет примера для случая "если в столбце "ITEM" два одинаковых значение со статусам "OPEN"", но я постарался представить что нужно так.
все работает отлично  :) рассчитаемся
Страницы: 1
Наверх