Макросы, вызывающие отставание
Я запускаю программу, которая использует 5 макросов и множество формул. Некоторые из макросов, о которых я просил вашей помощи здесь. После того, как программа собрана воедино, наблюдается большое отставание. Я имею в виду, что если мы удалим строку, нам придется ждать 1-2 минуты, чтобы она выполнила этот процесс. Любые идеи о том, что я должен смотреть на? Я знаю, это звучит несколько расплывчато, но я не знаю, где начать искать решение проблемы отставания. Я смотрю на компьютер, сервер или программу?
1 ответ
Из концепций Visual Basic (часть справки)
Вы можете ускорить работу приложений Visual Basic, оптимизировав способ, которым Visual Basic разрешает ссылки на объекты. Скорость, с которой Visual Basic обрабатывает ссылки на объекты, может зависеть от:
Был ли компонент ActiveX реализован как внутрипроцессный или внепроцессный сервер.
Является ли ссылка на объект ранней или поздней связью. В общем случае, если компонент был реализован как часть исполняемого файла (файл.exe), он является сервером вне процесса и выполняется в своем собственном процессе. Если он был реализован в виде библиотеки динамической компоновки, он является внутрипроцессным сервером и работает в том же процессе, что и клиентское приложение.
Приложения, которые используют внутрипроцессные серверы, обычно работают быстрее, чем те, которые используют внепроцессные серверы, потому что приложению не нужно пересекать границы процесса, чтобы использовать свойства, методы и события объекта. Дополнительные сведения о серверах в процессе и вне процесса см. В разделе "Серверы в процессе и вне процесса".
Ссылки на объекты имеют раннюю привязку, если они используют переменные объекта, объявленные как переменные определенного класса. Ссылки на объекты имеют позднюю привязку, если они используют переменные объекта, объявленные как переменные общего класса Object. Ссылки на объекты, которые используют переменные с ранней привязкой, обычно работают быстрее, чем ссылки с переменными с поздней привязкой.
Смотрите эту ссылку от лица Microsoft. Это специфично для Excel, а не для VBA. Автокальк и другие параметры калькуляции / обновление экрана и т. Д.
http://blogs.office.com/2009/03/12/excel-vba-performance-coding-best-practices/
Минимизировать точки
Поэтому, если вы заинтересованы в производительности, минимизируйте точки (каждая точка - это поиск), особенно в циклах.
Есть два способа. Одним из них является установка объектов на самый низкий объект, если вы собираетесь получить доступ более одного раза.
например (медленнее)
set xlapp = CreateObject("Excel.Application")
msgbox xlapp.worksheets(0).name
(быстрее, потому что вы опускаете точку каждый раз, когда используете объект)
set xlapp = CreateObject("Excel.Application")
set wsheet = xlapp.worksheets(0)
msgbox wsheet.name
Второй способ с заявлением. Вы можете иметь только один с активным одновременно.
Это пропускает 100 поисков.
with wsheet
For x = 1 to 100
msgbox .name
Next
end with
Конкатенация строк
И не соединяйте строки по одному символу за раз. Смотрите это от программиста VBScript. Для создания строки из 100 символов требуется 50000 байт, а также большое количество выделения и освобождения.
http://blogs.msdn.com/b/ericlippert/archive/2003/10/20/53248.aspx