Calc: Вставка пустых строк

Автор KSumatokhin, 17 августа 2022, 11:16

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

KSumatokhin

Здравствуйте!

Нужна программа позволяющая вставить пустые строки через заданное количество в выбранном диапазоне.
К примеру таблица высотой в 3 строки:
строка 1
строка 2
строка 3

после выполнения программы с параметром вставки "1" станет выглядеть так:
строка 1
пустая строка
строка 2
пустая строка
строка 3

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

economist

Не нужна программа. Пронумеруйте в свободном столбце ваши строки нечетными 1,3,5... (протягиванием).
Затем ниже данных пронумеруйте пустые строки четными 2,4,6...(протягиванием).
Отсортируйте диапазон по возрастанию 1,2,3,4,5... 
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

KSumatokhin

У меня довольно сложная таблица, содержит 118 столбцов, очень много зависимостей, формул и т.д.
После сортировка половина значений слетает. Хочется иметь программу, что бы научиться вообще пользоваться программными средствами.
Попробовать добавить кнопку. Получить опыт в этом деле.
Я думаю, что это не должна быть сложная программа. К тому же можно попробовать ее разобрать, я бы хотел начать хоть немного копать в этом направлении.

KSumatokhin

#3
Насколько я понимаю можно сделать так:
1. В выделенном диапазоне считать номер строки листа первой и последней ячейки.
2. Написать подфункцию для вставки строки, как это делается стандартным методом. Аргумент номер строки. При вставке существующая строка уползает вниз.
3. Запустить цикл типа REPEAT N раз (количество строк) в котором функция 2 вставляет строки в нужное место.
Только вот как это сделать в Calc Basic я не понимаю, прошу помочь.

sokol92

#4
Цитата: KSumatokhin от 17 августа 2022, 12:47Только вот как это сделать в Base я не понимаю
Легким движением руки Calc превращается в Base.  :)

Владимир.

sokol92

Если все же Calc.

Option Explicit
' Вставляет пустые строки между строками прямоугольного диапазона ячеек oRange
Sub InsertRows(ByVal oRange)
  Dim adr, oSheet, i As Long, i2 As Long
  adr=oRange.RangeAddress                ' адрес диапазона ячеек
  oSheet=oRange.Spreadsheet              ' лист документа Calc
  With adr
    i2=.StartRow
    For i=adr.EndRow To i2 Step -1       ' цикл по строкам снизу вверх
      .StartRow=i
      .EndRow=i
      oSheet.insertCells adr, 3          ' com.sun.star.sheet.CellInsertMode.ROWS
    Next i
  End With 
End Sub

' Вставляет пустые строки между строками выделенного прямоугольного диапазона ячеек.
Sub Test
  InsertRows ThisComponent.CurrentSelection
End Sub
Владимир.

KSumatokhin

sokol92, Большое спасибо!!!
А можно добавить запрос на количество вставляемых пустых строк?
Что то типа "Количество вставляемых строк: " По умолчанию 1.
Нажимаем "OK" вставляются строки.

sokol92

Владимир.

KSumatokhin

sokol92, скорее всего я ничего не понимаю, но если просто ввести еще одну переменную


Option Explicit
Sub test
  Dim i,b As Long, j As Long, k As Long
  k=10
  For i=1 To k
    b=1
    j=i
  Next i
 
  Msgbox j
End Sub   


То выведет 10. Похоже нельзя теперь внутри For трогать k

sokol92

В VBA границы цикла вычисляются однократно в начале цикла и далее не пересчитываются.
В LO Basic это не так и про это нужно знать программистам, которые "перепрофилируются" c VBA на LO Basic. "C подачи" Михаила действие бага ограничено  модулями, в которых есть опция Option VBASupport 1.

Option Explicit

' Вставляет пустые строки перед строками прямоугольного диапазона ячеек oRange.
' nrows - число вставляемых пустых строк перед строкой диапазона oRange.
Sub InsertRows2(ByVal oRange, Optional ByVal nrows As Long)
  Dim adr, oSheet, i As Long, i2 As Long
  If IsMissing(nrows) Then nrows=1
 
  adr=oRange.RangeAddress                ' адрес диапазона ячеек
  oSheet=oRange.Spreadsheet              ' лист документа Calc
 
  With adr
    i2=.StartRow
    For i=adr.EndRow To i2 Step -1       ' цикл по строкам снизу вверх
      .StartRow=i
      .EndRow=i+nrows-1
      oSheet.insertCells adr, 3          ' com.sun.star.sheet.CellInsertMode.ROWS
    Next i
  End With 
End Sub

' Вставляет пустые строки перед строками выделенного прямоугольного диапазона ячеек.
Sub test2
  Dim nRows
  nRows=InputBox("Количество вставляемых пустых строк",,1)
  If Not IsNumeric(nRows) Then Exit Sub
  InsertRows2 ThisComponent.CurrentSelection, Clng(nRows)
End Sub
Владимир.

KSumatokhin

Спасибо огромное!!!! Все работает. Один вопрос)))
А можно добавить начальную марку для отмены. Что бы при нажатии ctrl+z возвращался сразу к начальному виду?

sokol92

Цитата: KSumatokhin от 17 августа 2022, 18:07Что бы при нажатии ctrl+z возвращался сразу к начальному виду?
Теоретически да. Но это уже для курсовой работы...   :)
Владимир.

sokol92

#12
Option Explicit

' Вставляет пустые строки перед строками прямоугольного диапазона ячеек oRange.
' nrows - число вставляемых пустых строк перед строкой диапазона oRange.
Sub InsertRows3(ByVal oRange, Optional ByVal nrows As Long)
 Dim adr, oSheet, oUndo, i As Long, i2 As Long
 If IsMissing(nrows) Then nrows=1
 
 adr=oRange.RangeAddress                ' адрес диапазона ячеек
 oSheet=oRange.Spreadsheet              ' лист документа Calc
 
 With adr
   i2=.StartRow
   oUndo=ThisComponent.UndoManager
   oUndo.enterUndoContext "Вставка пустых строк"
   For i=adr.EndRow To i2 Step -1       ' цикл по строкам снизу вверх
     .StartRow=i
     .EndRow=i+nrows-1
     oSheet.insertCells adr, 3          ' com.sun.star.sheet.CellInsertMode.ROWS
   Next i
   oUndo.leaveUndoContext
 End With  
End Sub

' Вставляет пустые строки перед строками выделенного прямоугольного диапазона ячеек.
Sub test
 Dim nRows
 nRows=InputBox("Количество вставляемых пустых строк",,1)
 If Not IsNumeric(nRows) Then Exit Sub
 InsertRows3 ThisComponent.CurrentSelection, Clng(nRows)
End Sub


Кстати, в Excel возможности "манипуляции" стеком отмены несоизмеримо более скромны.
Владимир.

economist

Цитата: KSumatokhin от 17 августа 2022, 12:38У меня довольно сложная таблица, содержит 118 столбцов, очень много зависимостей, формул и т.д.

Вставка строк (любая: подмешиванием пустых сортировкой или макросом) - приводит к расширению диапазонов формул независимо от того абсолютные или относительные их границы. Т.е. нужно их проверить.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

KSumatokhin

sokol92, Спасибо огромное! Отличная программа!
Хотел спросить у Вас, что бы Вы посоветовали почитать, какой ресурс посетить?
Ваш код я понял, но сам бы не написал...
И еще хотел спросить может есть где в интернете описанная объектная модель Calc,
с указанием методов и свойств, что бы понимать что можно с чем делать, что можно вытащить и т.д.?