Удаление строки с непустыми ячейками в Calc

Автор siti, 11 апреля 2022, 13:43

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

eeigor

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

Cells = GetCellCollection(Array(oRange.RangeAddress))

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


Сформулируйте задачу целиком.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

siti

То есть если мне надо анализировать диапазон через GetCellCollection и в нем все ячейки не пустые, то

For Each oCell In Cells
    If oCell.String Like "*abc*" Then
        ThisComponent.CurrentController.select(oCell)  'contains "abc"
        Exit For
    End If
Next

ничего не найдет?

siti

#17
Цитата: eeigor от 11 мая 2022, 13:51Сформулируйте задачу целиком.
ну просто перебираю все ячейки в диапазоне и если текст в ячейке соответствует определенному условию выделяю ячейку.
Ячейки как пустые так и нет.

Edit
Вы оказывается предыдущие посты правите  :)
Для будущих поколений это удобно, но я не всегда понимаю, что надо заглянуть на предыдущую страницу и там есть новая информация  :roll:

eeigor

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

eeigor

#19
Цитата: eeigor от 11 мая 2022, 15:41Но вашу задачу можно решить иначе (без перебора в цикле – это долго): через дескриптор поиска с использованием регулярных выражений.

Найдём ячейки, содержащие строку "Авито", и выделим найденные ячейки стандартным стилем "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
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

siti