Доброго времени суток! Есть вот такая вот трудность. В ОЧЕНЬ большом файле с множеством страниц, формул и макросов есть внутри кода вот такая вот процедура: [vba]
Код
Sub Macro1()
Application.ScreenUpdating = 0 Dim StartChar As Integer
For n = 12 To 13 For i = 36 To 47 With Sheets("Sheet1").Cells(i, n) StartChar = InStr(1, .Value, "(C") If StartChar <> 0 Then .Characters(Start:=StartChar).Font.ColorIndex = 3 End If StartChar = InStr(1, .Value, "(B") If StartChar <> 0 Then .Characters(Start:=StartChar).Font.Color = -4165632 End If StartChar = InStr(1, .Value, "(A") If StartChar <> 0 Then .Characters(Start:=StartChar).Font.Color = -11489280 End If StartChar = InStr(1, .Value, "(") If StartChar <> 0 Then .Characters(Start:=StartChar).Font.FontStyle = "Regular" .Characters(Start:=StartChar).Font.Size = 10 End If End With Next i Next n Application.ScreenUpdating = 1
End Sub
[/vba]
И именно в этом файле эта процедура выполняется медленно, что вместе со всеми остальными процессами увеличивает время выполнения макроса. Но вот в файле, что я прилагаю для примера, всё происходит за десятые доли секунды... И, собственно, прошу вас каким-либо образом подсказать/помочь в решении этого вопроса. Я также понимаю, что сам код я, возможно, "коряво" написал (хотя всё работает) - поправьте пожалуйста, если не затруднит. Заранее спасибо.
Доброго времени суток! Есть вот такая вот трудность. В ОЧЕНЬ большом файле с множеством страниц, формул и макросов есть внутри кода вот такая вот процедура: [vba]
Код
Sub Macro1()
Application.ScreenUpdating = 0 Dim StartChar As Integer
For n = 12 To 13 For i = 36 To 47 With Sheets("Sheet1").Cells(i, n) StartChar = InStr(1, .Value, "(C") If StartChar <> 0 Then .Characters(Start:=StartChar).Font.ColorIndex = 3 End If StartChar = InStr(1, .Value, "(B") If StartChar <> 0 Then .Characters(Start:=StartChar).Font.Color = -4165632 End If StartChar = InStr(1, .Value, "(A") If StartChar <> 0 Then .Characters(Start:=StartChar).Font.Color = -11489280 End If StartChar = InStr(1, .Value, "(") If StartChar <> 0 Then .Characters(Start:=StartChar).Font.FontStyle = "Regular" .Characters(Start:=StartChar).Font.Size = 10 End If End With Next i Next n Application.ScreenUpdating = 1
End Sub
[/vba]
И именно в этом файле эта процедура выполняется медленно, что вместе со всеми остальными процессами увеличивает время выполнения макроса. Но вот в файле, что я прилагаю для примера, всё происходит за десятые доли секунды... И, собственно, прошу вас каким-либо образом подсказать/помочь в решении этого вопроса. Я также понимаю, что сам код я, возможно, "коряво" написал (хотя всё работает) - поправьте пожалуйста, если не затруднит. Заранее спасибо.master-dd
master-dd, привет попробуйте в начале процедуры добавить [vba]
Код
With Application .ScreenUpdating = False .Calculation = xlCalculationManual .EnableEvents = False End With
[/vba] а в конце не забудьте [vba]
Код
With Application .ScreenUpdating = True .Calculation = xlCalculationAutomatic .EnableEvents = True End With
[/vba]
upd и, возможно, Select Case добавит ускорения
[vba]
Код
Sub Macro1() With Application .ScreenUpdating = False .Calculation = xlCalculationManual .EnableEvents = False End With
With Sheets("Sheet1") For n = 12 To 13 For i = 36 To 47 With .Cells(i, n) Select Case True Case InStr(1, .Value, "(C") .Characters(Start:=InStr(1, .Value, "(C")).Font.ColorIndex = 3 Case InStr(1, .Value, "(B") .Characters(Start:=InStr(1, .Value, "(B")).Font.Color = -4165632 Case InStr(1, .Value, "(A") .Characters(Start:=InStr(1, .Value, "(A")).Font.Color = -11489280 Case InStr(1, .Value, "(") .Characters(Start:=InStr(1, .Value, "(")).Font.FontStyle = "Regular" .Characters(Start:=InStr(1, .Value, "(")).Font.Size = 10 End Select End With Next i Next n End With
With Application .ScreenUpdating = True .Calculation = xlCalculationAutomatic .EnableEvents = True End With End Sub
[/vba]
master-dd, привет попробуйте в начале процедуры добавить [vba]
Код
With Application .ScreenUpdating = False .Calculation = xlCalculationManual .EnableEvents = False End With
[/vba] а в конце не забудьте [vba]
Код
With Application .ScreenUpdating = True .Calculation = xlCalculationAutomatic .EnableEvents = True End With
[/vba]
upd и, возможно, Select Case добавит ускорения
[vba]
Код
Sub Macro1() With Application .ScreenUpdating = False .Calculation = xlCalculationManual .EnableEvents = False End With
With Sheets("Sheet1") For n = 12 To 13 For i = 36 To 47 With .Cells(i, n) Select Case True Case InStr(1, .Value, "(C") .Characters(Start:=InStr(1, .Value, "(C")).Font.ColorIndex = 3 Case InStr(1, .Value, "(B") .Characters(Start:=InStr(1, .Value, "(B")).Font.Color = -4165632 Case InStr(1, .Value, "(A") .Characters(Start:=InStr(1, .Value, "(A")).Font.Color = -11489280 Case InStr(1, .Value, "(") .Characters(Start:=InStr(1, .Value, "(")).Font.FontStyle = "Regular" .Characters(Start:=InStr(1, .Value, "(")).Font.Size = 10 End Select End With Next i Next n End With
With Application .ScreenUpdating = True .Calculation = xlCalculationAutomatic .EnableEvents = True End With End Sub
Согласен с nilem, но предложу свой вариант CASE и добавил макрос для тестирования скорости выполнения [vba]
Код
Sub test() Dim Start!: Start = Timer
Call Macro2
Debug.Print Timer - Start MsgBox "Затрачено: " & Timer - Start & " сек." End Sub
Sub Macro2() With Application: .ScreenUpdating = False: .EnableEvents = False For n = 12 To 13 For i = 36 To 47 With Sheets("Sheet1").Cells(i, n) StartChar = InStr(1, .Value, "(") If StartChar <> 0 Then Select Case True Case .Value Like "*(C*" .Characters(Start:=StartChar).Font.Color = vbRed Case .Value Like "*(B*" .Characters(Start:=StartChar).Font.Color = vbBlue Case .Value Like "*(A*" .Characters(Start:=StartChar).Font.Color = vbGreen End Select .Characters(Start:=StartChar).Font.FontStyle = "Regular" .Characters(Start:=StartChar).Font.Size = 10 End If End With Next i Next n .ScreenUpdating = True: .EnableEvents = False: End With End Sub
[/vba]
Согласен с nilem, но предложу свой вариант CASE и добавил макрос для тестирования скорости выполнения [vba]
Код
Sub test() Dim Start!: Start = Timer
Call Macro2
Debug.Print Timer - Start MsgBox "Затрачено: " & Timer - Start & " сек." End Sub
Sub Macro2() With Application: .ScreenUpdating = False: .EnableEvents = False For n = 12 To 13 For i = 36 To 47 With Sheets("Sheet1").Cells(i, n) StartChar = InStr(1, .Value, "(") If StartChar <> 0 Then Select Case True Case .Value Like "*(C*" .Characters(Start:=StartChar).Font.Color = vbRed Case .Value Like "*(B*" .Characters(Start:=StartChar).Font.Color = vbBlue Case .Value Like "*(A*" .Characters(Start:=StartChar).Font.Color = vbGreen End Select .Characters(Start:=StartChar).Font.FontStyle = "Regular" .Characters(Start:=StartChar).Font.Size = 10 End If End With Next i Next n .ScreenUpdating = True: .EnableEvents = False: End With End Sub
Sub Macro11() t_ = Timer Application.ScreenUpdating = 0 Application.Calculation = xlCalculationManual 'немного ускоряет почему-то, хоть мы и не пересчитываем ничего Dim st_ As Byte '255 символов With Sheets("Sheet1") c1_ = 12 c2_ = 13 r1_ = 36 r2_ = .Cells(.Rows.Count, c1_).End(3).Row nc_ = c2_ - c1_ + 1 nr_ = r2_ - r1_ + 1 ar = .Cells(r1_, c1_).Resize(nr_, nc_) For c_ = 1 To nc_ For r_ = 1 To nr_ st_ = InStr(ar(r_, c_), "(") If st_ <> 0 Then Select Case Mid(ar(r_, c_), st_ + 1, 1) Case "C" col_ = 255 Case "B" col_ = 12611584 Case "A" col_ = 5287936 End Select If col_ Then With .Cells(r_ + r1_ - 1, c_ + c1_ - 1).Characters(Start:=st_).Font .Color = col_ .FontStyle = "Regular" .Size = 10 End With End If End If Next r_ Next c_ End With Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = 1 tt_ = Timer - t_ MsgBox tt_ End Sub
[/vba]
[vba]
Код
Sub Vtor() t_ = Timer Application.ScreenUpdating = 0 Dim StartChar As Byte '255 символов With Sheets("Sheet1") r_ = .Cells(.Rows.Count, 12).End(3).Row For n = 12 To 13 For i = 36 To r_ With .Cells(i, n) StartChar = InStr(1, .Value, "(") If StartChar <> 0 Then Select Case Mid(.Value, StartChar + 1, 1) Case "C" col_ = 255 Case "B" col_ = 12611584 Case "A" col_ = 5287936 End Select If col_ Then With .Characters(Start:=StartChar).Font .Color = col_ .FontStyle = "Regular" .Size = 10 End With End If End If End With Next i Next n End With Application.ScreenUpdating = 1 tt_ = Timer - t_ MsgBox tt_ End Sub
[/vba]
*что-то тег макроса сбоит - не хочет много отступов делать
У меня такие варианты
[vba]
Код
Sub Macro11() t_ = Timer Application.ScreenUpdating = 0 Application.Calculation = xlCalculationManual 'немного ускоряет почему-то, хоть мы и не пересчитываем ничего Dim st_ As Byte '255 символов With Sheets("Sheet1") c1_ = 12 c2_ = 13 r1_ = 36 r2_ = .Cells(.Rows.Count, c1_).End(3).Row nc_ = c2_ - c1_ + 1 nr_ = r2_ - r1_ + 1 ar = .Cells(r1_, c1_).Resize(nr_, nc_) For c_ = 1 To nc_ For r_ = 1 To nr_ st_ = InStr(ar(r_, c_), "(") If st_ <> 0 Then Select Case Mid(ar(r_, c_), st_ + 1, 1) Case "C" col_ = 255 Case "B" col_ = 12611584 Case "A" col_ = 5287936 End Select If col_ Then With .Cells(r_ + r1_ - 1, c_ + c1_ - 1).Characters(Start:=st_).Font .Color = col_ .FontStyle = "Regular" .Size = 10 End With End If End If Next r_ Next c_ End With Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = 1 tt_ = Timer - t_ MsgBox tt_ End Sub
[/vba]
[vba]
Код
Sub Vtor() t_ = Timer Application.ScreenUpdating = 0 Dim StartChar As Byte '255 символов With Sheets("Sheet1") r_ = .Cells(.Rows.Count, 12).End(3).Row For n = 12 To 13 For i = 36 To r_ With .Cells(i, n) StartChar = InStr(1, .Value, "(") If StartChar <> 0 Then Select Case Mid(.Value, StartChar + 1, 1) Case "C" col_ = 255 Case "B" col_ = 12611584 Case "A" col_ = 5287936 End Select If col_ Then With .Characters(Start:=StartChar).Font .Color = col_ .FontStyle = "Regular" .Size = 10 End With End If End If End With Next i Next n End With Application.ScreenUpdating = 1 tt_ = Timer - t_ MsgBox tt_ End Sub
[/vba]
*что-то тег макроса сбоит - не хочет много отступов делать_Boroda_
boa, nilem, спасибо за подсказки! Код с Select Case действительно выглядит намного лучше, но вот по скорости работы разницы практически нет (при замере скорости разница в сотые доли секунды).
С чем вообще может быть связано то, что внутри основного файла этот код "тупит" (даже находясь отдельно от основного кода), а на пустом одностраничном файле работает очень быстро?
boa, nilem, спасибо за подсказки! Код с Select Case действительно выглядит намного лучше, но вот по скорости работы разницы практически нет (при замере скорости разница в сотые доли секунды).
С чем вообще может быть связано то, что внутри основного файла этот код "тупит" (даже находясь отдельно от основного кода), а на пустом одностраничном файле работает очень быстро?master-dd
nilem, причин может быть множество... все перечислять даже не хочется, проще посмотреть "пациента" если не хотите сюда выкладывать файл, то удалив конфиденциальные данные пришлите на почту(найдете в профиле) или в личку
nilem, причин может быть множество... все перечислять даже не хочется, проще посмотреть "пациента" если не хотите сюда выкладывать файл, то удалив конфиденциальные данные пришлите на почту(найдете в профиле) или в личкуboa
master-dd, мои коды тоже в большом файле тупят, я правильно понимаю? Если да (скорее всего так и есть), то 1. Какие реальные диапазоны для замены? 2. Значения ячеек действительно состоят из буква-пробел-скобка-буква-пробел или это только для форума пример? 3. EnableEvents и пересчет тут не помогут - мы же кодом ничего, кроме формата, не меняем, следовательно, события не возникают. А вот нет ли в коде какого-нибудь хитрого модуля класса? Хотя это тоже сомнительно 4. Приведенный Вам начальный код действительно именно такой или Вы оттуда что-то ненужное для этого вопроса убрали?
В любом случае нужно посмотреть на весь код. Данные с других листов возможно не так и нужны, но сами листы не удаляйте
master-dd, мои коды тоже в большом файле тупят, я правильно понимаю? Если да (скорее всего так и есть), то 1. Какие реальные диапазоны для замены? 2. Значения ячеек действительно состоят из буква-пробел-скобка-буква-пробел или это только для форума пример? 3. EnableEvents и пересчет тут не помогут - мы же кодом ничего, кроме формата, не меняем, следовательно, события не возникают. А вот нет ли в коде какого-нибудь хитрого модуля класса? Хотя это тоже сомнительно 4. Приведенный Вам начальный код действительно именно такой или Вы оттуда что-то ненужное для этого вопроса убрали?
В любом случае нужно посмотреть на весь код. Данные с других листов возможно не так и нужны, но сами листы не удаляйте_Boroda_
Неправильное решение. Нарушение п.5о Правил форума.
Pelena, меня абсолютно не интересуют какие-либо "личные отнощения" с апонентом (п.5.о.). я лишь предложил master-dd, понимая варианты..., что " если не хотите сюда выкладывать файл", то можете... чисто волонтерская помощь. Фриланса мне из без форума хватает
Неправильное решение. Нарушение п.5о Правил форума.
Pelena, меня абсолютно не интересуют какие-либо "личные отнощения" с апонентом (п.5.о.). я лишь предложил master-dd, понимая варианты..., что " если не хотите сюда выкладывать файл", то можете... чисто волонтерская помощь. Фриланса мне из без форума хватает boa
_Boroda_, спасибо за подсказку, но, к сожалению, что Ваши коды, что коды nilem и boa работают практически с одной скоростью. Значит, очевидно, необходимо с этим смириться...
_Boroda_, спасибо за подсказку, но, к сожалению, что Ваши коды, что коды nilem и boa работают практически с одной скоростью. Значит, очевидно, необходимо с этим смириться... master-dd
_Boroda_, прошу прощения - интернет "отпал" ненадолго и Ваши 2-й ответ я не видел. Отвечаю на вопросы: 1. Диапазоны для замены именно такие, как я указал в коде 2. Всё именно так - я в файл примера сбросил реальные значения. Суть в том, что для определённой категории расчётов применяется АВС-анализ. Именно в диапазон L36:M47 с помощью PasteSpecial вставляются значения, которые рассчитывает формула на другом листе. Для визуализации категория А - зелёная, В - синяя и С - красная. Значения в скобках - это "исторические" значения предыдущих расчётов, поэтому их и нужно "подформатировать". 3. В модуле ничего кроме этого кода нет - я для чистоты эксперимента создал в рабочей книге пустой лист Sheet1, в указанный диапазон вставил значения и в новом модуле написал именно тот код, который привёл выше. И он "тормозит". При этом в абсолютно чистой книге сделав всё то же самое - работает быстро. 4. Как говорил выше - именно такой, ничего не убирал.
Я подозреваю, что всё дело в размере файла 4,3М, множестве модулей и формул (хотя многие из них в виде массивов). Файл приложил (он уменьшен до самого минимума) Проверить работу всех макросов удастся вряд ли, т.к. всю логику объяснять очень долго, нет исходных файлов, которые данная программа анализирует и т.д. НО, именно так он и выглядит (хотя сам файл ещё мной дорабатывается). На странице Sheet1, собственно, суть задачи, а в Module1 я собрал все решения, предложенные в данной теме (остальные модули удалил).
Буду благодарен, если будут ещё каке-либо полезные советы.
_Boroda_, прошу прощения - интернет "отпал" ненадолго и Ваши 2-й ответ я не видел. Отвечаю на вопросы: 1. Диапазоны для замены именно такие, как я указал в коде 2. Всё именно так - я в файл примера сбросил реальные значения. Суть в том, что для определённой категории расчётов применяется АВС-анализ. Именно в диапазон L36:M47 с помощью PasteSpecial вставляются значения, которые рассчитывает формула на другом листе. Для визуализации категория А - зелёная, В - синяя и С - красная. Значения в скобках - это "исторические" значения предыдущих расчётов, поэтому их и нужно "подформатировать". 3. В модуле ничего кроме этого кода нет - я для чистоты эксперимента создал в рабочей книге пустой лист Sheet1, в указанный диапазон вставил значения и в новом модуле написал именно тот код, который привёл выше. И он "тормозит". При этом в абсолютно чистой книге сделав всё то же самое - работает быстро. 4. Как говорил выше - именно такой, ничего не убирал.
Я подозреваю, что всё дело в размере файла 4,3М, множестве модулей и формул (хотя многие из них в виде массивов). Файл приложил (он уменьшен до самого минимума) Проверить работу всех макросов удастся вряд ли, т.к. всю логику объяснять очень долго, нет исходных файлов, которые данная программа анализирует и т.д. НО, именно так он и выглядит (хотя сам файл ещё мной дорабатывается). На странице Sheet1, собственно, суть задачи, а в Module1 я собрал все решения, предложенные в данной теме (остальные модули удалил).
Буду благодарен, если будут ещё каке-либо полезные советы.master-dd
Здравствуйте, master-dd, посмотрел файл. первое, что могу посоветовать, это пересохранить файл в бинарном формате(размер уменьшится в 3 раза), но макрос быстрее выполнятся стал не значительно наблюдения: грузит файл лист "Result". Даже если файл просто открыт, то данный макрос даже в другой книге выполняется медленно. я еще поковыряюсь, но пока не вижу реального решения, кроме как пересоздать данный лист с меньшим количеством внедренных объектов.
Здравствуйте, master-dd, посмотрел файл. первое, что могу посоветовать, это пересохранить файл в бинарном формате(размер уменьшится в 3 раза), но макрос быстрее выполнятся стал не значительно наблюдения: грузит файл лист "Result". Даже если файл просто открыт, то данный макрос даже в другой книге выполняется медленно. я еще поковыряюсь, но пока не вижу реального решения, кроме как пересоздать данный лист с меньшим количеством внедренных объектов.boa
master-dd, грузят таблицы "кол-во поисковых запросов"(Picture 18) и нижняя (Picture 11) они каждый раз перерисовываются пересоздайте их как обыкновенные таблицы и все наладится
master-dd, грузят таблицы "кол-во поисковых запросов"(Picture 18) и нижняя (Picture 11) они каждый раз перерисовываются пересоздайте их как обыкновенные таблицы и все наладитсяboa
boa, если вы по-нормальному, как Лена вам объяснила, не понимаете, то будем иначе. Как хотите переделывайте файл таким образом, чтобы было понятно о чем речь и кладите его сюда. Я это, в общем-то, уже сделал и собрался здесь файл выложить, но теперь это ваша задача.
Здесь с Правилами форума строго и указания модераторов здесь так просто не игнорируются
boa, если вы по-нормальному, как Лена вам объяснила, не понимаете, то будем иначе. Как хотите переделывайте файл таким образом, чтобы было понятно о чем речь и кладите его сюда. Я это, в общем-то, уже сделал и собрался здесь файл выложить, но теперь это ваша задача.
Здесь с Правилами форума строго и указания модераторов здесь так просто не игнорируются_Boroda_
_Boroda_, Прошу прощения, что нарушил правила, но по-другому как можно было файл такого объёма на суд достопочтенной публики представить? Со своей стороны обещаю более не нарушать правила.
_Boroda_, Прошу прощения, что нарушил правила, но по-другому как можно было файл такого объёма на суд достопочтенной публики представить? Со своей стороны обещаю более не нарушать правила.master-dd
Сообщение отредактировал master-dd - Понедельник, 25.06.2018, 17:56