Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/25: Рейтинг темы: голосов - 25, средняя оценка - 4.76
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908

Ускорить работу макроса

30.11.2017, 16:27. Показов 5830. Ответов 117
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как ускорить работу скрипта?
Visual Basic
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
Sub test()
    Dim arr1()
    Application.ScreenUpdating = False
    'range и массив рабочей книги
    ncolumn = Rows(1).Find(What:="Обозначение", LookIn:=xlValues, LookAt:=xlWhole).Column
    Columns(ncolumn + 1).Insert 'вставляем столбец справа
    Cells(1, ncolumn + 1).Value = "Карточки" 'вставляем заголовок столбца
    m = ActiveSheet.Cells(Rows.Count, ncolumn).End(xlUp).Row
    Set rn = ActiveSheet.Cells(2, ncolumn).Resize(m, 2)
    arr2 = rn.Value
    Set conn = New ADODB.Connection     'Создание соединения
    conn.ConnectionString = "Provider=SQLOLEDB.1;Password=132132;Persist Security Info=True;User ID=User;Initial Catalog=dbScanKD;Data Source=SQL05" 'Строка подключения
    conn.Open   'Открытие соединения
    Set rst = New ADODB.Recordset ' Создание объекта Recordset.
    rst.ActiveConnection = conn ' Подключение этого объекта к ранее открытому каналу связи.
    Ask = "SELECT DISTINCT [Oboznach] FROM [dbScanKD].[dbo].[vwScanKD] Where Not ([Oboznach] Like '%СБ'or [Oboznach] Like '%ТУ' or [Oboznach] Like '%ИМ' or [Oboznach] Like '%ДИ' or [Oboznach] Like '%РР' or [Oboznach] Like '%РИ' or [Oboznach] Like '%УД' or [Oboznach] Like '%ЛУ' or [Oboznach] Like '%ТБ' or [Oboznach] Like '%Э3' or [Oboznach] Like '%ПЭ3' or [Oboznach] Like '%Д7' or [Oboznach] Like '%К3' or [Oboznach] Like '%Д4' or [Oboznach] Like '%ДП' or [Oboznach] Like '%РИ' or [Oboznach] Like '%ПГ3' or [Oboznach] Like '%ПГ4' or [Oboznach] Like '%Г4' or [Oboznach] Like '%Э4' or [Oboznach] Like '%ТЭ4' or [Oboznach] Like '%ПИ' or [Oboznach] Like '%И2')"
    rst.Open Ask, conn, adOpenStatic, adLockBatchOptimistic  ' выполняем запрос.
    arr1 = rst.GetRows 'закидываем в массив
    conn.Close 'закрываем соединение
    arr1 = TransposeDim(arr1) 'переворачиваем массив из строк в столбец через функцию TransposeDim с сайта майкрософт
    For i = LBound(arr1) To UBound(arr1)
        For j = LBound(arr2) To UBound(arr2)
            If Len(arr2(j, 1)) > 0 Then
                If InStr(1, arr1(i, 0), "СБ") > 0 Then
                    If InStr(arr2(j, 1), "-") > 0 Then
                        m = Left(arr2(j, 1), InStr(1, arr2(j, 1), "-") - 1) + "СБ"
                        If InStr(1, arr2(j, 1) + "СБ", arr1(i, 0), vbTextCompare) > 0 Then
                            If CInt(arr1(i, 2)) = CInt(arr1(i, 3)) Then 'cравниваем числовые значения
                                arr2(j, 2) = arr1(i, 0)
                            Else
                                arr2(j, 2) = "нет страниц"
                            End If
                        Else
                            If InStr(1, m, arr1(i, 0), vbTextCompare) > 0 Then
                                If CInt(arr1(i, 2)) = CInt(arr1(i, 3)) Then 'cравниваем числовые значения
                                    arr2(j, 2) = arr1(i, 0)
                                Else
                                    arr2(j, 2) = "нет страниц"
                                End If
                            End If
                        End If
                    Else
                        If InStr(1, arr2(j, 1) + "СБ", arr1(i, 0), vbTextCompare) > 0 Then
                            If CInt(arr1(i, 2)) = CInt(arr1(i, 3)) Then 'cравниваем числовые значения
                                arr2(j, 2) = arr1(i, 0)
                            Else
                                arr2(j, 2) = "нет страниц"
                            End If
                        End If
                    End If
                Else
                    If arr2(j, 2) = Empty Then
                        If InStr(1, arr2(j, 1), arr1(i, 0), vbTextCompare) > 0 Then
                            For k = 1 To UBound(massoboz)
                                If InStr(arr2(j, 1), massoboz(k, 1)) > 0 Then
                                    arr2(j, 2) = "нет сборочного"
                                    Exit For
                                Else
                                    If CInt(arr1(i, 2)) = CInt(arr1(i, 3)) Then 'cравниваем числовые значения
                                        arr2(j, 2) = arr1(i, 0)
                                    Else
                                        arr2(j, 2) = "нет страниц"
                                    End If
                                End If
                            Next k
                        End If
                    End If
                End If
            End If
        Next j
    Next i
    ActiveSheet.Cells(2, ncolumn).Resize(UBound(arr2), UBound(arr2, 2)) = arr2'вываливаем на лист
    Application.ScreenUpdating = True
End Sub
А то 2 массива: один 69тыс, второй 500тыс сравнивались друг с другом 6 часов, что мягко говоря очень медленно.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.11.2017, 16:27
Ответы с готовыми решениями:

Как ускорить работу макроса
Привет всем! Есть файл, там макрос. Макрос вычисляет наилучший доход. Макрос работает 10 минут. Это очень долго. Как ускорить работу...

Можно ли ускорить работу макроса
Здравствуйте!) У меня вот такой вопрос...возможно ли каким то образом ускорить работу макроса? Если на С++ перенести ускорится?

Как можно ускорить работу макроса Excel с большим кол-вом итерационных циклов?
Есть задача, которую решил, но хотел бы ускорить работу. Проблема в том что суть программы пройти по строкам и столбцам в 1 таблице,...

117
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
01.12.2017, 15:24  [ТС]
Студворк — интернет-сервис помощи студентам
fever brain, да, работает быстро. Но метод не годный, с ним работать невозможно. Гибкость нулевая, вывести конечный результат тоже невозможно.Просмотр имеющихся данных в коллекции невозможен.
0
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
01.12.2017, 15:42
Наверное просто не умееш
в моем примере посмотреть данные в коллекции можно в окне locals window
там будет список items это те самые ячейки из большой таблицы
просмотреть так-же можно в цикле For Each...next
For Each item In collect
item это элемент коллекции, тоже может быть либо вариантом либо объектом

Добавлено через 3 минуты
Пару дней помучаешся, потом понятно будет как с коллекцией работать, еще искать меня будешь чтобы поблагодарить
0
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
01.12.2017, 18:02  [ТС]
fever brain,
Пару дней помучаешся, потом понятно будет как с коллекцией работать
Наивный) меня 2 месяца обучали массивам, и я до сих пор в них средненько волоку. И это при условии того что представляю это визуально. То есть открываю таблице экселя это передо мной двумерный массив. А словарь, коллекция с чем можно ассоциировать?
Наверное просто не умееш
Действительно, не умею, и об этом я писал уже в этой теме и ранее. А чтобы объяснить, разжевать, ссылки дать на литературу написанную для 3х летнего, никто не хочет. И не надо давать ссылку на книги 1995+ г.в. я в них не понимаю. Хоть на русском написано будет.
С английским тоже косяк - не помню я его. Да да, так и живу.

Добавлено через 1 минуту
Hugo121, кто то просил вчера данные
Ускорить работу макроса
Листы подписаны, что надо получить тоже имеется.
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
01.12.2017, 18:11
Так то вчера просил, вчера и нужно было давать
Ну может вечером посмотрю, если буду свободен.
0
01.12.2017, 18:19  [ТС]

Не по теме:

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

0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
01.12.2017, 20:48

Не по теме:

Ну а я чисто физически днём не могу взять файл, т.к. на работе :(
А сегодня уже пятница! :)



Добавлено через 1 час 55 минут
Файл глянул - толку 0. Как сравнивать то? По коду не прогнать - нет того музобоза... и мне кажется в коде много лишнего...
Если нужно сравнивать по первым двум элементам массива "сплит по точкам" и + три символа третьего (по результату вроде так, только странно что для Жг8.612.739 пара не подобрана) - так и скажите, тогда можно и на словаре, и коллекции быстро получить точно такой же результат.

Добавлено через 32 минуты
Ну или примерно такой результат - ибо там на листе "Итго" какая-то компиляция из данных файла и базы, на поддающаяся логике... Ни к листу подтянуто из базы, ни к базе из листа...
0
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
01.12.2017, 20:51  [ТС]
Hugo121, что значит как сравнивать? Есть лист 1 на нем исходные данные, второй лист это база. Надо сравнить есть ли в базе номера с первого листа. Для этого я беру базу и всю её прогоняю по одному номеру из листа исходных данных. Ищу именно входимость если нет точного совпадения, и так по каждому номеру. Отсюда и номер с жг...-08 не нашел пару, ТК он не входит жг без -08
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
01.12.2017, 21:02
Не, там каша:

Лист База
ЭС25.267.001.Ц1 ЭС25.267.001
ЭС25.266.001 ЭС25.266.001СБ
ЭС25.265.001 ЭС25.278.005СБ
ЭС25.278.005 ЭС25.278.001
ЭС25.278.001 Жг8.612.739-08
Жг8.612.739 ЭС25.265.001-03

Результаты
Обозначение Карточки
ЭС25.267.001.Ц1 ЭС25.267.001 такого номера в базе нет
ЭС25.266.001-01 ЭС25.266.001СБ такого номера в базе нет
ЭС25.278.005 ЭС25.278.005СБ
ЭС25.278.001 ЭС25.278.001
Жг8.612.739 такой номер есть!
ЭС25.265.001-03 ЭС25.265.001-03

Добавлено через 1 минуту
Почему для ЭС25.278.005 пара нашлась, а для Жг8.612.739 нет?

Добавлено через 29 секунд
Откуда в результате взялось ЭС25.266.001-01?

Добавлено через 47 секунд
Почему есть пара для ЭС25.267.001.Ц1?
0
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
01.12.2017, 21:21  [ТС]
Почему для ЭС25.278.005 пара нашлась, а для Жг8.612.739 нет?
Потому что при наложении, если смотреть код, проверяется несколько вариантов: с "СБ", и точное совпадение.
То есть ЭС25.278.005СБ(из базы)=ЭС25.278.005+"СБ", поэтому и нашлась пара.
Для Жг8.612.739:
Жг8.612.739-08 <>Жг8.612.739 или Жг8.612.739-08 <>Жг8.612.739+"СБ"
Откуда в результате взялось ЭС25.266.001-01?
Почему есть пара для ЭС25.267.001.Ц1?
Да, на лист забыл добавить "-01"
А .Ц1, скопировалось по работе( как раз этот номер обсуждали..)
Косячок, однако.
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
01.12.2017, 21:29
Цитата Сообщение от blackeangel Посмотреть сообщение
проверяется несколько вариантов: с "СБ", и точное совпадение
- так, уже теплее.
Только два таких варианта? Тогда делаем на каждое значение два ключа, которым в item кладём индекс массива куда нужно копировать совпадение и всё. Ну или в коллекцию... с словарём просто код проще.
Т.е набили при одном проходе по листу в словарь пары
ЭС25.278.005 итем=5
ЭС25.278.005СБ итем=5
Затем при одном проходе по базе когда проверяем ЭС25.278.005СБ из словаря получим информацию, что это значение нужно копировать в строку 5 массива листа.
Всё.
0
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
01.12.2017, 21:35  [ТС]
Hugo121, не берите за пример самый простой вариант. Возьмите с чертовой, там где надо сначало проверить 2 варианта, если они оба не подошли, откинуть все что после чёрточки и повторить. При всем этом надо ещё сравнивать значения столбцов если они равны то писать, если не равны писать надпись.
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
01.12.2017, 21:38
Про чёртову не понял, ну да ладно - добавьте ещё ключ "откинуть все что после чёрточки". Ну будет чуть дольше словарь пополняться, ну или ключ для проверки чуть дольше собираться... Не понял последовательность какая нужна.

Добавлено через 20 секунд
Всё, я пошёл Голос смотреть...
0
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
01.12.2017, 22:00
Немного изменил свой аттач чтобы нагляднее увидеть что получается у меня
Миниатюры
Ускорить работу макроса  
Вложения
Тип файла: rar Копия Поиск приближенных значений в двух таблицах.rar (56.4 Кб, 5 просмотров)
0
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
01.12.2017, 22:12
То что в первой колонке это что уже найденно с ключем из 3-х знаков
во второй колонке найденно по совпадению с ключем из 4-х знаков
в третей колонке найденно по совпадению с ключем из 5-х знаков

почему разное число знаков ?
потомучто в коллекцию нельзя добавить одинаковый ключ
поэтому в название ключа дописывается следующий знак чтоб коллекция это значение добавила

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

Добавлено через 4 минуты
Кликните здесь для просмотра всего текста
Visual Basic
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
Option Explicit
'
'Код для Лист1
'
Dim cl As New Collection
 
Private Sub CommandButton2_Click()
    '
    'Поиск приближенных совпадений
    '
    Dim i&, j&, ii&, jj&, s$, try&, v, CurR&, CurC&, ss$
    Dim yes&
    On Error Resume Next 'Включаем игнор ошибок
    Set cl = New Collection 'Инициализируем коллекцию
    CurR = 14 'Сюда будем писать результаты начиная с 14-й строки
    
    With Sheets("лист3") 'Заполняем коллекцию для искомых данных
        ii = .Cells(Rows.Count, 1).End(xlUp).Row 'Определение последней заполненной строки
        jj = .Cells(1, Columns.Count).End(xlToLeft).Column 'Определение последнего столбца
        For i = 1 To ii: For j = 1 To jj
            For try = 3 To 100
                s = Space(try): RSet s = .Cells(i, j)
                Err.Clear: cl.Add .Cells(i, j), s
                If Err = 0 Then Exit For 'Выход если ключ не занят
            Next
        Next j, i
    End With
    
    CommandButton3_Click 'Очистить старые результаты
    
    
    
    With Sheets("лист2")
        ii = .Cells(Rows.Count, 1).End(xlUp).Row 'Определение последней заполненной строки
        jj = .Cells(1, Columns.Count).End(xlToLeft).Column 'Определение последнего столбца
        For i = 1 To ii: For j = 1 To jj
            yes = 0
            For try = 3 To 100
                ss = .Cells(i, j).Value
                s = Space(try): RSet s = ss
                Err.Clear
                Set v = cl(s)
                If Err Then Exit For 'Эта ошибка возникает если совпадений более нет
                yes = 1
                With Sheets("лист1")
                    
                    CurC = (try - 3) * 5
                    .Cells(CurR, 1 + CurC).Value = s
                    .Cells(CurR, 2 + CurC).Value = ss
                    .Cells(CurR, 3 + CurC).Value = v.Value
                    .Cells(CurR, 4 + CurC).Value = Replace(v.Address, "$", "")
                    
                End With
            Next
            CurR = CurR + yes
        Next j, i
    End With
    
 
End Sub
 
Sub RWord(Range As Range)
    '
    'Случайное слово с точкой и цифрой
    '
    Dim i&, j&, s$
    s = Space(20)
    For i = 1 To 3
        Mid$(s, i, 1) = Chr(97 + Fix(Rnd * 26))
    Next: Mid$(s, i, 1) = "."
    For i = i + 1 To i + 3 + Fix(Rnd * 3)
        Mid$(s, i, 1) = Fix(Rnd * 10)
    Next
    Range.Value = RTrim$(s)
End Sub
 
Private Sub CommandButton1_Click()
    '
    'Создание двух таблиц со случайными значениями
    '
    Dim i&, j&
    Randomize
    With Sheets("лист2")
        .Cells.ClearContents
        For i = 1 To 100: For j = 1 To 10
            RWord .Cells(i, j)
        Next j, i
    End With
    With Sheets("лист3")
        .Cells.ClearContents
        For i = 1 To 200: For j = 1 To 20
            RWord .Cells(i, j)
        Next j, i
    End With
End Sub
 
 
Private Sub CommandButton3_Click()
    Dim i&, j&
    With Sheets("лист1")
        .Rows("14:" & .Cells(Rows.Count, 1).End(xlUp).Row).ClearContents
        .Rows("12:12").Interior.ColorIndex = 15
        .Rows("13:13").Font.Bold = True
        For i = 1 To 20 Step 5: For j = 1 To 4
            .Cells(13, j + i - 1) = Choose(j, "код", "искомое", "в таблице", "адрес")
        Next j, i
    End With
End Sub
0
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
04.12.2017, 14:51  [ТС]
fever brain, а запросом можно хотя бы половину?
0
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
05.12.2017, 10:51
Как ты получал двумерный массив запросом, так и сделай
в моем примере что я дал, это двумерный массив и есть .cells(i,j)
Можеш сразу перенести данные в проверяемый лист и использовать так:

With Sheets("Полученные данные") 'Заполняем коллекцию для искомых данных...
0
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
05.12.2017, 16:00  [ТС]
fever brain, начал писать так
Кликните здесь для просмотра всего текста
Code
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
Sub KD5_Zapros()
    a = Timer
    Application.ScreenUpdating = False
    'удаляем предыдущую базу если вдруг есть ==>
    Set fso = CreateObject("Scripting.FileSystemObject")
    If fso.FileExists(ActiveWorkbook.FullName & ".mdb") Then fso.DeleteFile ActiveWorkbook.FullName & ".mdb", True
    'удаляем предыдущую базу если вдруг есть <==
    Dim dbConnectStr As String
    Dim Catalog As Object
    Dim cnt As ADODB.Connection
    Dim sCon$, rs As Object
    Dim sSQL$
    Set rs = CreateObject("ADODB.Recordset")
    'Module5.sboboz 'сборочные шаблоны
    'massoboz = Module5.oboz
    ncolumn = Rows(1).Find(What:="Обозначение", LookIn:=xlValues, LookAt:=xlWhole).Column
    Columns(ncolumn + 1).Insert
    Cells(1, ncolumn + 1).Value = "Карточки"
    
    'сортировка ====>
    ActiveSheet.UsedRange.Select 'выделяем по тому что есть
    If ActiveSheet.AutoFilterMode = False Then 'если нет фильтра - ставим
        Selection.AutoFilter 'ставим фильтр
    End If
    ActiveWorkbook.Worksheets(ActiveSheet.Name).AutoFilter.Sort.SortFields.Clear
    ActiveSheet.AutoFilter.Sort.SortFields.Add Key:=Range(Cells(1, ncolumn), Cells(Rows.Count, ncolumn)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortTextAsNumbers
    With ActiveWorkbook.Worksheets(ActiveSheet.Name).AutoFilter.Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Selection.AutoFilter
    Range("A1").Select
    'сортировка <====
    
    'запрос с листа ====>
    Select Case CLng(Split(Application.Version, ".")(0))
        Case Is < 12
            sCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ActiveWorkbook.FullName _
              & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
            dbConnectStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ActiveWorkbook.FullName & ".mdb" & ";"
        Case Is >= 12
            sCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ActiveWorkbook.FullName _
            & ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";"
            dbConnectStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ActiveWorkbook.FullName & ".mdb" & ";"
    End Select
        'создаем файл
    Set Catalog = CreateObject("ADOX.Catalog")
    Catalog.Create dbConnectStr
    Set Catalog = Nothing
 
    Set cnt = New ADODB.Connection
    
    'создаем таблицы ==>
    With cnt
        .Open dbConnectStr
        .Execute "CREATE TABLE base ([Oboznach] text(50) WITH Compression, " & _
                 "[izm] text(50) WITH Compression, " & _
                 "[Count_page] text(50) WITH Compression)" 'таблица базы
    End With
    'создаем таблицы <==
    
    'заполняем с листа ==>
    sSQL = "SELECT [Обозначение] INTO list FROM [Excel 12.0;HDR=YES;IMEX=1;DATABASE=" & ActiveWorkbook.FullName & "].[" & ActiveSheet.Name & "$]"
    Set rs = cnt.Execute(sSQL)
    'заполняем с листа <==
    
    'заполняем с сервера ==>
    'Set conn = New ADODB.Connection
    'conn.ConnectionString = "Provider=SQLOLEDB.1;Password=1qaz@WSX;Persist Security Info=True;User ID=User_for_macros_PDM;Initial Catalog=db_pdm_ScanKD;Data Source=RTVS-SQL05" 'Строка подключения
    'conn.Open
    'Set rst = New ADODB.Recordset
    'rst.ActiveConnection = conn
    'Ask = "SELECT [Oboznach],[izm],[Count_page], COUNT(*) as КоличествоЗаписей " _
    '& "FROM [db_pdm_ScanKD].[dbo].[pdm_vwScanKD] " _
    '& "Where Not ([Oboznach] Like '%ТУ' or [Oboznach] Like '%ИМ' or [Oboznach] Like '%ДИ' or [Oboznach] Like '%РР' or [Oboznach] Like '%РИ' or [Oboznach] Like '%УД' or [Oboznach] Like '%ЛУ' or [Oboznach] Like '%ТБ' or [Oboznach] Like '%Э3' or [Oboznach] Like '%ПЭ3' or [Oboznach] Like '%Д7' or [Oboznach] Like '%К3' or [Oboznach] Like '%Д4' or [Oboznach] Like '%ДП' or [Oboznach] Like '%РИ' or [Oboznach] Like '%ПГ3' or [Oboznach] Like '%ПГ4' or [Oboznach] Like '%Г4' or [Oboznach] Like '%ПГ3' or [Oboznach] Like '%Э4' or [Oboznach] Like '%ТЭ4' or [Oboznach] Like '%ПИ' or [Oboznach] Like '%И2') " _
    '& " GROUP BY [Oboznach],[izm],[Count_page]"
    'rst.Open Ask, conn, adOpenStatic, adLockBatchOptimistic
    'arr1 = rst.GetRows
    'conn.Closes
    'заполняем с сервера <==
    
    Application.ScreenUpdating = True
    cnt.Close
    MsgBox Timer - a
    Stop
End Sub

Как сделать запросом перенести таблицу из базы сервера в свою базу?
0
06.12.2017, 12:23

Не по теме:

Жгёте! Подпишусь на тему!

0
34 / 31 / 1
Регистрация: 06.01.2017
Сообщений: 300
06.12.2017, 17:14
Тут надо применить более мощный поиск, хотя бы методом половинного деления.
Т.е. при отыскании элемента #j из массива Arr1 не перебирать все #i во втором массиве, а взять для сравнение значение из середины таблицы.
Если это значение "больше", значит искомый номер находится в верхней половине - смотрим середину верхней половины, если меньше - идём на середину нижней половины. Ну и так далее, пока верхняя и нижняя границы не совпадут.
Слышал я, что есть методы и посильнее, на основе чисел Фиббоначчи, но не пользовался.
Для этого надо индексировать массивы, т.е. каждому его элементу приписать некое значения, так, чтобы их можно было "сравнивать".
0
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
06.12.2017, 17:23
Цитата Сообщение от MU-GK Посмотреть сообщение
методом половинного деления
при чем здесь это ?
сказанно было что массив неупорядочен. Вы тему то почитайте
Человек чтото черпает с базы данных ему надо сравнить с имеющимеся значениями
в таблице, получает он эти данные в виде двумерного массива но элементы взаимосвязанны
такчто упорядоченность отпадает а значит единственный верный способ использовать коллекцию
которая отвечает поставленной задаче ускорения работы макроса.
Сейчас автор темы ставит уже другие задачи
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.12.2017, 17:23
Помогаю со студенческими работами здесь

Ускорить код макроса
Привет! Пожалуйста подскажите как можно ускорить код одна строяка выполняется 5 секунд, а у меня их чуть больше миллиона, но прикидкам...

Ускорить действие макроса переноса данных на другой лист
Здравствуйте, имеется макрос для переноса данных на другой лист, но когда данных много (например: около 2000 тыс строк) он начинает...

Ускорить работу кода
Привет всем, Столкнулся с такой проблемой, что мне нужно, что бы код находил нужную ячейку и удалял всю строку со смещением вверх...

Как ускорить работу пользовательской функции с диапазонами
Добрый день всем!! Имеется пользовательская функция работы с одним и тем же диапазоном ячеек, в качестве одного из объявленных...

Как прекратить работу макроса?
Кроме goto к метке в конце программы


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Новые блоги и статьи
[golang] Алгоритм «Хак Госпера»
alhaos 17.05.2026
Алгоритм «Хак Госпера» Хак Госпера (Gosper's Hack) — алгоритм нахождения следующего по величине числа с тем же количеством установленных бит. Придуман Биллом Госпером в 1970-х, опубликован в. . .
Рисование бинарного древа до 6-го колена на js, svg.
russiannick 17.05.2026
<svg width="335" height="240" viewBox="0 0 335 240" fill="#e5e1bb"> <style> <!]> </ style> <g id="bush"> </ g> </ svg> function fn(){ let rost;/ / высота древа let xx=165,yy=210,w=256;
FSharp: interface of module
DevAlt 16.05.2026
Интерфейс модуля F# позволяет управлять доступностью членов, содержащихся в реализации модуля. По-умолчанию все члены модуля доступны: module Foo let x = 10 let boo () = printfn "boo" . . .
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции. <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible". . .
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов. import "math" func angleClock(hour int, minutes int) float64 { . . .
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru