Производительность Excel: повышение производительности вычислений

Область применения: Excel | Excel 2013 | Excel 2016 | VBA

"Большая сетка" (Big Grid), состоящая из 1 миллиона строк и 16 000 столбцов, в Office Excel 2016 вместе с увеличением многих других предельных значений значительно увеличивает максимальный размер создаваемых листов по сравнению с более ранними версиями Excel. Отдельный лист в Excel может содержать в 1 000 раз больше ячеек, чем было в более ранних версиях.

В более ранних версиях Excel многие пользователи создавали книги, вычисления в которых выполнялись медленно, при этом обычно вычисления больших листов выполнялись более медленно, чем вычисления меньших листов. С появлением в Excel 2007 "большой сетки" вопросы производительности стали действительно важными. Медленное выполнение вычислений и таких задач обработки данных, как сортировка и фильтрация, привело к тому, что пользователям стало сложнее концентрироваться на выполняемой задаче, а снижение концентрации приводит к увеличению количества ошибок.

В последних версиях Excel появилось несколько новых функций, которые помогают обрабатывать такой увеличенный объем данных. Например, можно одновременно использовать несколько процессоров для выполнения вычислений и общих операций с набором данных, таких как обновление, сортировка, открытие книг. Многопоточное вычисление может значительно сократить время вычислений листа. Однако наиболее важным фактором, влияющим на скорость вычисления в Excel, по-прежнему остается способ создания и построения листа.

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

Важность скорости вычисления

Низкая скорость выполнения вычислений влияет на производительность и увеличивает количество ошибок, сделанных пользователем. Производительность пользователя и способность сосредоточиться на задаче ухудшаются по мере увеличения времени отклика.

В Excel предлагается два основных режима вычисления, позволяющих пользователю управлять режимом выполнения вычислений:

  • Автоматическое вычисление — формулы пересчитываются автоматически при внесении изменения.

  • Вычисление вручную — формулы пересчитываются только в случае запроса пользователя (например, при нажатии пользователем клавиши F9).

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

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

По мере увеличения времени вычисления (обычно от 1 до 10 секунд) пользователи должны переключаться на вычисление вручную при вводе данных. Количество ошибок пользователей и степень раздражения начинают увеличиваться, особенно при выполнении повторяющихся задач, и пользователям становится сложно удерживать концентрацию внимания.

Когда время вычисления превышает 10 секунд, пользователи проявляют нетерпение и обычно в процессе ожидания переключаются на другие задачи. Это может вызывать проблемы, когда вычисление является одной из последовательно выполняющихся задач, и пользователь может спутать последовательность действий.

Общие сведения о методах вычисления в Excel

Чтобы повысить производительность вычислений в Excel, необходимо понимать доступные методы вычисления и способы управления ими.

Полное вычисление и зависимости пересчета

Модуль пересчета в Excel стремится свести к минимуму время вычисления, постоянно отслеживая предыдущие значения и зависимости для каждой формулы (ячейки, на которые ссылается формула) и любые изменения, сделанные с момента последнего вычисления. Во время следующего пересчета в Excel пересчитывается только следующее:

  • Ячейки, формулы, значения или имена, которые изменились или помечены, как требующие пересчета.

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

  • Переменные функции и видимые условные форматы.

В Excel продолжается вычисление ячеек, которые зависят от ранее вычисленных ячеек, даже если значение ранее вычисленной ячейки не меняется при вычислении.

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

В режиме вычисления вручную вы можете запустить этот модуль пересчета, нажав клавишу F9. Можно вызвать полное вычисление всех формул, нажав клавиши CTRL+ALT+F9, или полностью перестроить зависимости и выполнить полное вычисление, нажав клавиши SHIFT+CTRL+ALT+F9.

Процесс вычисления

В Excel формулы, которые ссылаются на другие ячейки, могут помещаться до или после ячеек, на которые они ссылаются (опережающие ссылки или обратные ссылки). Это возможно, потому что в Excel вычисление ячеек не выполняется в фиксированном порядке или по строке или столбцу. Вместо этого в Excel динамически определяется последовательность вычислений на основе списка всех формул для вычисления (цепочка вычислений) и сведений о зависимостях, относящихся к каждой формуле.

В Excel можно выделить четкие этапы вычисления:

  1. Построение исходной цепочки вычислений и определение места начала вычисления. Этот этап выполняется, когда книга загружается в память.

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

  3. Расчет всех формул. В ходе процесса вычисления в Excel переупорядочивается и переструктурируется цепочка вычислений в целях оптимизации будущих пересчетов.

  4. Обновление видимых частей окон Excel.

Третий этап выполняется при каждом вычислении или пересчете. В Excel каждая формула в цепочке вычислений должна рассчитываться по очереди. Однако, если формула зависит от одной или нескольких формул, которые еще не были рассчитаны, эта формула перемещается вниз по цепочке, чтобы ее расчет выполнялся еще раз позднее. Это означает, что одна формула может рассчитываться несколько раз за один пересчет.

Когда книга рассчитывается во второй раз, вычисления часто выполняются значительно быстрее, чем в первый раз. Это происходит по нескольким причинам:

  • Excel обычно пересчитывает только те ячейки, которые изменились, и зависимые от них элементы.

  • Excel сохраняет и повторно использует самые новые последовательности вычислений, что помогает сохранить большинство времени, затрачиваемого на определение последовательности вычислений.

  • Когда используются многоядерные компьютеры, в Excel предпринимаются попытки оптимизировать способ распределения вычислений по ядрам на основе результатов предыдущего вычисления.

  • В сеансе Excel в кэше Windows и Excel недавно использовались данные и программы для более быстрого доступа.

Выполнение вычислений в рабочих книгах, листах и диапазонах

Управлять тем, что именно рассчитывается, можно с помощью различных методов вычислений в Excel.

Пересчет всех открытых книг

Во время каждого пересчета и полного вычисления рассчитываются все книги, которые открыты в этот момент, решаются любые зависимости внутри книг и листов и между ними, а также сбрасываются все ранее не рассчитанные (грязные) ячейки.

Расчет выбранных листов

Можно пересчитать только выбранные листы, используя сочетания клавиш SHIFT+F9. Это не решает зависимости между листами и не сбрасывает грязные ячейки как рассчитанные.

Расчет диапазона ячеек

В Excel для расчета диапазона ячеек можно использовать методы Visual Basic для приложений (VBA) Range.CalculateRowMajorOrder и Range.Calculate:

  • Range.CalculateRowMajorOrder выполняет расчет диапазона слева направо и сверху вниз, при этом все зависимости игнорируются.

  • Range.Calculate выполняет расчет диапазона, решая все зависимости в диапазоне.

Так как метод CalculateRowMajorOrder не решает никакие зависимости в рассчитываемом диапазоне, он обычно значительно быстрее, чем Range.Calculate. Однако его следует применять осторожно, так как результаты могут отличаться от результатов, полученных с помощью Range.Calculate.

Range.Calculate является одним из самых полезных инструментов в Excel для оптимизации производительности, поскольку позволяет сравнить скорость вычисления различных формул.

Дополнительные сведения см. в статье Производительность Excel: улучшения производительности и ограничений.

Переменные функции

Переменная функция всегда пересчитывается при каждом пересчете, даже если кажется, что никаких изменений предыдущих значений не произошло. Использование большого количества переменных функций замедляет каждый пересчет, но не оказывает никакого влияния на полное вычисление. Пользовательскую функцию можно сделать переменной, включив метод Application.Volatile в код функции.

Некоторые встроенные функции в Excel являются явно переменными: СЛЧИС(), ТДАТА(), СЕГОДНЯ(). Для других функций менее очевидно, что они переменные: СМЕЩ(), ЯЧЕЙКА(), ДВВСЫЛ(), ИНФОРМ().

Некоторые функции, которые ранее были указаны в документации как переменные, фактически не являются переменными: ИНДЕКС(), ЧСТРОК(), ЧИСЛСТОЛБ(), ОБЛАСТИ().

Действия для пересчета

Действия для пересчета вызывают повторное выполнение вычисления. К ним относятся следующие действия:

  • Щелчок разделителя строки или столбца при работе в автоматическом режиме.
  • Вставка или удаление строк, столбцов или ячеек в листе.
  • Добавление, изменение или удаление определенных имен.
  • Переименование листов или изменение положения листов при работе в автоматическом режиме.
  • Фильтрация, скрытие или отмена скрытия строк.
  • Открытие книги при работе в автоматическом режиме. Если в прошлый раз расчет книги выполнялся в другой версии Excel, открытие книги обычно приводит к полному вычислению.
  • Сохранение книги в ручном режиме, если выбран параметр Пересчитывать книгу перед сохранением.

Условия расчета формулы и имени

Вычисление формулы или части формулы выполняется немедленно даже в режиме вычисления вручную, когда пользователь выполняет одно из следующих действий:

  • Ввод или изменение формулы.
  • Ввод или изменение формулы с помощью мастера функций.
  • Ввод формулы в качестве аргумента в мастере функций.
  • Выберите формулу в строке формул и нажмите клавишу F9 (нажмите клавишу ESC, чтобы отменить действие и вернуться к формуле) или щелкните Вычислить формулу.

Формула помечается как невычисляемая, когда она ссылается на ячейку или формулу (зависит от ячейки или формулы), для которой выполняется одно из следующих условий:

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

Формула, помеченная как невычисляемая, рассчитывается при расчете или перерасчете листа, книги или экземпляра Excel, содержащего эту формулу.

Условия, вызывающие расчет определенного имени, отличаются от условий расчета для формулы в ячейке:

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

Таблицы данных

Таблицы данных Excel (вкладка Данные > группа Работа с данными > Анализ "что если" > Таблица данных) не следует путать с функцией таблицы (вкладка Главная > группа Стили > Форматировать как таблицу или вкладка Вставка > группа Таблицы > Таблица). В таблицах данных Excel выполняются множественные пересчеты книги, каждый управляется различными значениями в таблице. В Excel книга сначала рассчитывается обычным образом. Затем для каждой пары значений строки и столбца подставляются значения, выполняется однопотоковый пересчет и результаты сохраняются в таблице данных.

При пересчете таблицы данных всегда используется только один процессор.

Таблицы данных удобны для вычисления нескольких вариантов, а также просмотра и сравнения результатов этих вариантов. Используйте параметр вычисления Автоматически, кроме таблиц данных, чтобы остановить в Excel автоматический запуск нескольких вычислений при каждом расчете, но выполнить расчет всех зависимых формул, кроме таблиц.

Параметры управления вычислением

В Excel содержится ряд параметров, позволяющих управлять способом вычисления. Наиболее часто используемые параметры можно изменить в Excel, используя группу Вычисление на вкладке Формулы на ленте.

Рис. 1. Группа "Вычисление" на вкладке "Формулы"

Параметры вычислений на вкладке "Формулы"

Чтобы просмотреть дополнительные параметры вычислений Excel, на вкладке Файл выберите пункт Параметры. В диалоговом окне Параметры Excel выберите вкладку Формулы.

Рис. 2. Параметры вычислений на вкладке "Формулы" в параметрах Excel

Параметры вычислений в представлении Backstage

Многие параметры вычисления (автоматически, автоматически, кроме таблиц данных, вручную, Пересчитывать книгу перед сохранением) и настройки итераций (Включить итеративные вычисления, Предельное число итераций, Относительная погрешность) работают на уровне приложения, а не на уровне книги (они одинаковы для всех открытых книг).

Чтобы просмотреть дополнительные параметры вычисления, на вкладке Файл выберите пункт Параметры. В диалоговом окне Параметры Excel выберите пункт Дополнительно. В разделе Формулы задайте параметры вычисления.

Рис. 3. Дополнительные параметры вычислений

Дополнительные параметры вычислений в представлении Backstage

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

Автоматический расчет

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

Пересчет можно заметить, когда книга открывается в более поздней версии Excel, чем та версия, которая использовалась последний раз при расчете этой книги (например, Excel 2016 в сравнении с Excel 2013). Поскольку модули вычисления в Excel другие, в Excel выполняется полное вычисление при открытии книги, которая была сохранена с использованием более ранней версии Excel.

Расчет вручную

Режим расчета вручную означает, что в Excel выполняется пересчет всех открытых книг только при нажатии пользователем клавиш F9 или CTRL+ALT+F9 или при сохранении книги. При работе с книгами, пересчет которых занимает больше доли секунды, необходимо задать вычисление в режиме расчета вручную, чтобы избежать задержки во время внесения изменений.

Когда требуется пересчет книги в ручном режиме, в Excel отображается команда Вычислить в строке состояния. Команда Вычислить отображается в строке состояния и в том случае, если книга содержит циклические ссылки и установлен флажок итераций.

Настройки итераций

Если в книге намеренно заданы циклические ссылки, настройки итераций позволяют управлять максимальным числом пересчетов книги (итераций) и критериями сходимости (максимальное изменение: когда остановиться). Снимите флажок итераций, чтобы в случае случайных циклических ссылок в Excel отобразилось предупреждение и не предпринималась попытка разрешения таких ссылок.

Свойство книги ForceFullCalculation

Если для этого свойства книги задано значение True, интеллектуальный пересчет Excel отключается и при каждом пересчете пересчитываются все формулы в открытых книгах. Для некоторых сложных книг время, затрачиваемое на построение и обслуживание деревьев зависимостей, необходимых для интеллектуального пересчета, превышает время, сэкономленное при интеллектуальном пересчете.

Если открытие книги длится слишком долго или внесение небольших изменений в течение длительного времени даже при ручном режиме вычислений занимает много времени, возможно, стоит попробовать свойство ForceFullCalculation.

В строке состояния будет отображаться команда Вычислить, если для свойства книги ForceFullCalculation задано значение True.

Вы можете управлять этим параметром с помощью VBE (ALT+F11), выбрав ЭтаКнига в обозревателе проектов (CTRL+R) и отображая окно свойств (F4).

Рис. 4. Настройка свойства Workbook.ForceFullCalculation

Настройка свойства ForceFullCalculation

Увеличение скорости вычислений в книгах

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

Скорость процессора и использование нескольких ядер

Для большинство версий Excel более быстрый процессор, конечно, позволяет быстрее выполнять вычисления Excel. Модули многопотоковых вычислений, внедренные в Excel 2007, позволяют Excel прекрасно использовать многопроцессорные системы, что приводит к значительному повышению производительности при работе с большинством книг.

Для большинства больших книг повышение производительности вычислений с разных процессоров осуществляется почти линейно с числом физических процессоров. Однако технология Hyper-Threading физических процессоров обеспечивает лишь небольшое увеличение производительности.

Дополнительные сведения см. в статье Производительность Excel: улучшения производительности и ограничений.

ОЗУ

Подкачка в файл подкачки виртуальной памяти выполняется медленно. Необходимо иметь достаточно свободного места на ОЗУ для операционной системы, Excel и книг. Если в процессе вычисления операции с жестким диском происходят не только время от времени и выполняются определенные пользователем функции, запускающие действия с диском, потребуется больший объем ОЗУ.

Как уже упоминалось, последние версии Excel могут эффективно использовать большие объемы памяти, а в 32-разрядной версии Excel 2007 и Excel 2010 можно обрабатывать одну книгу или комбинацию книг, используя до 2 ГБ памяти.

32-разрядные версии Excel 2013 и Excel 2016, использующие функцию обработки больших адресов (LAA), могут использовать до 3 или 4 ГБ памяти в зависимости от установленной версии Windows. 64-разрядная версия Excel может обрабатывать книги еще большего размера. Дополнительные сведения см. в разделе, посвященном большим наборам данных, LAA и 64-разрядной версии Excel статьи Производительность Excel: улучшения производительности и ограничений.

Общие рекомендации по величине памяти: для эффективных вычислений нужно обеспечить достаточно места на ОЗУ для работы с самым большим набором книг, которые должны быть открыты одновременно, плюс 1 или 2 ГБ для Excel и операционной системы, плюс дополнительное место на ОЗУ для других выполняющихся приложений.

Измерение времени вычисления

Чтобы расчет книг выполнялся быстрее, необходимо иметь возможность точно измерить время вычисления. Требуется таймер, более быстрый и более точный, чем функция Time в VBA. Функция MICROTIMER(), приведенная в следующем примере кода, использует API Windows для обращения к системному таймеру с высоким разрешением. Он может измерять временные интервалы, длительность которых составляет небольшое количество микросекунд. Обратите внимание, что поскольку Windows является многозадачной операционной системой и повторный расчет чего-либо может выполняться быстрее, чем в первый раз, полученные значения времени обычно не совпадают. Для получения более точного значения замеряйте время выполнения задач вычислений несколько раз и выбирайте среднее значение из полученных результатов.

Дополнительные сведения о том, как редактор Visual Basic может значительно повлиять на производительность пользовательских функций на языке VBA, см. в разделе "Более быстрые пользовательские функции VBA" статьи Производительность Excel: советы по оптимизации производительности.

#If VBA7 Then
    Private Declare PtrSafe Function getFrequency Lib "kernel32" Alias _
        "QueryPerformanceFrequency" (cyFrequency As Currency) As Long
    Private Declare PtrSafe Function getTickCount Lib "kernel32" Alias _
         "QueryPerformanceCounter" (cyTickCount As Currency) As Long
#Else
    Private Declare Function getFrequency Lib "kernel32" Alias _                                            "QueryPerformanceFrequency" (cyFrequency As Currency) As Long
    Private Declare Function getTickCount Lib "kernel32" Alias _
        "QueryPerformanceCounter" (cyTickCount As Currency) As Long
#End If
Function MicroTimer() As Double
'

' Returns seconds.
    Dim cyTicks1 As Currency
    Static cyFrequency As Currency
    '
    MicroTimer = 0

' Get frequency.
    If cyFrequency = 0 Then getFrequency cyFrequency

' Get ticks.
    getTickCount cyTicks1                            

' Seconds
    If cyFrequency Then MicroTimer = cyTicks1 / cyFrequency 
End Function

Для измерения времени вычисления необходимо вызвать соответствующий метод вычисления. Эти подпрограммы позволяют найти время расчета для диапазона, время пересчета для листа или всех открытых книг, время полного вычисления для всех открытых книг.

Скопируйте все эти подпрограммы и функции в стандартный модуль VBA. Чтобы открыть редактор VBA, нажмите клавиши ALT+F11. В меню Вставка выберите пункт Модуль и скопируйте код в модуль.

Sub RangeTimer()
    DoCalcTimer 1
End Sub
Sub SheetTimer()
    DoCalcTimer 2
End Sub
Sub RecalcTimer()
    DoCalcTimer 3
End Sub
Sub FullcalcTimer()
    DoCalcTimer 4
End Sub

Sub DoCalcTimer(jMethod As Long)
    Dim dTime As Double
    Dim dOvhd As Double
    Dim oRng As Range
    Dim oCell As Range
    Dim oArrRange As Range
    Dim sCalcType As String
    Dim lCalcSave As Long
    Dim bIterSave As Boolean
    '
    On Error GoTo Errhandl

' Initialize
    dTime = MicroTimer              

    ' Save calculation settings.
    lCalcSave = Application.Calculation
    bIterSave = Application.Iteration
    If Application.Calculation <> xlCalculationManual Then
        Application.Calculation = xlCalculationManual
    End If
    Select Case jMethod
    Case 1

        ' Switch off iteration.

        If Application.Iteration <> False Then
            Application.Iteration = False
        End if
        
        ' Max is used range.

        If Selection.Count > 1000 Then
            Set oRng = Intersect(Selection, Selection.Parent.UsedRange)
        Else
            Set oRng = Selection
        End If

        ' Include array cells outside selection.

        For Each oCell In oRng
            If oCell.HasArray Then
                If oArrRange Is Nothing Then 
                    Set oArrRange = oCell.CurrentArray
                End If
                If Intersect(oCell, oArrRange) Is Nothing Then
                    Set oArrRange = oCell.CurrentArray
                    Set oRng = Union(oRng, oArrRange)
                End If
            End If
        Next oCell

        sCalcType = "Calculate " & CStr(oRng.Count) & _
            " Cell(s) in Selected Range: "
    Case 2
        sCalcType = "Recalculate Sheet " & ActiveSheet.Name & ": "
    Case 3
        sCalcType = "Recalculate open workbooks: "
    Case 4
        sCalcType = "Full Calculate open workbooks: "
    End Select

' Get start time.
    dTime = MicroTimer
    Select Case jMethod
    Case 1
        If Val(Application.Version) >= 12 Then
            oRng.CalculateRowMajorOrder
        Else
            oRng.Calculate
        End If
    Case 2
        ActiveSheet.Calculate
    Case 3
        Application.Calculate
    Case 4
        Application.CalculateFull
    End Select

' Calculate duration.
    dTime = MicroTimer - dTime
    On Error GoTo 0

    dTime = Round(dTime, 5)
    MsgBox sCalcType & " " & CStr(dTime) & " Seconds", _
        vbOKOnly + vbInformation, "CalcTimer"

Finish:

    ' Restore calculation settings.
    If Application.Calculation <> lCalcSave Then
         Application.Calculation = lCalcSave
    End If
    If Application.Iteration <> bIterSave Then
         Application.Iteration = bIterSave
    End If
    Exit Sub
Errhandl:
    On Error GoTo 0
    MsgBox "Unable to Calculate " & sCalcType, _
        vbOKOnly + vbCritical, "CalcTimer"
    GoTo Finish
End Sub

Чтобы выполнить подпрограммы в Excel, нажмите клавиши ALT+F8. Выберите нужную подпрограмму и щелкните Выполнить.

Рис. 5. Окно макросов Excel с таймерами вычислений

Окно макроса Excel

Поиск и определение приоритетов помех при вычислениях

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

Детализированный подход для поиска помех

Детализированный подход начинается с определения времени вычисления книги, вычисления каждого листа и блоков формул на листах, на которых вычисления осуществляются медленно. Выполняйте каждый шаг по порядку и записывайте время вычислений.

Поиск помех с помощью детализированного подхода

  1. Убедитесь, что открыта только одна книга и никакие другие задачи не выполняются.

  2. Задайте режим вычисления вручную.

  3. Сделайте резервную копию книги.

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

  5. Проверьте используемый диапазон, нажав клавиши CTRL+END в каждом листе по очереди.

    Это действие покажет ячейку, которая была использована последней. Если ячейка находится за пределами ожидаемого диапазона, подумайте об удалении лишних столбцов и строк и сохранении книги. Дополнительные сведения см. в разделе "Минимизация используемого диапазона" статьи Производительность Excel: советы по оптимизации производительности.

  6. Запустите макрос FullCalcTimer.

    Обычно больше всего времени занимает вычисление всех формул в книге.

  7. Запустите макрос RecalcTimer.

    Пересчет сразу же после полного вычисления обычно занимает меньше всего времени.

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

    Это измерит степень, в которой переменные формулы и расчет цепочки вычислений являются помехами.

  9. Активируйте каждый лист и по очереди запустите макрос SheetTimer.

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

  10. Запустите макрос RangeTimer на выбранных блоках формул.

  11. Для каждого проблемного листа поделите столбцы или строки на небольшое количество блоков.

  12. Выбирайте каждый блок по очереди и запускайте макрос RangeTimer по этому блоку.

  13. При необходимости выполните дальнейшую детализацию, подразделив каждый блок на еще меньшие блоки.

  14. Определите приоритеты для помех.

Ускорение выполнения вычислений и уменьшение количества помех

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

Большинство листов формируются посредством копирования формул, содержащих смесь абсолютных и относительных ссылок. Поэтому на них обычно имеется большое количество формул, содержащих повторяющиеся или дублируемые вычисления и ссылки.

Избегайте использования сложных мегаформул и формул массивов. В общем случае лучше иметь больше строк и столбцов и меньше сложных вычислений. Это позволяет и более эффективно проводить пересчет формул, и выполнять многопоточные вычисления в Excel, что представляет благоприятные возможности для оптимизации вычислений. Этот подход также проще для понимания и отладки. Ниже приводятся несколько правил, помогающих ускорить проведение вычислений в книге.

Первое правило: удаляйте дублируемые, повторяющиеся и не являющиеся обязательными вычисления

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

Обычно этот подход включает два или несколько из указанных ниже шагов:

  • Уменьшите количество ссылок в каждой ячейке.

  • Переместите повторяющиеся вычисления в одну или несколько вспомогательных ячеек, а затем задайте ссылки на вспомогательные ячейки из основных формул.

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

Второе правило: используйте по возможности наиболее эффективные функции

Когда найдена помеха, затрагивающая функцию или формулы массивов, определите, есть ли более эффективный способ для достижения такого же результата. Пример:

  • Поиск, проводимый по отсортированным данным, может оказаться в десятки и сотни раз более эффективным, чем поиск по не отсортированным данным.

  • Пользовательские функции VBA обычно работают более медленно, чем встроенные функции в Excel (хотя грамотно написанные функции VBA могут работать достаточно быстро).

  • Минимизируйте количество используемых ячеек в таких функциях, как СУММ и СУММЕСЛИ. Время вычисления пропорционально числу используемых ячеек (неиспользуемые ячейки игнорируются).

  • Рассмотрите возможность замены медленных формул массивов пользовательскими функциями.

Третье правило: часто используйте интеллектуальный пересчет и многопоточные вычисления

Чем больше вы будете пользоваться функцией интеллектуального пересчета в Excel, тем меньше процедур обработки нужно будет выполнять каждый раз, когда в Excel выполняется пересчет, поэтому:

  • Старайтесь по возможности не использовать такие функции, как ДВССЫЛ и СМЕЩ, если они не обеспечивают значительно большую эффективность, чем альтернативные функции. (При умелом использовании функция СМЕЩ часто обеспечивает быстрый результат).

  • Минимизируйте размер диапазонов, используемых в формулах массивов и функциях.

  • Разбейте формулы массивов и мегаформулы на отдельные вспомогательные столбцы и строки.

  • Избегайте использования однопотоковых функций:

    • PHONETIC
    • ЯЧЕЙКА, когда используется аргумент "format" или "address"
    • СМЕЩ
    • ПОЛУЧИТЬ.ДАННЫЕ.СВОДНОЙ.ТАБЛИЦЫ
    • КУБЭЛЕМЕНТ
    • КУБЗНАЧЕНИЕ
    • КУБСВОЙСТВОЭЛЕМЕНТА
    • КУБМНОЖ
    • КУБПОРЭЛЕМЕНТ
    • КУБЭЛЕМЕНТКИП
    • КУБЧИСЛОЭЛМНОЖ
    • АДРЕС, когда указывается пятый параметр (sheet_name)
    • Любая функция базы данных (БДСУММ, ДСРЗНАЧ, и т. д.), которая ссылается на сводную таблицу
    • ТИП.ОШИБКИ
    • ГИПЕРССЫЛКА
    • Пользовательские функции для VBA и надстройки COM
  • Избегайте итеративного использования таблиц данных и циклических ссылок: оба этих способа всегда применяют однопотоковые вычисления.

Четвертое правило: рассчитывайте время и проверяйте результат для каждого изменения

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

  1. Рассчитайте время для формулы, которую нужно изменить, используя макрос RangeTimer.

  2. Внесите изменение.

  3. Рассчитайте время для измененной формулы, используя макрос RangeTimer.

  4. Убедитесь, что измененная формула дает правильный ответ.

Примеры использования правил

В следующих разделах приводятся примеры использования указанных правил для ускорения вычислений.

Суммы с начала периода

Например, требуется рассчитать суммы с начала периода для столбца, содержащего 2 000 чисел. Предположим, что в столбце A содержатся числа, а в столбцах B и C должны располагаться суммарные значения с начала периода.

Соответствующую формулу можно записать с помощью эффективной функции SUM (СУММ).

  B1=SUM($A$1:$A1)
  B2=SUM($A$1:$A2)

Рис. 6. Пример формул СУММ за период

Пример формулы СУММ за период

Скопируйте формулу вниз до ячейки B2000.

Каково теперь общее число ссылок на ячейки, складываемые функцией СУММ? Ячейка B1 ссылается на одну ячейку, а ячейка B2000 — на 2 000 ячеек. Среднее значение составляет 1 000 ссылок на ячейку, что в сумме дает общее число ссылок, равное 2 миллионам. Выбор 2 000 формул и использование макроса RangeTimer показывает, что 2 000 формул в столбце B вычисляются за 80 миллисекунд. Большая часть этих вычислений дублируется много раз: СУММ добавляет A1 к A2 в каждой формуле из диапазона B2:B2000.

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

  C1=A1
  C2=C1+A1

Скопируйте эту формулу вниз до ячейки C2000.

Каково теперь общее число ссылок на складываемые ячейки? В каждой формуле, за исключением первой формулы, используется две ссылки на ячейки. Таким образом, общее их число равняется 1999*2+1=3999. Это в 500 раз меньше ссылок на ячейки.

RangeTimer показывает, что 2 000 формул в столбце C вычисляются за 3,7 миллисекунды (напомним, что формулы в столбце B вычисляются за 80 миллисекунд). Этому изменению соответствует коэффициент улучшения, равный лишь 80/3,7=22, а не 500, поскольку имеются лишь небольшие дополнительные временные затраты в расчете на одну формулу.

Обработка ошибок

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

  • Его можно записать с помощью одной формулы, вычисления по которой осуществляются медленно:

    B1=IF(ISERROR(time expensive formula),0,time expensive formula)

  • Его можно записать с помощью двух формул, вычисления по которым осуществляются быстро:

    A1=time expensive formula

    B1=IF(ISERROR(A1),0,A1)

  • Можно также использовать функцию IFERROR (ЕСЛИОШИБКА), которая разрабатывалась как простая и быстрая, включающая одну формулу:

    B1=IFERROR(time expensive formula,0)

Динамический подсчет уникальных элементов

Рис. 7. Пример списка данных для подсчета уникальных элементов

Пример подсчета уникальных данных

Если имеется список, включающий 11 000 строк данных в столбце A, элементы которого часто изменяются, и требуется воспользоваться формулой, которая бы динамически рассчитывала число уникальных элементов (без учета пустых строк), имеется несколько возможных решений, указанных ниже.

  • Формулы массива (используйте клавиши CTRL+SHIFT+ВВОД); RangeTimer показывает, что это занимает 13,8 секунды.

    {=SUM(IF(LEN(A2:A11000)>0,1/COUNTIF(A2:A11000,A2:A11000)))}
    
  • С помощью функции SUMPRODUCT (СУММПРОИЗВ) вычисления обычно проводятся быстрее, чем при использовании аналогичной формулы массива. Вычисление этой формулы занимает 10,0 секунд, что дает коэффициент улучшения, равный 13,8/10,0=1,38, что несколько лучше, но все же в небольшой степени.

    =SUMPRODUCT((A2:A11000<>"")/COUNTIF(A2:A11000,A2:A11000&amp;""))
    
  • Пользовательские функции В следующем примере кода приводится пользовательская функция VBA, в которой используется тот факт, что индекс в коллекции должен быть уникальным. Объяснение нескольких используемых способов см. в разделе "Эффективное использование функций" статьи Производительность Excel: советы по оптимизации производительности. Вычисление по этой формуле, =COUNTU(A2:A11000), занимает всего 0,061 секунды. При этом коэффициент улучшения составляет 13,8/0,061=226.

    Public Function COUNTU(theRange As Range) As Variant
        Dim colUniques As New Collection
        Dim vArr As Variant
        Dim vCell As Variant
        Dim vLcell As Variant
        Dim oRng As Range
    
        Set oRng = Intersect(theRange, theRange.Parent.UsedRange)
        vArr = oRng
        On Error Resume Next
        For Each vCell In vArr
        If vCell <> vLcell Then
            If Len(CStr(vCell)) > 0 Then
                 colUniques.Add vCell, CStr(vCell)
            End If
        End If
        vLcell = vCell
        Next vCell
    
        COUNTU = colUniques.Count
    End Function
    
  • Добавление столбца формул. Если посмотреть на предыдущий пример данных, то можно увидеть, что он был отсортирован (Excel затрачивает 0,5 секунды на сортировку 11 000 строк). Этим можно воспользоваться посредством добавления столбца формул, с помощью которых проверяется, являются ли данные в этой строке такими же, что и в предыдущей строке. Если они отличаются, формула возвращает 1. В противном случае она возвращает значение 0.

    Добавьте эту формулу в ячейку B2.

      =IF(AND(A2<>"",A2<>A1),1,0)
    

    Скопируйте формулу, а затем добавьте формулу сложения значений в столбце B.

      =SUM(B2:B11000)
    

    Полный цикл расчета всех этих формул занимает 0,027 секунды. При этом коэффициент улучшения составляет 13,8/0,027=511.

Заключение

Excel позволяет эффективно управлять очень большими по своему объему листами и обеспечивает значительное увеличение скорости проведения расчетов по сравнению с более ранними версиями. При создании больших листов их можно достаточно легко сформировать таким образом, при котором расчеты выполняются сравнительно медленно. Использование листов, на которых вычисления осуществляются медленно, увеличивает количество ошибок, поскольку пользователям трудно концентрировать внимание в течение всего цикла расчетов.

Использование эффективного набора методик обеспечивает 10-кратное и даже 100-кратное ускорение проведения расчетов на большинстве листов, на которых в обычных условиях вычисления осуществляются медленно. Вы также можете применять эти методики при разработке и создании листов, благодаря чему на них повышается скорость проведения вычислений.

См. также

Поддержка и обратная связь

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