Макрос и Номера листов

Автор ink-service, 12 февраля 2019, 16:59

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

ink-service

Доброго всем времени..
Подскажите как  мне лучше написать макросом подобное..
Есть в Лист1, Лист2, Лист3, Лист4 ...... и т.д.
Причем  кол-во листов может быть разное.
Простым макросом я сделал так что нужные данные собираются на Листе1 из Лист2, Лист3, Лист4,
И этим макросом  нужно собрать данные на Листе2.... И вот тут проблема в том, что в макросе четко указаны в формуле Лист1 , Лист2, Лист 3 ...и т.д. , а нужно так чтобы не зависеть от номера листов и их кол-во в книге.... ))...
вот пример кусок макроса:

rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "StringName"
args2(0).Value = "=ЕСЛИОШИБКА(ВПР(C11;Лист2.C$9:G$280;5;0);"""
dispatcher.executeDispatch(document, ".uno:EnterString", "", 0, args2())

rem ----------------------------------------------------------------------
dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "ToPoint"
args3(0).Value = "$L$11"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args3())

rem ----------------------------------------------------------------------
dim args4(0) as new com.sun.star.beans.PropertyValue
args4(0).Name = "StringName"
args4(0).Value = "=ЕСЛИОШИБКА(ВПР(C11;Лист3.C$9:G$280;5;0);"""
dispatcher.executeDispatch(document, ".uno:EnterString", "", 0, args4())

rem ----------------------------------------------------------------------
dim args5(0) as new com.sun.star.beans.PropertyValue
args5(0).Name = "ToPoint"
args5(0).Value = "$N$11"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args5())

rem ----------------------------------------------------------------------
dim args6(0) as new com.sun.star.beans.PropertyValue
args6(0).Name = "StringName"
args6(0).Value = "=ЕСЛИОШИБКА(ВПР(C11;Лист4.C$9:G$280;5;0);"""
dispatcher.executeDispatch(document, ".uno:EnterString", "", 0, args6())

и нужно чтобы тут не Жестко ЛИСТ2  ,а так что если текущий лист, на котором стоишь, уже ЛИСТ2, то значить в формуле будет ЛИСТ1, лист 3, лист4 и т.п.)))

Rafik

#1
Не совсем понятна задача. Насколько я понял:
1. имеется энное количество листов в книге
2. необходимо снабдить формулами активный лист, где в формулах будут фигурировать все остальные листы.
Можно попытаться сгенерить формулы так:

rem Получаем количество листов в текущем документе
listov = ThisComponent.getSheets().count
rem Получаем имя активного листа
imya = ThisComponent.CurrentController.getActiveSheet.Name
rem далее обходим в цикле листы и генерим формулу с именем каждого листа
for ii = 0 to listov - 1
   list = ThisComponent.Sheets(ii)
   rem будем брать только те листы, чьё имя не совпадает с активным
   if list.Name <> imya Then
       
         rem Соберём формулу в переменную
         formula1 =  "=ЕСЛИОШИБКА(ВПР(C11;" + list.Name + ".C$9:G$280;5;0);"")"

        rem сюда кусок макроса, отвечающего за заполнение ячейки и т.д.
        rem вместо строки: args2(0).Value = "=ЕСЛИОШИБКА(ВПР(C11;Лист2.C$9:G$280;5;0);"")"
        rem подставить такую: args2(0).Value = formula1

   end if
Next



ink-service

#2
Спасибо за ответ...  
Да вы правильно поняли задачу..   Попробую это все прописать , отпишусь по результату!!

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

bigor

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

JohnSUN

Неужели не понятно? Нужно консолидировать данные из нескольких счетов - каждый счет на отдельном листе. Подсчитывается суммарная выручка... если не ошибаюсь, конечно - первая колонка, скорее всего, номер по порядку, затем артикул, наименование, цена, количество, видимо, наценка или пересчет по курсу, и, наконец, в колонке G сумма по строке - вот её-то и нужно вынуть из каждого листа для каждого наименования и вставить в отдельную ячейку начиная с колонки K. В конце строки, скорее всего, будет =СУММА()

В общем, сначала максимально усложнить создание сводной таблицы, а затем создать её с помощью формул, которые вписывать макросом в текущий лист...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

ink-service

Прикладываю файлик.
В нем как пример три листа. Но может быть и больше, получаются они однотипные.
Встаем на текущий Лист1 и делаем выполнить макрос (он также в документе).
в итоге получаю с Листа2 и Листа3 данные на листе 1.
Теперь хочу встать на Лист2 нажать кнопку выполнить макрос и получить данные с Листа1 и Листа3. также в колонках..
и точно также  если встать на Листе3, то нажать опять тотже макрос и получить данные с Листа1 и Листа2....
ну и в  том же духе если есть Лист4,5,6 .т.п.

Тот что макрос там вписан, я набросал его методом записи.. т.к. в этом пока я плохо понимаю.

bigor

Цитата: ink-service от 13 февраля 2019, 20:27Теперь хочу встать на Лист2 нажать кнопку выполнить макрос и получить данные с Листа1 и Листа3.
переименовываем лист2 в лист1, лист1 в лист2 и не надо ничего дописывать :)
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

ink-service

)) на данный момент так и делаю))  ручками, но если листов 10, то каждый переименовывать??... уже немного геморойно)..
Хочется  встать на лист нажать кнопку - и все макрос все сделал..
а еще лучше сразу на всех листах книги)

JohnSUN

Цитата: ink-service от 13 февраля 2019, 21:18
нажать кнопку - и все макрос все сделал..
"Всё сделал" - формулы вписал? Или "всё сделал" - выдал список всех упомянутых штрихкодов со всеми известными ценами и с пометкой "это дешевле в ФАЙН, а самое дорогое в ДОН2"?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

ink-service

вообще мне бы хотелось  просто в моем макросе , в формулах что там написаны менялись Названия Листа.
Для всех листов формулы одни, но с листов разных собираются данные по ним.
например:
текущий лист1,  значит в формуле будет Лист2,  Лист3, Лист4.
текущий лист2,  значит в формулах будет Лист1, Лист3, Лист4
Текущий лист3,  значит в формулах будет Лист1, Лист2, Лист4


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

ink-service

Цитата: ink-service от 13 февраля 2019, 21:45"Всё сделал" - формулы вписал?
наверное мне ближе это.. тк. чтобы я мог потом если что-то нужно -поменять сам, в формуле... 

bigor

#11
смотри что получилось

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

ink-service

Цитата: Bigor от 14 февраля 2019, 00:08смотри что получилось
Вы волшебник)..   то что надо...  спасибо огромное)..
А можно еще немного понаглеть и спросить как тутже еще можно ли дописать в макросе условное форматирование..
Я делаю ручками так в каждом листе:
Выделяю колонку В - Условное форматирование - Значение ячейки=Повторяющиеся - Стиль применяю например Accent3 (или просто выделить желтым фоном например)...
Т.е. тем самым еще нужно увидеть на каждом листе если ли повторяющиеся товары...

bigor

Цитата: ink-service от 14 февраля 2019, 01:00дописать в макросе условное форматирование..
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

ink-service

Спасибо))
Но в листе УФ получается  работает сразу, при открытии листа, как будто всегда включено))).
Скопировал код просто в "Мои макросы" чтобы применять при нажатии на кнопку.. НО при выполнении выдает ошибку "Ошибка времени выполнения Basic. Аргумент является обязательным."

мне бы хотелось чтобы это условное форматирование и то что сделано  первым  было в одном макросе), чтобы нажать кнопку одну,  и все разом по листам сделалось).))) - если можно))..