И снова обновление внешних связей макросом

Автор Konstanta, 22 октября 2019, 11:36

0 Пользователи и 1 гость просматривают эту тему.

Konstanta

Приветствую всех!
Да, уже не раз поднималась тема обновления внешних связей, но судя по постам в последний раз в 16 году.
Вдруг, что изменилось?

В "великом и ужасном" Excell  при наличии нескольких связей достаточно обновить всё.
Однако в LO столкнулся с проблемой:
Обновление всех связей происходит только при открытии файла.
Потом можно обновить только через "Правка=>Связи=>Выбрать в окне конкретную связь, обновить.

Исходная обстановка следующая:
1. Есть файл, в котором на нескольких листах прописаны связи к внешним файлам.
2. Внешние файлы периодически обновляются (заменяются новыми, которые выгружены из программы в формате xls) и в них конечно не прописаны именованные диапазоны.
При этом с ручным обновлением всё работает нормально.
3. Периодически возникает необходимость находясь в открытом файле обновить все данные (поскольку могли измениться исходные).
Вопрос знатокам: как эту процедуру повесить на один макрос, чтобы он обновил в открытом итоговом файле все связи?
Файл приложить не могу. Пути очень специфические (работаем в локальной сети).

mikekaganski

Цитата: Konstanta от 22 октября 2019, 11:36Потом можно обновить только через "Правка=>Связи=>Выбрать в окне конкретную связь, обновить.
В этом окне можно выделить несколько связей (Shift/Ctrl) или все (Ctrl+A).
С уважением,
Михаил Каганский

economist

Справедливости ради скажу что в "великом и ужасном" Excel 2007, 2010, 2013 - формулы вида СУММПРОИЗВ, СУММЕСЛИМН, ДВССЫЛ, ссылающиеся на другие XLSX-файлы  - так же требуют их открытия для обновления связей. Без него они показывают #ЗНАЧ (т.е. даже не предвычисленные значения).
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Konstanta

Цитата: economist от 22 октября 2019, 11:57ч
Очень странно!
У меня всё стабильно обновляет в закрытых файлах.
Даже более того: специально в нужную папку создаю новые файлы с новыми данными и всё работает

economist

Прямые (простые) ссылки - да, Excel обновляет. С вышеназванными формулами - нет.
Я очень активно использую ссылки. У меня из некоторых XLS есть связи-ссылки на 40+ других книг, очень утомляет все их открывать. Кроме как автоматизировать макросом - ничего лучше не придумал. Каскадное обновление ссылок в книгах - это сложная программистская задача, и понять их, программистов из MSO и LO - тоже можно.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Konstanta

Да, Вы правы.
Тем более что я уже после публикации своего ответа понял что Вы писали не о Либре офисе а об Excel ...
В LO связи с закрытыми файлами нормально работает у меня.
Не припомню, чтобы я подобные вещи в Excel делал.
Но данная тема пока ещё актуальна.
Выбирать в окне несколько ссылок для обновления конечно можно и при отсутствии возможности макроса придётся так и делать.

rami

Макрос для обновления всех ссылок на внешние данные:
Sub Main Dim link
For Each link In ThisComponent.AreaLinks
link.refresh()
Next
End Sub

Konstanta


Konstanta

Код не работает.
То есть не происходит вообще ничего

rami

Выложите здесь документ со связями, данные можете удалить.

Konstanta

Связи уходят по пути на сетевой диск и там лежит 6 файлов.
как с этим быть?

rami

Где лежат файлы не имеет значения, если всё правильно, связи должны обновиться (если нет изменений в источнике, будет казаться, что "ничего не происходит"), если что-то неправильно, должно ругаться.

Konstanta

#12
Файл выложил
Я изменял содержимое исходных файлов
После выполнения макроса данные в общем файле не поменялись
При этом вручную они обновились, значит сама связь работает.
Возможно я криво вставил код?

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

rami

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


Можно обновить эти ссылки через диспетчер:
Sub main
Dim doc, disp
doc = ThisComponent.CurrentController.Frame
disp = createUnoService("com.sun.star.frame.DispatchHelper")
disp.executeDispatch(doc, ".uno:UpdateTableLinks", "", 0, Array())
End Sub

Konstanta

ок попробую
Спасибо!
а формулы в готовом файле я оторву от ссылок и в значения превращу.
возможно побыстрее будет