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

Вход

Регистрация

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

 

= Мир MS Excel/перенос данных из одной таблицы в другую при сравнении столб - Мир MS Excel

Регистрация · Логин: · Пароль: · · Забыли пароль?
Страница 1 из 11
Модератор форума: _Boroda_, Pelena, Manyasha, SLAVICK 
Мир MS Excel » Вопросы и решения » Вопросы по Excel » перенос данных из одной таблицы в другую при сравнении столб (Формулы/Formulas)
перенос данных из одной таблицы в другую при сравнении столб
iluha2190 Дата: Среда, 09.08.2017, 11:43 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 3
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Здравствуйте! Прошу помочь в решении такой задачи: (придется описывать, т.к. файл большой и прикрепить не получится)
в таблицах содержится информация для грузоперевозок: пункт отправки-пункт прибытия-количество-цена.
имеется таблица ЛИСТ1, в которой 26776 строк, и таблица ТАРИФЫ, в которой 145462 строк. Обе таблицы идентичные.
необходимо сравнивать 3 столбца каждой таблицы (город загрузки, город выгрузки, количество) и при полном совпадении переносить из столбца с ценой таблицы ЛИСТ1 в таблицу ТАРИФЫ.
для выполнения задачи сделал вот такой макрос:
[vba]
Код
Sub перенос()
For i = 2 To 26776
For j = 3 To 145462
If Sheets("Лист1").Cells(i, 1) = Sheets("Тарифы").Cells(j, 1) And Sheets("Лист1").Cells(i, 3) = Sheets("Тарифы").Cells(j, 3) And Sheets("Лист1").Cells(i, 4) = Sheets("Тарифы").Cells(j, 4) Then
Sheets("Тарифы").Cells(j, 5) = Sheets("Лист1").Cells(i, 6)
Exit For
End If
Next j
Next i
End Sub
[/vba]
при ручном выполнении (пошаговом при нажатии f8) перенос производится, но очень медленно, т.к. большое количество строк. При запуске макроса перенос идет быстро, но секунд 10 и потом excel зависает. Подскажите, что не так делаю, может быть есть какая-то формула для такой цели, либо можно как то упростить макрос (хотя куда уж проще). Подскажите пожалуйста! Заранее спасибо


Сообщение отредактировал iluha2190 - Среда, 09.08.2017, 12:25
 
Ответить
СообщениеЗдравствуйте! Прошу помочь в решении такой задачи: (придется описывать, т.к. файл большой и прикрепить не получится)
в таблицах содержится информация для грузоперевозок: пункт отправки-пункт прибытия-количество-цена.
имеется таблица ЛИСТ1, в которой 26776 строк, и таблица ТАРИФЫ, в которой 145462 строк. Обе таблицы идентичные.
необходимо сравнивать 3 столбца каждой таблицы (город загрузки, город выгрузки, количество) и при полном совпадении переносить из столбца с ценой таблицы ЛИСТ1 в таблицу ТАРИФЫ.
для выполнения задачи сделал вот такой макрос:
[vba]
Код
Sub перенос()
For i = 2 To 26776
For j = 3 To 145462
If Sheets("Лист1").Cells(i, 1) = Sheets("Тарифы").Cells(j, 1) And Sheets("Лист1").Cells(i, 3) = Sheets("Тарифы").Cells(j, 3) And Sheets("Лист1").Cells(i, 4) = Sheets("Тарифы").Cells(j, 4) Then
Sheets("Тарифы").Cells(j, 5) = Sheets("Лист1").Cells(i, 6)
Exit For
End If
Next j
Next i
End Sub
[/vba]
при ручном выполнении (пошаговом при нажатии f8) перенос производится, но очень медленно, т.к. большое количество строк. При запуске макроса перенос идет быстро, но секунд 10 и потом excel зависает. Подскажите, что не так делаю, может быть есть какая-то формула для такой цели, либо можно как то упростить макрос (хотя куда уж проще). Подскажите пожалуйста! Заранее спасибо

Автор - iluha2190
Дата добавления - 09.08.2017 в 11:43
китин Дата: Среда, 09.08.2017, 12:13 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4351
Репутация: 689 ±
Замечаний: 0% ±

Excel 2007;Excel 2010


Не судите строго:я пытаюсь научиться
ЯД 41001877306852/WM R249698041931; Z239672726538
 
Ответить
СообщениеКак оформлять сообщения?

Автор - китин
Дата добавления - 09.08.2017 в 12:13
_Boroda_ Дата: Среда, 09.08.2017, 12:45 | Сообщение № 3
Группа: Модераторы
Ранг: Местный житель
Сообщений: 11545
Репутация: 4754 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Проще всего сцепить все столбцы через разделитель и формулой вытащить. 27000 х 150000 - это не так уж и много
Формулу потом (если тормозить будет) можно скопировать и вставить значением

как то упростить макрос (хотя куда уж проще)
В макросах (да и не только в них) не простота важна, а эффективность
К сообщению приложен файл: 4111661.xlsm(9Kb)


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеПроще всего сцепить все столбцы через разделитель и формулой вытащить. 27000 х 150000 - это не так уж и много
Формулу потом (если тормозить будет) можно скопировать и вставить значением

как то упростить макрос (хотя куда уж проще)
В макросах (да и не только в них) не простота важна, а эффективность

Автор - _Boroda_
Дата добавления - 09.08.2017 в 12:45
iluha2190 Дата: Среда, 09.08.2017, 14:44 | Сообщение № 4
Группа: Пользователи
Ранг: Прохожий
Сообщений: 3
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
_Boroda_, большое спасибо!!! respect
 
Ответить
Сообщение_Boroda_, большое спасибо!!! respect

Автор - iluha2190
Дата добавления - 09.08.2017 в 14:44
AndreTM Дата: Среда, 09.08.2017, 17:48 | Сообщение № 5
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 496 ±
Замечаний: 0% ±

2003 & 2010
Если делать макросами - то вот такой вариант, наверное, будет самый быстродействующий:
[vba]
Код
Sub test01()

    Set dic = CreateObject("Scripting.Dictionary")
    dic.CompareMode = 1

    Set oTable = ThisWorkbook.Worksheets("Лист1").[a2].CurrentRegion
    If oTable.Row < 2 Then Set oTable = oTable.Offset(2 - oTable.Row).Resize(oTable.Rows.Count - (2 - oTable.Row))
    aTable = oTable.Value
    For i = LBound(aTable) To UBound(aTable)
        dKey = aTable(i, 1) & "|" & aTable(i, 3) & "|" & aTable(i, 4)
        dic(dKey) = aTable(i, 6)
    Next

    Set oTable = ThisWorkbook.Worksheets("Тарифы").[a3].CurrentRegion
    If oTable.Row < 3 Then Set oTable = oTable.Offset(3 - oTable.Row).Resize(oTable.Rows.Count - (3 - oTable.Row))
    aTable = oTable.Value
    For i = LBound(aTable) To UBound(aTable)
        dKey = aTable(i, 1) & "|" & aTable(i, 3) & "|" & aTable(i, 4)
        If dic.exists(dKey) Then aTable(i, 5) = dic(dKey)
    Next
    oTable.Value = aTable

End Sub
[/vba]
По сути, мы здесь делаем то же самое ("..ключ - это сцепить все столбцы условия через разделитель..."), и затем подставляем, только безо всяких вложенных циклов, так что количество операций линейно, и равно суммарному количеству строк в обеих таблицах...


Skype: andre.tm.007
Donate: Qiwi: 9517375010
 
Ответить
СообщениеЕсли делать макросами - то вот такой вариант, наверное, будет самый быстродействующий:
[vba]
Код
Sub test01()

    Set dic = CreateObject("Scripting.Dictionary")
    dic.CompareMode = 1

    Set oTable = ThisWorkbook.Worksheets("Лист1").[a2].CurrentRegion
    If oTable.Row < 2 Then Set oTable = oTable.Offset(2 - oTable.Row).Resize(oTable.Rows.Count - (2 - oTable.Row))
    aTable = oTable.Value
    For i = LBound(aTable) To UBound(aTable)
        dKey = aTable(i, 1) & "|" & aTable(i, 3) & "|" & aTable(i, 4)
        dic(dKey) = aTable(i, 6)
    Next

    Set oTable = ThisWorkbook.Worksheets("Тарифы").[a3].CurrentRegion
    If oTable.Row < 3 Then Set oTable = oTable.Offset(3 - oTable.Row).Resize(oTable.Rows.Count - (3 - oTable.Row))
    aTable = oTable.Value
    For i = LBound(aTable) To UBound(aTable)
        dKey = aTable(i, 1) & "|" & aTable(i, 3) & "|" & aTable(i, 4)
        If dic.exists(dKey) Then aTable(i, 5) = dic(dKey)
    Next
    oTable.Value = aTable

End Sub
[/vba]
По сути, мы здесь делаем то же самое ("..ключ - это сцепить все столбцы условия через разделитель..."), и затем подставляем, только безо всяких вложенных циклов, так что количество операций линейно, и равно суммарному количеству строк в обеих таблицах...

Автор - AndreTM
Дата добавления - 09.08.2017 в 17:48
iluha2190 Дата: Четверг, 10.08.2017, 10:44 | Сообщение № 6
Группа: Пользователи
Ранг: Прохожий
Сообщений: 3
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
AndreTM, спасибо за помощь victory
 
Ответить
СообщениеAndreTM, спасибо за помощь victory

Автор - iluha2190
Дата добавления - 10.08.2017 в 10:44
Мир MS Excel » Вопросы и решения » Вопросы по Excel » перенос данных из одной таблицы в другую при сравнении столб (Формулы/Formulas)
Страница 1 из 11
Поиск:

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