0 / 0 / 0
Регистрация: 11.12.2024
Сообщений: 9
Excel

Ускорение замены связей (ссылок) в Excel

09.02.2026, 09:57. Показов 877. Ответов 4

Студворк — интернет-сервис помощи студентам
Опытным путем установлено что для ускорения ChangeLink (замена связей в книге) нужно после строки

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
...
Set wbTemplate = Workbooks.Open( _
Filename:=templatePath, _
ReadOnly:=True, _ ' ← только для чтения
IgnoreReadOnlyRecommended:=True) ' без лишнего диалога
' вставить
Application.Calculation = xlCalculationAutomatic 'если вставить эту строку уменьшение времени с 365 секунд 
'до 180 секунд - в 2 раза
'  Заменяем ТОЛЬКО эту ссылку на новый файл
    On Error GoTo ChangeLinkError
    wbTemplate.ChangeLink Name:=oldLink, NewName:=newLink, Type:=xlExcelLinks
    On Error GoTo 0
... 
'  Сохраняем копию
 wbTemplate.SaveAs fileName:=newFileName, FileFormat:=xlOpenXMLWorkbook 
....
Рассуждения:
"Интуитивно результат понятен: когда Application.Calculation = xlCalculationManual, Excel старается не пересчитывать книги, но при ChangeLink он всё равно лезет в пересчёт/обновление связей «нестандартным» путём и иногда попадает в режим, когда каждый шаг тормозит на попытках не пересчитаться полностью.


Когда сразу после Workbooks.Open включаешь xlCalculationAutomatic, Excel делает нормальный пересчёт один раз и затем ChangeLink уже меньше «борется» с отложенными зависимостями. Это легко даёт выигрыш во времени на книгах с большим количеством формул и связей.

Прямого «канонического» примера с именно такой комбинацией, открыли шаблон, а потом включили автоматический пересчёт до ChangeLink), в документации обычно нет; в типичных рекомендациях как раз пишут про отключение пересчёта на время макроса. Но в моей задаче замены связей в файле шаблоне, а затем сохранение новом файле поведение двусмысленное:
  • если макрос только правит значения — выгодно держать xlCalculationManual;
  • если макрос правит структуру ссылок через ChangeLink (мой вариант), Excel всё равно инициирует свои пересчёты, и ручной режим может только мешать.

Вопросы:
  1. Можно ли проверить, что экспериментальный вывод логичен: для конкретной связки «тяжёлый шаблон + масса внешних ссылок + ChangeLink» включённый автоматический пересчёт перед сменой ссылок действительно может быть быстрее?
  2. Как Вы думаете, это как раз тот случай, когда «общие советы» (всегда Manual) проигрывают конкретному решению задачи?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.02.2026, 09:57
Ответы с готовыми решениями:

Восстановление связей в Excel
Добрый день! У меня вопрос к уважаемым участникам. Есть приложение, написанное на Excel 2003. В...

Разрыв ТОЛЬКО ошибочных связей в excel
Добрый день форумчане! Нужна ваша помощь. Есть много файлов. В них есть ссылки-привязки связей на...

Защита листа макросом и обновление связей между документами Excel
Доброго времени суток. У меня такой вопрос. Есть макрос для защиты листа Private Sub...

4
 Аватар для KoGG
5645 / 1627 / 418
Регистрация: 23.12.2010
Сообщений: 2,444
Записей в блоге: 1
18.02.2026, 15:09
Проверить попытаться можно.
Главное при этом - верно интерпретировать результат.
При изменении связей основное время съедает сам запрос значений на новые данные, а не пересчеты.
Значительно ускориться позволяет одновременное открытие всех новые книг, на которые перевязываются связи, изменеие связей, затем закрытие всех книг источников.
Вот нашел в архиве пример:
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
Sub Конс_Перевязка_свод()
    Dim wb_Cel  As Workbook, wb_Tek  As Workbook
    Dim i As Integer, j As Integer, God As Integer, Kvart As Integer
    Dim Uslovie As Integer
    Dim Prefix As String, Fayl(11) As String, Fayl_Old(11) As String, F_Suf As String, F_Suf_Old As String
    Dim PERIOD As String, Period_Old  As String
    Uslovie = 0
    For Each wb_Tek In Workbooks
        Select Case LCase(Left(wb_Tek.name, 9))
            Case "конс_свод", "_конс_сво"
                Set wb_Cel = wb_Tek
                Uslovie = 1
            Case Else
        End Select
    Next
    If Uslovie < 1 Then
          MsgBox "Не обнаружен открытый файл: Конс_свод_..."
          Exit Sub
    End If
    Prefix = ActiveWorkbook.path & "\"
    F_Suf = Right(wb_Cel.name, 18)
    PERIOD = Mid(F_Suf, 6, 6)
    God = Val(Left(PERIOD, 4))
    Kvart = Val(Mid(PERIOD, 6, 1))
    Select Case Kvart
        Case 1
            If Month(Now) >= 9 Then
               F_Suf_Old = Left(F_Suf, 5) & Format(God - 1) & "_4кв.xlsx" ' типовая строка
            Else
               F_Suf_Old = Left(F_Suf, 5) & Format(God - 1) & "_3кв.xlsx" ' нетипичная замена
            End If
        Case Else
            F_Suf_Old = Left(F_Suf, 10) & Format(Kvart - 1) & "кв.xlsx"
    End Select
    Fayl(1) = "Конс_БЗ"
    Fayl(2) = "Конс_БЗОТ"
    Fayl(3) = "Конс_БП"
    Fayl(4) = "Конс_БПДР"
    Fayl(5) = "Конс_БПР"
    Fayl(6) = "Конс_себест"
    Fayl(7) = "Конс_БЗЗ"
    Fayl(8) = "Конс_БДР"
    Fayl(9) = "Конс_БДР_бух"
    Fayl(10) = "Конс_БЗ1"
    Fayl(11) = "Конс_БЗ2"
    For j = 1 To 11
        Fayl_Old(j) = Fayl(j) & F_Suf_Old
        Fayl(j) = Fayl(j) & F_Suf
    Next j
    Application.Calculation = xlCalculationManual
    For j = 1 To 11
        Workbooks.Open filename:=Prefix & Fayl(j), UpdateLinks:=0
        wb_Cel.ChangeLink name:=Prefix & Fayl_Old(j), NewName:=Prefix & Fayl(j), Type:=xlExcelLinks
        ActiveWorkbook.Close savechanges:=False
    Next j
    Application.Calculation = xlCalculationAutomatic
    wb_Cel.Save
End Sub
0
0 / 0 / 0
Регистрация: 11.12.2024
Сообщений: 9
26.02.2026, 12:40  [ТС]
Провел тест замены ссылок макросом с автоматическим расчетом и без.
Цель теста: Заменить в книге temp ссылки книги book1 на book2 на 2 листах.
Данные: массив формул размером 8000 строк на 250 столбцов на 2 листах. Все файлы книг открыты. Размер файлов 41 Мбайт.

Методы:


1.Открыть все книги архива test.zip
2.Сделать активной книгу temp.xlsm и запустить в ней макрос test()
Результаты тестирования представлены в таблице
Таблица теста по файлам из ссылки
xlCalculationAutomatic, м:с. xlCalculationManual, М:сотклонение, раз
3:185:181,6
3:195:121,6
3:135:091,6
7:149:461,4
3:135:021,4
3:215:181,4

Выводы


Проведенное тестирование показывает, что при установке xlCalculationManual весь процесс замены ссылок замедляется в среднем в 1,5 раза
Тестирование проводилось в системе
Кликните здесь для просмотра всего текста

Процессор Intel(R) Core(TM) i9-9900 CPU 3.10 GHz
Оперативная память 32,0 ГБ
Тип системы 64-разрядная операционная система, процессор x64
Программа Excel 2021, 64 бит

Файлы c макросом для тестирования (113 Мбайт) по ссылке:
Ссылка на архив Яндекс Диск


Жду ваших отзывов о результатах теста

0
 Аватар для KoGG
5645 / 1627 / 418
Регистрация: 23.12.2010
Сообщений: 2,444
Записей в блоге: 1
26.02.2026, 17:16
Предполагаю что это артефакты плохих тестовых данных. Не надо было использовать формулы массива и сложные индексы.
В реальных задачах с большими массивами - обычно числа -константы.
Кроме того время надо замерять до пересохранения файла.

Добавлено через 56 минут
На твердых данных с 1 листом везде xlCalculationAutomatic тоже быстрее:
xlCalculationAutomatic 00:00:36
xlCalculationManual 00:01:22
1
0 / 0 / 0
Регистрация: 11.12.2024
Сообщений: 9
27.02.2026, 08:26  [ТС]
В практической задаче у меня сложные индексы.
На твердых данных xlCalculationAutomatic быстрее в 2,4 раза

Добавлено через 40 минут
На тех же данных, замер времени до сохранения
xlCalculationAutomatic 00:03:15
xlCalculationManual 00:05:28
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.02.2026, 08:26
Помогаю со студенческими работами здесь

Шифр многоалфавитной замены (Вижнера) и шифр алфавитной замены
Напишите пожалуйста 2 программы в VB шифр многоалфавитной замены (Вижнера) и шифр алфавитной...

Есть 10 тыс. ссылок, которые надо сверить с 40 тыс. ссылок и удалить совпадающие
Давно читал турниры из Базы вопросов http://db.chgk.info, копировал в ворд некоторые вопросы для...

Проверить существование файлов в выделенной области ссылок (Excel) и записать несуществующие в WORD
Есть Excel в котором около 50 000 гиперссылок на файлы PDF. Задача: Написать макрос, который...

Ошибка при создании ссылок в Excel
Есть Excel в котором 100 000 строчек. VBA модуль копирует строчку из одной ячейки в соседнюю и и...

WORD6+EXCEL (замена связи)
файл WORD имеют поля (подсвечиваются серым ) связи с Excel . Вопрос: Как поменять все связи в...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru