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

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

30.11.2017, 16:27. Показов 6275. Ответов 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
34 / 31 / 1
Регистрация: 06.01.2017
Сообщений: 300
06.12.2017, 17:50
Студворк — интернет-сервис помощи студентам
Да я читал, собственно.
Моя реплика, по сути, является ответом на рекомендацию упорядочить массив, в котором ищется нужное значение.
Если по какой-то причине нельзя упорядочить, значит надо перебирать.

Хотя в голове вертится что-то про индексирование полей. Ну да ладно.

Из того, что я увидел - сразу насторожило вот это:

Visual Basic
1
2
3
4
.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, "$", "")
и тому подобное. Конечно будет работать часами, если записывать таким образом.
Когда я начинал заполнять таблицы, у меня тоже работали макросы часами.
Это, в сущности, тоже неплохо - запустил программу и идёшь пить кофе.

Для ускорения операции ввода/вывода надо работать с образами страниц, а не с самими страницами.
Для этого надо использовать свойство Value.

Примерно вот так:
Visual Basic
1
2
3
4
5
6
7
8
 Dim ws as WorkSheet, iR as Range, v as variant
 
 Set iR = ws.Range(ws.Cells(1,1),ws.Cells(1000,1000))
 v = iR.Value '  Снимаем образ - двумерный массив.
.....
' Производим какие-то операции
.....
 iR.Value = v  ' сбрасываем образ
0
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
06.12.2017, 17:54
Цитата Сообщение от MU-GK Посмотреть сообщение
запустил программу и идёшь пить кофе
Хорошая идея. Запустил программу и ушел по своим делам.
Всегда найдется отговорка на этот счет
0
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
06.12.2017, 17:57  [ТС]
fever brain, не ставлю другие задачи, сейчас я пробую через запросы всё это хозяйство прокрутить. Пока что результат печальный, тк на 10 записях уходит 20 сек. Но это из за костылей. А знающие люди не хотят делиться секретом красоты, чтоб ускорить в 2 раза.

Добавлено через 2 минуты
fever brain, не, это не про меня. Нет времени ходить пить кофе. Есть куча параллельных задач. Так что на это отдается 30% производительности компа. Но сроки никто не отменял.
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
06.12.2017, 17:58
Мой вариант пробовали? Мне собственно эксперементировать не на чем, т.к. так и не известны условия задачи, и нет собственно файлов (вроде речь шла о csv когда-то...)
0
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
06.12.2017, 17:58  [ТС]
MU-GK, Value в принципе и используется.
0
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
06.12.2017, 18:04
Цитата Сообщение от blackeangel Посмотреть сообщение
MU-GK, Value в принципе и используется.
То что предложил MU-GK, это решение номер 100
кроме того можно отключить реакцию листа и прочие фитчи сделать

Сейчас решается задача #1 это прикрутить твои данные к коду с коллекциями
мне как и Hugo121, экспериментировать не на чем
более того я сам сгенерировал данные на двух листах чтоб хоть както это показать
0
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
06.12.2017, 18:09  [ТС]
Hugo121, нет ещё. Как только с запросами домучаюсь займусь вашими предложениями. Экспериментировать есть на чем. Создать 500к записей циклом с 12 рандомами не сложно. Принцип я описывал, где мои косяки тоже рассказал.
0
34 / 31 / 1
Регистрация: 06.01.2017
Сообщений: 300
06.12.2017, 18:20
Так Вы, всё-таки, сделайте техническое ускорение — принципиально откажитесь от записи/чтения в ячейки, пользуйтесь только образами, пичем обращами стра н ицы в целом, ну и, как тут советуют, отключите реакции листов.

Прогоните тот алгоритм, что есть сейчас, посмотрите, как там записывается.

Или Вы уже делали тайминг?
0
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
06.12.2017, 20:12
Меня конечно никто не просил

Так-уж и быть проявлю инициативу
вот эти фичи:
Максимальное ускорение работы макросов из под EXCEL
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
'Больше не обновляем страницы после каждого действия
Application.ScreenUpdating = False
 
'Расчёты переводим в ручной режим
Application.Calculation = xlCalculationManual
 
'Отключаем события
Application.EnableEvents = False
 
'Не отображаем границы ячеек
If Workbooks.Count Then
ActiveWorkbook.ActiveSheet.DisplayPageBreaks = False
End If
 
'Отключаем статусную строку
Application.DisplayStatusBar = False
 
'Отключаем сообщения Excel
Application.DisplayAlerts = False
 
 
В конце работы макросов код:
 
'Включаем обновление экрана после каждого события  
Application.ScreenUpdating = True
 
'Расчёты формул - снова в автоматическом режиме
Application.Calculation = xlCalculationAutomatic
 
'Включаем события
Application.EnableEvents = True
 
'Показываем границы ячеек
If Workbooks.Count Then
ActiveWorkbook.ActiveSheet.DisplayPageBreaks = True
End If
 
'Возвращаем статусную строку
Application.DisplayStatusBar = True
 
'Разрешаем сообщения Excel
Application.DisplayAlerts = True
2
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
06.12.2017, 20:17  [ТС]
fever brain, полезно. Пригодится. Но это больше пригодится для работы с ячейками наверное?
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
06.12.2017, 20:25
С калькуляцией в реальной работе правильнее сперва запомнить как было, затем переключить в мануально, затем в конце вернуть как было!
0
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
06.12.2017, 20:57
Цитата Сообщение от blackeangel Посмотреть сообщение
Но это больше пригодится для работы с ячейками наверное?
Ну мы-же с ячейками работаем, верно ?
выводить то результаты мне по любому в ячейки придется

Вот я изменил код, про калькуляцию тоже учел
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
Option Explicit
'
'Код для Лист1
'
Dim cl As New Collection
 
Sub Полное_Ускорение(ByVal Значение As Boolean)
    Static calc
    calc = Application.Calculation
    Application.ScreenUpdating = Значение
    Application.Calculation = IIf(Значение, calc, xlCalculationManual)
    Application.EnableEvents = Значение
    If Workbooks.Count Then
        ActiveWorkbook.ActiveSheet.DisplayPageBreaks = Значение
    End If
    Application.DisplayStatusBar = Значение
    Application.DisplayAlerts = Значение
End Sub
 
 
Private Sub CommandButton2_Click()
    '
    'Поиск приближенных совпадений
    '
    Dim i&, j&, ii&, jj&, s$, try&, v, CurR&, CurC&, ss$
    Dim yes&
    Полное_Ускорение 0 'Включаем полное ускорение
    
    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).Value
                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
    Полное_Ускорение 1 'Выключаем полное ускорение
 
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
Добавлено через 3 минуты
Работает намного быстрее, но лист во время выполнения ни на что не реагирует и приходящих записей не видно
только в конце выполнения все отображается на листе

Проверка массива 10x100 по массиву 20x200 по времени заняло пол секунды.
1
34 / 31 / 1
Регистрация: 06.01.2017
Сообщений: 300
06.12.2017, 21:02
Вы используете Value поячеечно, рекомендую использовать это свойство для ранга, чтобы сбрасывать не по одному значению, а сразу массивами.
1
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
06.12.2017, 21:04  [ТС]
fever brain,
Ну мы-же с ячейками работаем, верно ?
Да, только надо 2 раза: прочитали в память с ячеек, записали в ячейки в конце всех операций. А не в течении цикла работать с листом. Работать в памяти в разы быстрее чем с листом, следовательно с листом надо работать как можно меньше, а не использовать тормозилки интерфейса

Добавлено через 1 минуту
MU-GK, поддерживаю обеими руками
0
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
06.12.2017, 21:14
Так чтоли ?
Visual Basic
1
2
3
4
5
6
7
                    CurC = (try - 3) * 5
 
                    .Cells(CurR, 1 + CurC).Resize(, 4) = Array(s, ss, v.Value, Replace(v.Address, "$", ""))
'                    .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, "$", "")
Добавлено через 4 минуты
Изменил с учетом пожеланий
Visual Basic
1
2
        arr = .Range(.Cells(1, 1), .Cells(ii, jj)) 'Весь массив ячеек сравниваемого листа предаем в память переменой arr
        'Лист3 уже есть в памяти коллекции
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
Private Sub CommandButton2_Click()
    '
    'Поиск приближенных совпадений
    '
    Dim i&, j&, ii&, jj&, s$, try&, v, CurR&, CurC&, ss$
    Dim yes&, arr
    Полное_Ускорение 0 'Включаем полное ускорение
    
    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).Value
                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 'Определение последнего столбца
        
        arr = .Range(.Cells(1, 1), .Cells(ii, jj)) 'Весь массив ячеек сравниваемого листа предаем в память переменой arr
        'Лист3 уже есть в памяти коллекции
        
        For i = 1 To ii: For j = 1 To jj
            yes = 0
            For try = 3 To 100
                ss = arr(i, j)
                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).Resize(, 4) = Array(s, ss, v.Value, Replace(v.Address, "$", ""))
                End With
            Next
            CurR = CurR + yes
        Next j, i
    End With
    Полное_Ускорение 1 'Выключаем полное ускорение
 
End Sub
0
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
06.12.2017, 21:22  [ТС]
fever brain, ну предпологалось, что все листы в памяти будут. То есть лист2 и лист3 в память, работаем с ними ипосле всех манипуляций итог выгружается на лист1. В результате, никаких ускорителей не надо, кроме замораживания интерфейса, который скроет момент заполнения ячеек на листе1.
0
34 / 31 / 1
Регистрация: 06.01.2017
Сообщений: 300
06.12.2017, 21:25
Не в разы а на несколько порядков быстрее.
На лист надо только сбрасывать готовый результат.
Вернее, сначала снять с листа (листов) данные, проделать необходимые данные и сбросить результаты на лист (листы).

особенно этот эффект заметен на больших табюлицах.

Попробуйте сравнить время выполнения:
Кликните здесь для просмотра всего текста
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
[VB]Option Explicit
Const M = 500
Const N = 200
Public X(1 To M, 1 To N) As Double
 
Sub MakeArray()
 Dim i As Long, j As Long
 For i = 1 To M
  For j = 1 To N
   X(i, j) = 2 * i + 3 * j
  Next j
 Next i
End Sub
Sub FillCells()
 Dim i As Long, j As Long
 Dim wb As Workbook, ws As Worksheet
 Set wb = ThisWorkbook
 Set ws = wb.Worksheets("A")
 Call MakeArray
 For i = 1 To M
  For j = 1 To N
   ws.Cells(i, j) = X(i, j)
  Next j
 Next i
End Sub
Sub FillValue()
 Dim i As Long, j As Long
 Dim wb As Workbook, ws As Worksheet, iR As Range
 Set wb = ThisWorkbook
 Set ws = wb.Worksheets("B")
 Call MakeArray
 Set iR = ws.Range(ws.Cells(1, 1), ws.Cells(M, N))
 iR.Value = X
End Sub
Sub Main()
 Dim T0 As Double, TK As Double, dT As Double
 Call MakeArray
 T0 = Timer
 Call FillCells
 TK = Timer
 dT = TK - T0
 Debug.Print "Fill Cells", dT
 
 T0 = Timer
 Call FillValue
 TK = Timer
 dT = TK - T0
 Debug.Print "Fill Value", dT
End Sub[/VB]

Книга с двумя пустыми листами A и И, на которые записываем созданный массив M*N.
Одна функция записывает по ячейкам, другая массивом.

При M = 500/ N = 200 Время работы
Fill Cells 2,734375
Fill Value 0,09375

При M = 1000/ N = 500 Время работы
ll Cells 13,6171875
Fill Value 0,328125

Обратите внимание, что при увеличении объема выводимых данных разница во времени становится существенно больше и в абсолютном и в относительном выражении
1
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
06.12.2017, 21:32
Цитата Сообщение от MU-GK Посмотреть сообщение
Попробуйте сравнить время выполнения
Там у тебя другая задача, приблизь ее к текущей задачи этой темы и выложи
Цитата Сообщение от blackeangel Посмотреть сообщение
ну предпологалось, что все листы в памяти будут. То есть лист2 и лист3 в память
Вы ребята чтото путаете, не мне надо это все ускорять
Я там прокоментировал
что лист3 итак уже в памяти коллекции, а лист2 я перенес в массив arr
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.12.2017, 21:32

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
118
Ответ Создать тему
Новые блоги и статьи
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи. . . .
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru