Автоматическое скрытие строк по событию (изменение данных) и оптим. высота строк

Автор vovan_d, 10 апреля 2019, 09:30

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

vovan_d

Добрый день!

    Помогите создать макрос или другой способ,
    необходимо чтобы автоматический скрывались строки у которых отсуствует количество (равно 0),
    также оптимальная высота строки корректно работала (по умолчанию не работает).

     Примечание: данные вводятся на другом листе, это просто готовый бланк для печати.

    (Система Manjaro, Libreoffice 6.2)


vovan_d

Цитата: Bigor от 10 апреля 2019, 09:41
Посмотрите здесь про скрытие строк

Я смотрел, вчера. Не совсем разобралься. Если не сложно, описать данный макрос и я как понимаю он не совсем автоматический работает, нужно постоянно выполнять макрос или я ошибаюсь?

bigor

все макросы нужно выполнять :) можно один раз перед печатью или совместить скрытие с печатью.

Dim oSheet As Variant, oEmpty As Variant, oRows As Variant, i As Long '- задаем перемнные
oSheet = ThisComponent.getCurrentSelection().getSpreadsheet() '-лист на котором будем работать
oSheet.getRows().IsVisible = True ' - ltделаем е строки на листе видимыми
oEmpty = oSheet.getColumns.getByIndex(9).queryEmptyCells() '-собираем все строки у которых в столбце J пусто
For i = oEmpty.getCount()-1 To 0 Step -1 '-цикл по собранным строкам
oEmpty.getByIndex(i).getRows().IsVisible = False '-делаем их скрытыми
Next i
End Sub ' - все :)
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

vovan_d

Цитата: Bigor от 10 апреля 2019, 09:54
все макросы нужно выполнять :) можно один раз перед печатью или совместить скрытие с печатью.

Dim oSheet As Variant, oEmpty As Variant, oRows As Variant, i As Long '- задаем перемнные
oSheet = ThisComponent.getCurrentSelection().getSpreadsheet() '-лист на котором будем работать
oSheet.getRows().IsVisible = True ' - ltделаем е строки на листе видимыми
oEmpty = oSheet.getColumns.getByIndex(9).queryEmptyCells() '-собираем все строки у которых в столбце J пусто
For i = oEmpty.getCount()-1 To 0 Step -1 '-цикл по собранным строкам
oEmpty.getByIndex(i).getRows().IsVisible = False '-делаем их скрытыми
Next i
End Sub ' - все :)

Цитата: Bigor от 10 апреля 2019, 09:54
все макросы нужно выполнять :) можно один раз перед печатью или совместить скрытие с печатью.

Dim oSheet As Variant, oEmpty As Variant, oRows As Variant, i As Long '- задаем перемнные
oSheet = ThisComponent.getCurrentSelection().getSpreadsheet() '-лист на котором будем работать
oSheet.getRows().IsVisible = True ' - ltделаем е строки на листе видимыми
oEmpty = oSheet.getColumns.getByIndex(9).queryEmptyCells() '-собираем все строки у которых в столбце J пусто
For i = oEmpty.getCount()-1 To 0 Step -1 '-цикл по собранным строкам
oEmpty.getByIndex(i).getRows().IsVisible = False '-делаем их скрытыми
Next i
End Sub ' - все :)


vovan_d

Пробую этот вариант, есть одно но, в ячейках прописаны формулы и строки остаються тоже, хотя значение на другом листе "0". Как сделать чтобы фильтр работал по конечному значению?

vovan_d

Жду руку помощи. Уже пробовал сам писать макросы через запись, ничего не получается.
Когда выполняешь операции во время записи макроса, все выполняется, как только создал макрос, все, ничего не работает.

Вот такой макрос создаеться:

REM  *****  BASIC  *****

Sub Main

End Sub



sub Opt_str
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:ShowRow", "", 0, Array())

rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "aExtraHeight"
args2(0).Value = 0

dispatcher.executeDispatch(document, ".uno:SetOptimalRowHeight", "", 0, args2())


end sub


sub Opt_tn
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$B$24:$BO$80"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

rem ----------------------------------------------------------------------
rem dispatcher.executeDispatch(document, ".uno:DataFilterStandardFilter", "", 0, Array())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:FilterExecute", "", 0, Array())


end sub

bigor

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

vovan_d

Sub test_filtr1
oSheet = ThisComponent.sheets(0)
oSheet.getRows().IsVisible = True
For i = 25 To  79 'строки как в твоем примере
   If    oSheet.getCellByPosition(24,i).value > 0 Then
      oSheet.getCellByPosition(24,i).getRows().IsVisible = False
   EndIf
Next
End Sub

Посмотрите что я делаю не так
"24" - я как понимаю порядковый номер столбца (Y), правда он объединенный (Y, Z, AA)?
"25-79" - это порядковые номера строк на которых необходимо отработать макрос?

bigor

ну про объединенные ячейки не было ничего в первоначальном условии :) С ними не пробовал, и смогу посмотреть только после 15:00 сегодня
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

vovan_d


bigor

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

vovan_d

Вот так более менее работает:

Sub test_filtr1
Dim oSheet As Variant, oEmpty As Variant, oRows As Variant, i As Long '- задаем перемнные
      oSheet = ThisComponent.getCurrentSelection().getSpreadsheet() '-лист на котором будем работать
      oSheet.getRows().IsVisible = True ' - делаем е строки на листе видимыми
      oSheet = ThisComponent.sheets(1) ' - текущая страница
   For i = 24 To  78 ' - какие строки обработать
   If    oSheet.getCellByPosition(24,i).value = 0 Then ' - какие ячейки обрабатывать, в моем случае "Y"
      oSheet.getCellByPosition(24,i).getRows().IsVisible = False ' - скрыть строки которые соответсвуют значению строки выше
   EndIf
Next

End Sub

теперь мне нужно строки 25-78 автоматически оптимальная высота.

и еще, проблема, настроил данный макрос в Manjaro, открываю файл Win7 - Libreoffice, макрос не работает

bigor

Еще один цикл добавьте

For i =25 to 78
ThisComponent.Sheets(1).getCellbyPosition(24,i).getRows().OptimalHeight=true '-оптимальная высота
Next i


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

bigor

Цитата: vovan_d от 11 апреля 2019, 13:26настроил данный макрос в Manjaro, открываю файл Win7 - Libreoffice, макрос не работает
а где макрос сохранили, и что за файл  Win7 - Libreoffice ods/xls ?
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут