Как ускорить работу макроса

Автор Кот, 7 декабря 2022, 18:07

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

Кот

Здравствуйте!
Подскажите пожалуйста, как сделать (или что-то дописать (исправить) в макросе), чтобы макрос работал быстрее, очень уж медленно он выполняет свое предназначение.
Замысел отсортировать ФИО без пустых строк (без применения от А до Я), просто без пустых строк.

Option VBASupport 1
rem Сортировка (отсортируются ФИО без пустых строк)
Sub Sortirovka1
   Application.ScreenUpdating=false                   
   For Each r in [A12:A7711]                         
   rem (Одно условие - скрыть все что пусто в диапазоне A12:A7711)
   If r.value <1  Then r.entirerow.hidden=true     
Next
   Application.ScreenUpdating=true
End Sub

Спасибо!

bigor

Здравствуйте
Если нужно скрыть действительно пустые ячейки, то этот макрос будет шустрее
Sub hiderow1
Dim oSheet As Variant, oEmpty As Variant, oRows As Variant, i As Long
oSheet = ThisComponent.sheets(0).getCellRangeByName("A12:A7711")
oSheet.getRows().IsVisible = True
oEmpty = oSheet.getColumns.getByIndex(0).queryEmptyCells()
For i = oEmpty.getCount()-1 To 0 Step -1
oEmpty.getByIndex(i).getRows().IsVisible = False
Next i
End Sub
У вас скорее всего в ячейках формулы, поэтому данный вариант не сработает
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

sokol92

Для скрытия / отображения строк есть специальный метод - автофильтр. Как с ним работать программным путем написано в книге А.Питоньяка OOME_4_0.odt раздел "15.6.3. Filters".
Владимир.

Кот

Доброго дня Вам!

Предложенный Вами код, работает безупречно, но он также убирает почти всю шапку (это строки 1-8 и 10). Остаются только две строки 9 и 11.
Может что-то изменить (добавить) в предложенном Вами коде?

Sub hiderow1
Dim oSheet As Variant, oEmpty As Variant, oRows As Variant, i As Long
   oSheet = ThisComponent.sheets(0).getCellRangeByName("A12:A7711")
   oSheet.getRows().IsVisible = True
   oEmpty = oSheet.getColumns.getByIndex(0).queryEmptyCells()
   For i = oEmpty.getCount()-1 To 0 Step -1
      oEmpty.getByIndex(i).getRows().IsVisible = False
   Next i
End Sub

Спасибо!

Кот

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

Да, формул много, но без них никак.

bigor

Цитата: Кот от  8 декабря 2022, 10:18Может что-то изменить (добавить) в предложенном Вами коде?
в строке For i = oEmpty.getCount()-1 To 0 Step -1 замените 0 на 2
Но данный код не скрывает строки если в столбце А есть формулы, хотя может это для вас и не важно
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

Кот

Цитата: bigor от  8 декабря 2022, 13:20
Цитата: Кот от  8 декабря 2022, 10:18Может что-то изменить (добавить) в предложенном Вами коде?
в строке For i = oEmpty.getCount()-1 To 0 Step -1 замените 0 на 2
Но данный код не скрывает строки если в столбце А есть формулы, хотя может это для вас и не важно

Sub hiderow1
Dim oSheet As Variant, oEmpty As Variant, oRows As Variant, i As Long
   oSheet = ThisComponent.sheets(0).getCellRangeByName("A12:A7711")
   oSheet.getRows().IsVisible = True
   oEmpty = oSheet.getColumns.getByIndex(0).queryEmptyCells()
   For i = oEmpty.getCount()-1 To 2 Step -1
      oEmpty.getByIndex(i).getRows().IsVisible = False
   Next i
End Sub

Да, Ваш код работает очень шустро, но у меня в ячейках формулы, а он их не сортирует.
А другой вариант есть?
Спасибо!

bigor

#7
Цитата: Кот от  8 декабря 2022, 14:01А другой вариант есть?
Есть

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

Кот

Цитата: Кот от  8 декабря 2022, 14:01Заменил в строке (For i = oEmpty.getCount()-1 To 0 Step -1) 0 на 2, работает отлично, но данный код не скрывает строки если в столбце А есть формулы. Это важно, т.к. оставшиеся данные будут выводиться на печать.
Sub hiderow1
Dim oSheet As Variant, oEmpty As Variant, oRows As Variant, i As Long
   oSheet = ThisComponent.sheets(0).getCellRangeByName("A12:A7711")
   oSheet.getRows().IsVisible = True
   oEmpty = oSheet.getColumns.getByIndex(0).queryEmptyCells()
   For i = oEmpty.getCount()-1 To 2 Step -1
      oEmpty.getByIndex(i).getRows().IsVisible = False
   Next i
End Sub

Спасибо!

bigor

Если есть формулы и текст, как у вас в примере, то решается это через фильтр, как писал sokol92 в #2, если только формулы, то можно еще поэкспериментировать с query, например
Sub hiderow2
Dim oSheet As Variant, oEmpty As Variant, oRows As Variant, i As Long
oSheet = ThisComponent.sheets(0).getCellRangeByName("A12:A7711")
oSheet.getRows().IsVisible = false
oEmpty = oSheet.getColumns.getByIndex(0).queryFormulaCells(2)
For i = oEmpty.getCount()-1 To 0 Step -1
oEmpty.getByIndex(i).getRows().IsVisible = true
Next i
End Sub
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

Кот

Цитата: bigor от  9 декабря 2022, 21:40Sub hiderow2
Dim oSheet As Variant, oEmpty As Variant, oRows As Variant, i As Long
   oSheet = ThisComponent.sheets(0).getCellRangeByName("A12:A7711")
   oSheet.getRows().IsVisible = false
   oEmpty = oSheet.getColumns.getByIndex(0).queryFormulaCells(2)
   For i = oEmpty.getCount()-1 To 0 Step -1
      oEmpty.getByIndex(i).getRows().IsVisible = true
   Next i
End Sub

Данный Вами код работает отлично, как надо.
Пошел дальше мучиться.
Спасибо!

Кот

Цитата: Кот от  9 декабря 2022, 22:27Sub hiderow2
Dim oSheet As Variant, oEmpty As Variant, oRows As Variant, i As Long
  oSheet = ThisComponent.sheets(0).getCellRangeByName("A12:A7711")
  oSheet.getRows().IsVisible = false
  oEmpty = oSheet.getColumns.getByIndex(0).queryFormulaCells(2)
  For i = oEmpty.getCount()-1 To 0 Step -1
      oEmpty.getByIndex(i).getRows().IsVisible = true
  Next i
End Sub

Что-то непонятное происходит. В одном файле работает, в другом нет.
Что не так? Подскажите пожалуйста.
Спасибо!

bigor

Цитата: Кот от 11 декабря 2022, 19:22Что не так?
формулы не те. Макрос и "" понимает как текст, поэтому формула должна выглядеть так
=IF('file:///home/bigor/Платные услуги.ods'#$Выбор_Группы.H2>0;'file:///home/bigor/Платные услуги.ods'#$Выбор_Группы.C2)
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

Кот

Цитата: bigor от 11 декабря 2022, 20:00=IF
Заменил =ЕСЛИ на =IF у меня стало показывать #ИМЯ?

bigor

уберите в конце формулы в вашем файле ;""  и всё
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут