Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

27 Май 2019, 04:36 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Здесь можно поблагодарить участников форума Улыбка
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: « 1 2   Вниз
  Печать  
Автор Тема: Объединение таблиц на нескольких листах в одну на новом листе.  (Прочитано 13199 раз)
0 Пользователей и 1 Гость смотрят эту тему.
useb64
Участник
**
Offline Offline

Сообщений: 7


« Ответ #15: 15 Февраль 2017, 07:31 »

у Вас сохранился этот макрос?
В теме не осталось названия файла, пришлось искать по дате создания... А уже когда нашелся - посмотрел на имя файла. Оборжался... "Элементарно, Ватсон!.."

Благодарю Вас
Вы мне очень помогли )

Может быть Вам несложно будет еще на один вопрос ответить.
Описание ситуации:

sheet() - номер текущего листа
sheet("Лист2") - номер Листа2, в "стандартной" нередактированной книге = 2
... и т.п.


есть ли функция "обратная" функции sheet(), которая выдает имя листа по его номеру, например:

SheetName() = наименование текущего листа
в "стандартной" нередактированной книге:
SheetName(1) = Лист1
SheetName(2) = Лист2
...


SheetName() - искомая функция, существует ли такая, или м.б. нужна комбинация каких-то функций?
Функция эта нужна для того, чтобы из любой строки "сводного" (сборного) листа обратится к определенным
ячейкам листа соответствующего номеру строки на "сводном" листе, например


         столбец А                             столбец B                             столбец С
стр 4   =SheetName(ROW()).$A$17    =SheetName(ROW()).$A$20    =SheetName(ROW()).$A$23
стр 5   =SheetName(ROW()).$A$17    =SheetName(ROW()).$A$20    =SheetName(ROW()).$A$23
...

таким образом у нас получится "сводная" таблица.
повторю вопрос: существует ли функция типа SheetName() или аналог, или можно реализовать
данную задачку другим (простым) путем?


С уважением
« Последнее редактирование: 15 Февраль 2017, 08:07 от useb64 » Записан
economist
Форумчанин
***
Offline Offline

Сообщений: 971


« Ответ #16: 15 Февраль 2017, 09:57 »

=LEFT(CELL("address";Лист2!C8);-1+FIND("!";CELL("address";Лист2!C8)))

вернет Лист2
Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
economist
Форумчанин
***
Offline Offline

Сообщений: 971


« Ответ #17: 15 Февраль 2017, 10:07 »

Или пользовательской функцией на StarBasic, он же VBA, в LibreOffice Calc это прекрасно работает:

Код:
Option VBASupport 1
Option Compatible
'-----------------------------------------------


Function NameSheetByIndex(n as integer) as string
'Возвращает имя листа по его индексу (1,2 итд)

'Раскомментить строку ниже и запустить 1 раз, потом можно строку удалить  
'ThisComponent.BasicLibraries.VBACompatibilityMode=true

NameSheetByIndex=Sheets(n).Name
End function
Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
useb64
Участник
**
Offline Offline

Сообщений: 7


« Ответ #18: 15 Февраль 2017, 10:39 »


для того чтобы получить имя листа Лист2

вернет Лист2

надо в аргументах функции написать имя листа Лист2?

=LEFT(CELL("address";Лист2!C8);-1+FIND("!";CELL("address";Лист2!C8)))

я ведь не знаю имя листа, я знаю только номер...
я видимо что-то не понял...
Извините, я начинающий.
Если не сложно поясните свой ответ )

С уважением
Записан
mikekaganski
Мастер
*****
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 1 383


« Ответ #19: 15 Февраль 2017, 11:24 »

Код:
ThisComponent.Sheets.ElementNames(n)

n считается от нуля
Записан

С уважением,
Михаил Каганский
economist
Форумчанин
***
Offline Offline

Сообщений: 971


« Ответ #20: 15 Февраль 2017, 12:13 »

useb64 - вы спросили есть ли функция "обратная" функции sheet(), которая выдает имя листа по его номеру. Было предложено два варианта - формулой и BASIC-функцией. В формуле нужно просто сослаться щелчком мыши на любую ячейку нужного (т.е. другого) листа. В моём примере это ссылка на Лист2!C8:

=LEFT(CELL("address";Лист2!C8);-1+FIND("!";CELL("address";Лист2!C8)))

Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
economist
Форумчанин
***
Offline Offline

Сообщений: 971


« Ответ #21: 15 Февраль 2017, 12:36 »

Изучите функцию =INDIRECT(), она превращает текстовую строку - в ссылку, и возвращает по ссылке значение. Много в Сети примеров по аналогичной функции =ДВССЫЛ() из Excel.

Имена листов - это более понятные сущности, чем номера листов, и проверять их проще.

Если "сводная" таблица это просто все строки со всех листов на отдельном листе, и строки добавляются/удаляются - то формулы рано или поздно "слетят", и лучше собрать строки SQL-запросом:

1) Именуете диапазоны на листах (можно с запасом)  
2) Создаете в OpenOffice|LibreOffice BASE Базу данных - подключение к Таблица (данный ODS), видите в ней список Таблиц (диапазонов)
3) Пишете и сохраняете "консолидирующий" запрос вида

SELECT * FROM Диапазон1
UNION
SELECT * FROM Диапазон2
UNION
... итд
Тут же можно задать сортировку, выборку, фильтрацию и др. группировку итогов, если надо.  

4) Переходите на "сводный" пустой лист и Жмете на F4 или Ctrl+Shift+F4 (зависит от версии OpenOffice|LibreOffice)
5) Перетаскиваете слева сверху имя вашего Запроса на лист/ Всё, самообновляемые (при открытии файла) данные получены. Можно макросом задать интервал обновления или кнопку, или ловить активацию листа и тогда обновлять. Работает это очень быстро.  
Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
useb64
Участник
**
Offline Offline

Сообщений: 7


« Ответ #22: 15 Февраль 2017, 13:26 »

извините Ваш вариант

Цитата: economist
...нужно просто сослаться щелчком мыши на любую ячейку нужного (т.е. другого) листа...

не подходит по следующей причине:
Цитата: useb64
114 листов... и так каждый день...

Цитата: economist
...Имена листов - это более понятные сущности, чем номера листов...

имена листов неизвестны, а номера листов всегда одни и те же от 1 до 114

Цитата: economist
...лучше собрать строки SQL-запросом...
это выходит за рамки привычного для меня

Записан
economist
Форумчанин
***
Offline Offline

Сообщений: 971


« Ответ #23: 15 Февраль 2017, 14:46 »

useb64 - тогда изучите еще "трехмерные" ссылки, обрабатывающие все листы от X и до Y, ну типа:

=SUM(Лист1!A10:Лист114!A10),

- ими тоже можно быстро сделать "свод".

Если у вас OpenOffice и каждый день - новый лист, то на год не хватит. Максимальное количество листов в книге составляет 256.

Не знаю вашу учетную задачу, но уверен что подход день=лист - неправильный. Правильный - это когда одна форма ввода и одна таблица со всеми данными. А вся отчетность - на базе инструмента Calс "Сводная таблица".
« Последнее редактирование: 15 Февраль 2017, 14:49 от economist » Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
useb64
Участник
**
Offline Offline

Сообщений: 7


« Ответ #24: 16 Февраль 2017, 10:44 »

to economist

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

с уважением
Записан
mikekaganski
Мастер
*****
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 1 383


« Ответ #25: 16 Февраль 2017, 11:33 »

Создайте у себя макрос в My Macros->Standard (или в Мои макросы->Standard):

Код:
Function SheetName(num)
  if (num > 0 AND num <= ThisComponent.Sheets.Count) Then
    SheetName = ThisComponent.Sheets.ElementNames(num-1)
  else
    SheetName = "ERROR!"
  end if
End Function

И пользуйтесь как встроенной функцией Calc. Правда, работать будет только на Вашей машине. Зато нет макроса в файле, нет предупреждений.
Если надо, запишите его не в общую библиотеку макросов, а в документ.
Записан

С уважением,
Михаил Каганский
Страниц: « 1 2   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!