Очистка незащищенных ячеек

Автор AlexWorkStream, 8 ноября 2017, 15:56

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

AlexWorkStream

Добрый день!
Появилась необходимость сделать очистку всех незащищенных ячеек на листе, без необходимости выделения диапазона.
Может кто уже встречал данный макрос?
Спасибо!

mikekaganski

Да, я понимаю, что вопрос задан в теме о BASIC, и ещё без выделения, но просто для информации: с выделением в UI это сделано в 6.0: https://bugs.documentfoundation.org/show_bug.cgi?id=95883
С уважением,
Михаил Каганский

rami

Цитата: AlexWorkStream от  8 ноября 2017, 13:56Появилась необходимость сделать очистку всех незащищенных ячеек на листе, без необходимости выделения диапазона.
Может кто уже встречал данный макрос?
Вот:
Sub Main
Dim oRanges, n
oRanges=ThisComponent.Sheets(0).getCellFormatRanges()
For Each n In oRanges
If Not n.CellProtection.IsLocked Then n.clearContents(7)  'сотрёт числа даты и строки во всех незащищённых ячейках
Next
End Sub

AlexWorkStream


Prototip

Добрый день, подскажите как можно использовать для выделенных ячеек
Цитата: rami от  8 ноября 2017, 16:43Цитата: AlexWorkStream от  8 Ноябрь 2017, 13:56
Появилась необходимость сделать очистку всех незащищенных ячеек на листе, без необходимости выделения диапазона.
Может кто уже встречал данный макрос?
Вот:
Код:

Sub Main
Dim oRanges, n
oRanges=ThisComponent.Sheets(0).getCellFormatRanges()
For Each n In oRanges
If Not n.CellProtection.IsLocked Then n.clearContents(7)  'сотрёт числа даты и строки во всех незащищённых ячейках
Next
End Sub

sokol92

#5
Можно так:

Sub ClearSelection
  Dim oSel, oRange

  oSel=ThisComponent.CurrentSelection
  If HasUnoInterfaces( oSel, "com.sun.star.sheet.XSheetCellRanges") Then ' выделение содержит несколько прямоугольных областей
    For Each oRange In oSel
      ClearRange_ByRami(oRange)
    Next oRange 
  ElseIf HasUnoInterfaces( oSel, "com.sun.star.sheet.XSheetCellRange") Then ' один прямоугольный диапазон
    ClearRange_ByRami(oSel)   
  Else
    Msgbox "Выделите диапазон(ы) ячеек"
  End If 
End Sub

Sub ClearRange_ByRami(ByVal oRange)
  Dim oRanges, n
  oRanges=oRange.getCellFormatRanges()
  For Each n In oRanges
    If Not n.CellProtection.IsLocked Then n.clearContents(7)  'сотрёт числа даты и строки во всех незащищённых ячейках
  Next
End Sub
Владимир.

Prototip

Спасибо, sokol92  :beer:
Всё работает, всё красиво, но время выполнения полный ахтунг. Что нибудь слелать можно ???

sokol92

#7
Замените getCellFormatRanges() на getUniqueCellFormatRanges()

Должно ускориться!

P.S. В разделе "последние сообщения" форума:  ;D

ЦитироватьRe: Очистка незащищенных ячеек от sokol92 (Basic)
Владимир.

Prototip

Цитата: sokol92 от  8 сентября 2020, 16:32

Должно ускориться!


Ускорение в 16 раз

Спасибо, rami, sokol92  :beer:

sokol92

Отлично! Кстати, в Excel нет аналога указанным методам группировки ячеек по формату.
Владимир.

Prototip

Добрый день, имеется ввиду "Unique" ? Прекрасный козырь в рукаве  8-)