Лист со ссылками на другие листы

Автор mstx, 6 февраля 2018, 20:47

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

mstx

Добрый день!

Появилась необходимость сделать лист с содержанием как в книге с ссылками на другие листы. Вижу это так: в первом листе в каждой строчке название листа, кликаешь по нему - переходишь в этот лист.

Можно ли сделать это стандартными инструментами? Или может быть есть готовые макросы?

Гуглил - ничего не нашёл. Может искал неправильно. Буду благодарен за помощь.

bigor

Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

mstx

Цитата: Bigor от  6 февраля 2018, 20:57
так?

Да, именно. Надо чтобы содержание генерировалось автоматически чтобы упростить навигацию по большому количеству листов. Вы, как я понял, просто вручную добавили ссылки?

JohnSUN

Добро пожаловать на форум!
Кроме уже предложенного Ctrl+K (Вставка-Гиперссылка) есть ещё и функция =HYPERLINK(<куда перейти>;<текст в ячейке>)
Расскажи подробнее - для чего эти прыжки по листам? Вполне возможно, что вместо подробного оглавления книги тебе нужно будет только два листа и выпадающий список (это так, для примера)
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

mstx

Цитата: JohnSUN от  6 февраля 2018, 21:07
Добро пожаловать на форум!
Кроме уже предложенного Ctrl+K (Вставка-Гиперссылка) есть ещё и функция =HYPERLINK(<куда перейти>;<текст в ячейке>)
Расскажи подробнее - для чего эти прыжки по листам? Вполне возможно, что вместо подробного оглавления книги тебе нужно будет только два листа и выпадающий список (это так, для примера)

Благодарю за тёплый приём! :)

С выпадающим списком я бы тоже попробовал, только не знаю, как сделать. Пока хочу содержание отдельным листом. В таблице работаю с семантическим ядром. На каждом листе группа из 10-50 фраз с частотой. То есть два столбца: строки и числа.

bigor

#5
sub ins_gypers

oSelection = ThisComponent.getCurrentSelection()
oSpreadsheet = oSelection.getSpreadsheet()


   For i =4 To 16
    oSpreadsheet.getCellByPosition(j, i).setformula("=HYPERLINK(""#Лист" & i & """;""Лист" & i & """)")
  Next i


End Sub

вставляет гиперссылки функцию =HYPERLINK  на текущем листе на листы с 4 -го по 16
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

mstx

Цитата: Bigor от  6 февраля 2018, 21:32
вставляет гиперссылки функцию =HYPERLINK  на текущем листе на листы с 4 -го по 16

При запуске проставляются ссылки, но при клике на ссылку вылезает сообщение "Недопустимый диапазон".
А можно как-то получить количество листов и название листа, зная его номер?

bigor

#7
а какой офис? у меня на либре 5.2 работает нормально.
sub ins_gypers

oSelection = ThisComponent.getCurrentSelection()
oSpreadsheet = oSelection.getSpreadsheet()


msgbox  "Листов: " & ThisComponent.sheets().count & "Лист: " & oSpreadsheet.Name
  For i =4 To 16
  oSpreadsheet.getCellByPosition(j, i).setformula("=HYPERLINK(""#Лист" & i & """;""Лист" & i & """)")
  Next i
End Sub

Цитироватьпри клике на ссылку вылезает сообщение "Недопустимый диапазон".
ps а у тебя лист есть на который ссылка указывает?
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

mstx

Благодарю всех откликнувшихся и особенно Bigor. Вот, что у меня получилось с вашей помощью:


sub Contents
oSelection = ThisComponent.getCurrentSelection()
oSpreadsheet = oSelection.getSpreadsheet()

For i = 1 To ThisComponent.sheets().count
oSheet = ThisComponent.Sheets.getByIndex(i-1)

oSpreadsheet.getCellByPosition(0, i).setformula("=HYPERLINK(""#" & oSheet.Name & """;""" &  oSheet.Name & """)")

Next i
End Sub


Макрос создаёт список всех листов со ссылками в текущем листе.

bigor

а зачем тебе на лист1 ссылка на лист1 :)
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

mstx

Цитата: Bigor от  6 февраля 2018, 22:21
а зачем тебе на лист1 ссылка на лист1 :)

Это уже не так важно)

mstx

Этот вариант скрипта делает содержание не в текущем листе, а в листе с названием "Содержание":


sub Contents
oSelection = ThisComponent.getCurrentSelection()
oSpreadsheet = ThisComponent.Sheets.getByName("Содержание")

For i = 1 To ThisComponent.sheets().count
oSheet = ThisComponent.Sheets.getByIndex(i-1)

oSpreadsheet.getCellByPosition(0, i).setformula("=HYPERLINK(""#" & oSheet.Name & """;""" &  oSheet.Name & """)")
Next i
End Sub

bigor

#12
For i = 1 To ThisComponent.sheets().count-1
      oSheet = ThisComponent.Sheets.getByIndex(i-1)
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

JohnSUN

Ребята, не нужно перебирать все листы - у ThisComponent.getSheets() есть метод .getElementNames(), который возвращает массив имен всех листов. Индексы в массиве соответствуют номерам листов (с нуля, разумеется)
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

bigor

так?
sub Contents
oSelection = ThisComponent.getCurrentSelection()
oSpreadsheet = ThisComponent.Sheets.getByName("Содержание")
array1()=ThisComponent.sheets().getElementNames()
For i = LBound(array1(),1) to UBound(array1(),1)
oSpreadsheet.getCellByPosition(0, i).setformula("=HYPERLINK(""#" & array1(i) & """;""" &  array1(i) & """)")
Next i
End Sub
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут