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

Вход

Регистрация

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

 

= Мир MS Excel/2 списка по миллиону строк. ВПР не справляется, как быть? - Мир MS Excel

  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_, DrMini  
2 списка по миллиону строк. ВПР не справляется, как быть?
Sanchez Дата: Понедельник, 14.07.2014, 18:34 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 11
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Всем добрый вечер!
Подскажите пожалуйста, как из одного огромного списка подтянуть данные в другой. ВПР считает часами, но результат плохой. То прекращает расчет, то не находит какие-то значения. Оперативки 2 ГБ.
 
Ответить
СообщениеВсем добрый вечер!
Подскажите пожалуйста, как из одного огромного списка подтянуть данные в другой. ВПР считает часами, но результат плохой. То прекращает расчет, то не находит какие-то значения. Оперативки 2 ГБ.

Автор - Sanchez
Дата добавления - 14.07.2014 в 18:34
Rioran Дата: Понедельник, 14.07.2014, 19:30 | Сообщение № 2
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
Sanchez, можно воспользоваться Access и SQL запросами подтянуть нужные значения. Или можно в Excel сделать макрос, который сам всё расставит по местам - макрос хотя бы может намекнуть, какую строку по счёту он обрабатывает.


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
СообщениеSanchez, можно воспользоваться Access и SQL запросами подтянуть нужные значения. Или можно в Excel сделать макрос, который сам всё расставит по местам - макрос хотя бы может намекнуть, какую строку по счёту он обрабатывает.

Автор - Rioran
Дата добавления - 14.07.2014 в 19:30
Sanchez Дата: Вторник, 15.07.2014, 09:36 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 11
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Rioran Да понятно, что макросом, Аксесом и SQL можно все сделать, но пока во все это въедешь :) Неужели в Excel 2007 нет стандартного функционала для такой задачи...

_Boroda_
Файл приложил, просто надо подтянуть данные из другого листа, проблема в том, что таблица гигантская и ВПР ну не работает. Ждешь несколько часов, а потом или зависает или отрабатывает на половину
К сообщению приложен файл: 4879868.xls (32.0 Kb)
 
Ответить
СообщениеRioran Да понятно, что макросом, Аксесом и SQL можно все сделать, но пока во все это въедешь :) Неужели в Excel 2007 нет стандартного функционала для такой задачи...

_Boroda_
Файл приложил, просто надо подтянуть данные из другого листа, проблема в том, что таблица гигантская и ВПР ну не работает. Ждешь несколько часов, а потом или зависает или отрабатывает на половину

Автор - Sanchez
Дата добавления - 15.07.2014 в 09:36
Hugo Дата: Вторник, 15.07.2014, 10:40 | Сообщение № 4
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3857
Репутация: 814 ±
Замечаний: 0% ±

365
Так где-то за 2 минуты (скорее даже быстрее) 2 миллиона должно обработать.
[vba]
Код
Sub tt()
      Dim a(), b(), c(), i&, t&

      With CreateObject("Scripting.Dictionary"): .comparemode = 1
          a = [Лист2!A1].CurrentRegion.Value
          For i = 2 To UBound(a): .Item(a(i, 1)) = i: Next
          b = [Лист1!A1].CurrentRegion.Columns(1).Value
          c = [Лист1!A1].CurrentRegion.Columns(2).Resize(, 3).Value
          For i = 2 To UBound(b)
              If .exists(b(i, 1)) Then
                  t = .Item(b(i, 1))
                  c(i, 1) = a(t, 2)
                  c(i, 2) = a(t, 3)
                  c(i, 3) = a(t, 4)
              Else
                  c(i, 1) = "нет данных": c(i, 2) = "нет данных": c(i, 3) = "нет данных"
              End If
          Next
          [Лист1!A1].CurrentRegion.Columns(2).Resize(, 3).Value = c
      End With
End Sub
[/vba]
Можно добавить индикацию процесса - но она чуть замедлит сам процесс.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеТак где-то за 2 минуты (скорее даже быстрее) 2 миллиона должно обработать.
[vba]
Код
Sub tt()
      Dim a(), b(), c(), i&, t&

      With CreateObject("Scripting.Dictionary"): .comparemode = 1
          a = [Лист2!A1].CurrentRegion.Value
          For i = 2 To UBound(a): .Item(a(i, 1)) = i: Next
          b = [Лист1!A1].CurrentRegion.Columns(1).Value
          c = [Лист1!A1].CurrentRegion.Columns(2).Resize(, 3).Value
          For i = 2 To UBound(b)
              If .exists(b(i, 1)) Then
                  t = .Item(b(i, 1))
                  c(i, 1) = a(t, 2)
                  c(i, 2) = a(t, 3)
                  c(i, 3) = a(t, 4)
              Else
                  c(i, 1) = "нет данных": c(i, 2) = "нет данных": c(i, 3) = "нет данных"
              End If
          Next
          [Лист1!A1].CurrentRegion.Columns(2).Resize(, 3).Value = c
      End With
End Sub
[/vba]
Можно добавить индикацию процесса - но она чуть замедлит сам процесс.

Автор - Hugo
Дата добавления - 15.07.2014 в 10:40
PowerBoy Дата: Вторник, 15.07.2014, 11:50 | Сообщение № 5
Группа: Проверенные
Ранг: Участник
Сообщений: 100
Репутация: 31 ±
Замечаний: 0% ±

2003
[vba]
Код

Public Sub RefreshData()
'Created using add-in ActiveTables
Dim strConnection As String
Dim strSQL As String
strConnection = iif(Val(application.Version) < 12,"OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties='Excel 8.0;HDR=YES;IMEX=3';","OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties='Excel 12.0;HDR=YES;IMEX=3';")
strSQL = "SELECT  Лист2.нг AS нг, Лист2.Цвет AS Цвет, Лист2.Размер AS Размер FROM  [Лист1$] AS Лист1  LEFT JOIN [Лист2$] AS Лист2  ON Лист1.Номер=Лист2.Номер "
With ThisWorkbook.Sheets(1)
     .Range("B:D").Delete
     With .QueryTables.Add(strConnection, .Range("B1"), strSQL)
          .Refresh False
          .Delete
     End With
End With
End Sub
[/vba]


Excel + SQL = ActiveTables (http://vk.com/ExcelSQL)
 
Ответить
Сообщение[vba]
Код

Public Sub RefreshData()
'Created using add-in ActiveTables
Dim strConnection As String
Dim strSQL As String
strConnection = iif(Val(application.Version) < 12,"OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties='Excel 8.0;HDR=YES;IMEX=3';","OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties='Excel 12.0;HDR=YES;IMEX=3';")
strSQL = "SELECT  Лист2.нг AS нг, Лист2.Цвет AS Цвет, Лист2.Размер AS Размер FROM  [Лист1$] AS Лист1  LEFT JOIN [Лист2$] AS Лист2  ON Лист1.Номер=Лист2.Номер "
With ThisWorkbook.Sheets(1)
     .Range("B:D").Delete
     With .QueryTables.Add(strConnection, .Range("B1"), strSQL)
          .Refresh False
          .Delete
     End With
End With
End Sub
[/vba]

Автор - PowerBoy
Дата добавления - 15.07.2014 в 11:50
Hugo Дата: Вторник, 15.07.2014, 12:01 | Сообщение № 6
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3857
Репутация: 814 ±
Замечаний: 0% ±

365
Чегой-то врёт местами SQL... Посмотрите на 7.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеЧегой-то врёт местами SQL... Посмотрите на 7.

Автор - Hugo
Дата добавления - 15.07.2014 в 12:01
PowerBoy Дата: Вторник, 15.07.2014, 14:32 | Сообщение № 7
Группа: Проверенные
Ранг: Участник
Сообщений: 100
Репутация: 31 ±
Замечаний: 0% ±

2003
Чегой-то врёт местами SQL... Посмотрите на 7.


да нет, просто там число в текстовом столбце забито, для SQL не может быть разных форматов в одном столбце.


Excel + SQL = ActiveTables (http://vk.com/ExcelSQL)
 
Ответить
Сообщение
Чегой-то врёт местами SQL... Посмотрите на 7.


да нет, просто там число в текстовом столбце забито, для SQL не может быть разных форматов в одном столбце.

Автор - PowerBoy
Дата добавления - 15.07.2014 в 14:32
Hugo Дата: Вторник, 15.07.2014, 15:39 | Сообщение № 8
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3857
Репутация: 814 ±
Замечаний: 0% ±

365
А словарь не врёт! :)


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеА словарь не врёт! :)

Автор - Hugo
Дата добавления - 15.07.2014 в 15:39
Hugo Дата: Вторник, 15.07.2014, 16:01 | Сообщение № 9
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3857
Репутация: 814 ±
Замечаний: 0% ±

365
Судя по "отзыву" - Sanchez выбрал то что врёт :(
Почему?

Там кстати ошибка в исходных данных - 2 раза 75 с разным набором данных. Мой код вытягивает последнее, но можно добавить чтоб тянул или всё, или предупреждал о таких случаях.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеСудя по "отзыву" - Sanchez выбрал то что врёт :(
Почему?

Там кстати ошибка в исходных данных - 2 раза 75 с разным набором данных. Мой код вытягивает последнее, но можно добавить чтоб тянул или всё, или предупреждал о таких случаях.

Автор - Hugo
Дата добавления - 15.07.2014 в 16:01
  • Страница 1 из 1
  • 1
Поиск:

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