Создание множества копий листа разом

Автор ProstoyPolzovatel, 24 ноября 2018, 18:41

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

ProstoyPolzovatel

Здравствуйте. Возможно ли как-то упрощенно создать заданное количество копий указанного листа в рамках одной таблицы? По 50-60 раз проводить процедуру "Переместить/скопировать лист - копировать - ок" не очень удобно.

mikekaganski

Не знаю способа, чтобы было "скопировать N раз". Но если после каждого копирования выделять все одинаковые листы (щелчок по первой вкладке -> Shift+щелчок по последней, или использовать Ctrl+Click), то можно значительно ускорить процесс.
С уважением,
Михаил Каганский

bigor

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

ProstoyPolzovatel

Цитата: Bigor от 24 ноября 2018, 21:27переходим на первый выделяем нужную область, копируем. Выделяем ярлыки созданных листов, становимся в нужное место вставить
В таком случае скрытые столбцы становятся видимыми, фиксация первой строки отменяется, и т.д.. Я слышал, что нужное мне можно сделать с помощью макроса, но в таких вещах совершенно не разбираюсь

JohnSUN

#4
Можно и макросом.
Но сначала нужно выяснить, что именно будет в этих листах - текст и числа или формулы (в том числе и с сылками на другие листы и даже другие книги)? Упоминание скрытых столбцов наводит на мысль, что речь идет именно о втором варианте

В большинстве случаев нормально сработает такой вариант:
Sub CopyCurrentSheet
Dim sName As String, sNewName As String, sK As String
Dim oSheets As Variant, i As Long, j As Long, k As Long, m As Long
  sK = InputBox("И сколько копий текущего листа тебе нужно получить?", "Введи целое число","2")
  k = Val(sK)
  If k < 1 Then Exit Sub
  sName = ThisComponent.getCurrentController().getActiveSheet().getName()
  oSheets = ThisComponent.getSheets()
  j = 0
  For i = 1 To k
    For m = 1 To 100
      j = j + 1
      sNewName = sName & "_" & j
      If Not oSheets.hasByName(sNewName) Then
        oSheets.copyByName(sName, sNewName, oSheets.getCount())
        Exit For
      EndIf
    Next m
  Next i
End Sub

Но если где-то "поплывут" формулы - нужно будет думать над другими способами
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

ProstoyPolzovatel

Цитата: JohnSUN от 25 ноября 2018, 09:58В большинстве случаев нормально сработает такой вариант:
Спасибо и здесь) Нет, формул там нет, так что такой вариант более чем подходит. Наконец-то мои мучения с ручным копированием листов окончены

bigor

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

JohnSUN

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

bigor

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