Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

22 Май 2022, 12:53 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Здесь можно поблагодарить участников форума Улыбка
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: « 1 2   Вниз
  Печать  
Автор Тема: Удаление строки с непустыми ячейками в Calc  (Прочитано 1423 раз)
0 Пользователей и 1 Гость смотрят эту тему.
eeigor
Опытный пользователь
***
Offline Offline

Пол: Мужской
Сообщений: 1 088


« Ответ #15: 11 Май 2022, 13:51 »

Ошибка?
Function GetCellCollection(RangeAddresses())
Во-первых, массив, а во-вторых, массив адресов диапазонов. А вы передали один и диапазон.

Cells = GetCellCollection(Array(oRange.RangeAddress))

Edit:
Но только это имеет смысл, если диапазон содержит пустые ячейки. Если нет, то вы можете перебрать диапазон как обычно. Пояснение: при переборе диапазона в цикле For Each пустые ячейки исключаются. Но тот же диапазон можно перебрать в цикле For i = 0 To, перебирая все ячейки по индексам.


Сформулируйте задачу целиком.
« Последнее редактирование: 11 Май 2022, 14:01 от eeigor » Записан

Ubuntu 18.04 LTS • LibreOffice 7.3.2.2 Community
siti
Участник
**
Offline Offline

Сообщений: 44


« Ответ #16: 11 Май 2022, 14:06 »

То есть если мне надо анализировать диапазон через GetCellCollection и в нем все ячейки не пустые, то
Код:
For Each oCell In Cells
    If oCell.String Like "*abc*" Then
        ThisComponent.CurrentController.select(oCell)  'contains "abc"
        Exit For
    End If
Next
ничего не найдет?
Записан
siti
Участник
**
Offline Offline

Сообщений: 44


« Ответ #17: 11 Май 2022, 14:07 »

Сформулируйте задачу целиком.
ну просто перебираю все ячейки в диапазоне и если текст в ячейке соответствует определенному условию выделяю ячейку.
Ячейки как пустые так и нет.

Edit
Вы оказывается предыдущие посты правите  Улыбка
Для будущих поколений это удобно, но я не всегда понимаю, что надо заглянуть на предыдущую страницу и там есть новая информация  Да уж...
« Последнее редактирование: 11 Май 2022, 14:20 от siti » Записан
eeigor
Опытный пользователь
***
Offline Offline

Пол: Мужской
Сообщений: 1 088


« Ответ #18: 11 Май 2022, 15:41 »

Пустые ячейки в обычном цикле будут пропущены, но они вам и не нужны.
Но вашу задачу можно решить иначе (без перебора в цикле – это долго): через дескриптор поиска с использованием регулярных выражений. Макрос будет даже короче и уж точно – проще для восприятия.
Записан

Ubuntu 18.04 LTS • LibreOffice 7.3.2.2 Community
eeigor
Опытный пользователь
***
Offline Offline

Пол: Мужской
Сообщений: 1 088


« Ответ #19: 11 Май 2022, 17:19 »

Но вашу задачу можно решить иначе (без перебора в цикле – это долго): через дескриптор поиска с использованием регулярных выражений.

Найдём ячейки, содержащие строку "Авито", и выделим найденные ячейки стандартным стилем "Bad" (не знаю, как он называется в локализованной версии, и вы можете создать свой стиль под это дело). За диапазон принят весь лист (но можно детализировать). В цикле перебираются только найденные ячейки (точнее целые прямоугольные диапазоны РАЗОМ). Это быстрее.

Код:
Sub HighlightMatches()
Const STYLE_NAME = "Bad"  'name of standard style (must exist)

Dim oSheet As Object
Dim oSearchDescriptor As Object, oFound As Object
Dim sPattern$  'regex pattern (search criteria)

oSheet = ThisComponent.Sheets(0)
oSearchDescriptor = oSheet.createSearchDescriptor()
oSearchDescriptor.SearchRegularExpression = True

Rem oSearchDescriptor.SearchWords = True:  sPattern = ".*Авито.*"
oSearchDescriptor.SearchWords = False: sPattern = "Авито"

oSearchDescriptor.SearchString = sPattern
oFound = oSheet.findAll(oSearchDescriptor)  'returns CellRanges
Dim i%
' For each cell found, apply the existing style.
If Not isNull(oFound) Then
For i = 0 To oFound.Count - 1
oFound(i).CellStyle = STYLE_NAME
Next
End If
End Sub

Прим. Регистр символов при поиске можно задать в свойстве дескриптора (SearchCaseSensitive) или непосредственно в регулярном выражении: "(?-i)".
Можно без стиля, а отформатировать непосредственно. Код выше не сбрасывает выделение.
Updated
« Последнее редактирование: 11 Май 2022, 22:55 от eeigor » Записан

Ubuntu 18.04 LTS • LibreOffice 7.3.2.2 Community
siti
Участник
**
Offline Offline

Сообщений: 44


« Ответ #20: 13 Май 2022, 12:44 »

Нужное решение, пригодится тоже!
Записан
Страниц: « 1 2   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!