powered by simpleCommunicator - 2.0.39     © 2025 Programmizd 02
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Быстрый поиск в двумерном массиве vba
16 сообщений из 66, страница 3 из 3
Быстрый поиск в двумерном массиве vba
    #39566746
BlackeAngel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymx, так по примеру видно, что этот вариант тоже подойдёт. Но проверять надо входит ли значения со второго листа в первый, а не наоборот.
...
Рейтинг: 0 / 0
Быстрый поиск в двумерном массиве vba
    #39566749
BlackeAngel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymx,4я строка листа итого примера, например.
...
Рейтинг: 0 / 0
Быстрый поиск в двумерном массиве vba
    #39566767
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.к. четкой постановки не услышал, то пока вот что
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
Sub a1()
Dim a As Variant, b As Variant, s As String, i As Integer
Dim d As Object
Set d = CreateObject("Scripting.Dictionary")


Sheets("Лист экселя").Select
a = Sheets("Лист экселя").Range(Cells(1, 1), Cells(1000, 1))
s = ""
For Each v In a
    If v <> "" Then
       d(v) = 1
    End If
Next

Sheets("База сервака").Select
b = Sheets("База сервака").Range(Cells(1, 1), Cells(1000, 1))
For Each v In b
    If v <> "" Then
       i = CInt(d(v))
       If i < 2 Then
          d(v) = i + 2
       End If
    End If
Next

Sheets("Итго").Select
Range(Cells(1, 1), Cells(1000, 3)).Value = ""

i = 1
For Each v In d
    If d(v) = 1 Or d(v) = 3 Then
       Cells(i, 1) = v
    End If
    If d(v) = 2 Or d(v) = 3 Then
       Cells(i, 2) = v
    End If
    i = i + 1
Next


End Sub
...
Рейтинг: 0 / 0
Быстрый поиск в двумерном массиве vba
    #39566769
BlackeAngel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymx,
Базу сервака заполнять надо не так, ТК она идёт напрямую в массив, либо, если знаете как, то напрямую из recordset в dictionary.
...
Рейтинг: 0 / 0
Быстрый поиск в двумерном массиве vba
    #39566771
BlackeAngel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymx, и что значит d(v) = 3 ?
...
Рейтинг: 0 / 0
Быстрый поиск в двумерном массиве vba
    #39566792
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlackeAngelandreymx, и что значит d(v) = 3 ?в объекте d, который dictionary, есть много элементов

текущий элемент с индексом, который текстовый и = v
а значение этого элемента - 1, 2 или 3
1 - только в первом массиве
2 - только во втором
3 - в обоих
...
Рейтинг: 0 / 0
Быстрый поиск в двумерном массиве vba
    #39566794
BlackeAngel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymx, а от Cells отвязаться можно как то?
...
Рейтинг: 0 / 0
Быстрый поиск в двумерном массиве vba
    #39566802
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlackeAngel,

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Sheets("База сервака").Select
b = Sheets("База сервака").Range(Cells(1, 1), Cells(1000, 1))
For Each v In b вместо цикла по массиву
    If v <> "" Then
       i = CInt(d(v))
       If i < 2 Then
          d(v) = i + 2
       End If
    End If
Next


сделай цикл по рекордсету
...
Рейтинг: 0 / 0
Быстрый поиск в двумерном массиве vba
    #39566804
BlackeAngel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymx,
Нет, я про эту часть
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
i = 1
For Each v In d
    If d(v) = 1 Or d(v) = 3 Then
       Cells(i, 1) = v
    End If
    If d(v) = 2 Or d(v) = 3 Then
       Cells(i, 2) = v
    End If
    i = i + 1
Next
...
Рейтинг: 0 / 0
Быстрый поиск в двумерном массиве vba
    #39566805
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlackeAngelandreymx,
Нет, я про эту часть
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
i = 1
For Each v In d
    If d(v) = 1 Or d(v) = 3 Then
       Cells(i, 1) = v
    End If
    If d(v) = 2 Or d(v) = 3 Then
       Cells(i, 2) = v
    End If
    i = i + 1
Next

всё, у меня уикенд, дальше сам, удачи :)
...
Рейтинг: 0 / 0
Быстрый поиск в двумерном массиве vba
    #39567370
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlackeAngelandreymx,
Нет, я про эту часть
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
i = 1
For Each v In d If d(v) = 1 Or d(v) = 3 Then Cells(i, 1) = v End If If d(v) = 2 Or d(v) = 3 Then Cells(i, 2) = v End If i = i + 1 Next

BlackeAngel,
Попробуйте сразу написать запрос, который вернет только нужные Вам данные.
Это должно быть быстрее перебора массива
ADO и SELECT * FROM
http://www.sql.ru/forum/1118914-a/vba-excel-i-adodb-connection?hl=recordset
...
Рейтинг: 0 / 0
Быстрый поиск в двумерном массиве vba
    #39567371
BlackeAngel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bobgos,сейчас как раз под в этом направлении, но встала проблема о том что надо сразу же и подключаться и запрашивать с сервера.
...
Рейтинг: 0 / 0
Быстрый поиск в двумерном массиве vba
    #39567398
BlackeAngel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BobgosЭто должно быть быстрее перебора массива

в разы быстрее получается
...
Рейтинг: 0 / 0
Быстрый поиск в двумерном массиве vba
    #39567445
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlackeAngelBobgosЭто должно быть быстрее перебора массива

в разы быстрее получается
Возвращаясь к постановке вопроса, можно как с сервера так и из листа данные в рекордсет грузить. Для оптимизации откажитесь от transpose даже от MS .если match и index дают ошибки, наверное самый быстрый способ в Экселе через коллекции.
Как нетиповые варианты для поиска расхождений:
А) можно посмотреть на кубы типа на построить сводную в которой источником данных является sql a фильтром значений для того же поля столбец Эксель.
Б) вернуть данные из sql в строки ниже сравниваемых данных Экселе, сортировка по полю, тогда всегда две строки подряд будут идентичными и либо формулой, а лучше sql запросом выбрать уникальные значения.
И никакого перебора ))
...
Рейтинг: 0 / 0
Быстрый поиск в двумерном массиве vba
    #39567447
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlackeAngelBobgos,сейчас как раз под в этом направлении, но встала проблема о том что надо сразу же и подключаться и запрашивать с сервера.
В ado есть command и execute.

И посмотрите, может в 7000 Эксель у вас есть более точные границы для where? Типа дата записи с.. по.. или ещё что. Вдруг ваши 500000 превратятся в 7000 и удалив полные дубликаты вы сможете найти только расхождения.

Но лучше уговорить админов нарисовать в sql db процедуру и не мучайте табличный редактор.
...
Рейтинг: 0 / 0
Быстрый поиск в двумерном массиве vba
    #39567455
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlackeAngel,

Если вы захотите продолжать ваши эксперименты в Excel без привлечения субд, то вам надо знать имя
интересующего вас алгоритма.
Это имя - внешнее соединение.
Когда оба соединяемых набора "достаточно большие" - используется соединение слиянием .
Для него требуется, чтобы оба источника данных были отсортированы по ключу слияния.
(То есть в вашем запросе для получения соединяемого множества из бд необходимо добавить соответствующий order by)

статья из википедии приведет вас обратно на sql.ru:
https://ru.wikipedia.org/wiki/Алгоритм_соединения_слиянием_сортированных_списков

Требуется сообразить, что там описан вариант для inner join.
Вам же, судя по всему, требуется вывести все записи с контрольного листа Excel
в соединении с теми записями из БД, которые подошли по условию сравнения.

Поэтому тамошний псевдокод, который кодирует вариант для inner join, должен быть переписан
для left outer join как-то так:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
//нужно соединить Таблицу 1 (из Excel) и Таблицу 2  (из внешней БД)
 //по условию: МояФункцияСравнения(Таблица1.Колонка1 , Таблица2.Колонка2) = (-1,0,1)

 //внимание, т.к. выводим все из Таблица1, то считаем, что именно в ней нет повторяющихся записей по полю сравнения.

// Таблица1.Сортировать(Колонка1); -- это
// Таблица2.Сортировать(Колонка2); -- и это тоже - начальные условия, 
// !!  данные должны  быть сортированы до начала алгоритма

 Таблица1.ВстатьНаПервуюЗапись;
 Таблица2.ВстатьНаПервуюЗапись;

//-------- начало --------------------------------------
// бежим по всем записям из левой таблицы, соединяя те строки из правой, которые подошли по условию

 ФлагВыводаЛевойЗаписи = 0
 
 Пока Таблица1.НеПоследняяЗапись 
 {
  
     Если Таблица2.НеПоследняяЗапись
           И МояФункцияСравнения(Таблица1.Колонка1 , Таблица2.Колонка2) = -1  -- '  Таблица1.Колонка1 < Таблица2.Колонка2
     {
        
        Если  ФлагВыводаЛевойЗаписи = 0
         {
           Вывести (Таблица1.ТекущаяЗапись, Пусто);
         }

        ФлагВыводаЛевойЗаписи = 0
        Таблица1.ПерейтиКСледующейЗаписи;
     }
  
     Если Таблица2.НеПоследняяЗапись
           И МояФункцияСравнения(Таблица1.Колонка1 , Таблица2.Колонка2) = 0   -- Таблица1.Колонка1 = Таблица2.Колонка2
     {
         Вывести (Таблица1.ТекущаяЗапись, Таблица2.ТекущаяЗапись);
         ФлагВыводаЛевойЗаписи = 1
         Таблица2.ПерейтиКСледующейЗаписи;
     }

     Если Таблица2.НеПоследняяЗапись
            И  МояФункцияСравнения(Таблица1.Колонка1 , Таблица2.Колонка2) = 1   -- Таблица1.Колонка1 > Таблица2.Колонка2          
     {
         Таблица2.ПерейтиКСледующейЗаписи;
     }
                  
     Если Таблица2.НетСледующихЗаписей
     {
         Вывести (Таблица1.ТекущаяЗапись, Пусто);
         Таблица1.ПерейтиКСледующейЗаписи;
     }                  
 }



свои разы-десятки-сотни раз ускорения вы получите.
Особенно если сумеете разумным образом сэкономить на преобразованиях из одной структуры в другую и,
может быть главное, самодельных сортировках.

либо сразу уносите задачу в БД (если получается сформулировать удобное условие соединения).
...
Рейтинг: 0 / 0
16 сообщений из 66, страница 3 из 3
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Быстрый поиск в двумерном массиве vba
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]