речь про таблицу во Writer
я нашёл в ячейке таблицы нужную мне закладку
Anchor = Doc.Bookmarks.getByName("MY").getAnchor()
далее я знаю ячейку и таблицу этой закладки
Cell = Anchor.Cell
Table = Anchor.TextTable
мне надо удалить строку в этой таблице где содержится эта ячейка, как это сделать?!
Продолжайте исследование: у ячейки Cell есть свойство CellName. :)
я в курсе про CellName, но я же не могу по CellName удалить строку таблицы, или мне что, парсить имя ячейки и выковыривать из имени номер строки?! я думаю есть какойто более валидный метод
Цитата: kms от 31 марта 2021, 16:20парсить имя ячейки и выковыривать из имени номер строки
До сих пор так и делал...
Цитата: sokol92 от 31 марта 2021, 16:29
Цитата: kms от 31 марта 2021, 16:20парсить имя ячейки и выковыривать из имени номер строки
До сих пор так и делал...
ну согласись это какойто костыльный способ, неужели нет какогото метода для получения строки текущей ячейки
Подождем спецов по Writer...
В Writer'е никогда не работал... почти.
Макрос получает строку по имени пустой ячейки и удаляет всю строку:
https://ask.libreoffice.org/en/question/243251/writer-macro-to-delete-empty-rows-in-tables/
Адаптируйте код под себя.
Приведу другой «костыльный» способ для сравнения, похожий на этот. В диалогах контрол combobox, в отличие от списка и аналогичного элемента управления MS Forms, почему-то не имеет свойства ListIndex, и чтобы удалить пунктик, значение которого мы знаем, и оно выбрано, надо организовать цикл с перебором значений, чтобы вычислить, а не получить индекс пункта. Добавят – будем делать по другому... in one go
Цитата: eeigor от 31 марта 2021, 18:02
В Writer'е никогда не работал... почти.
Макрос получает строку по имени пустой ячейки и удаляет всю строку:
https://ask.libreoffice.org/en/question/243251/writer-macro-to-delete-empty-rows-in-tables/
Адаптируйте код под себя.
Приведу другой «костыльный» способ для сравнения, похожий на этот. В диалогах контрол combobox, в отличие от списка и аналогичного элемента управления MS Forms, почему-то не имеет свойства ListIndex, и чтобы удалить пунктик, значение которого мы знаем, и оно выбрано, надо организовать цикл с перебором значений, чтобы вычислить, а не получить индекс пункта. Добавят – будем делать по другому... in one go
ну как бы не совсем он тут получает строку по имени пустой ячейки, он просто перебирает строки по индексу, и смотрит есть ли пустые ячейки в нём. тоесть только перебором и сравнением имён ячеек с моей можно выявить?!
ну и второй вопрос, костыльный, как тут принято выуживать из строки (имени ячейки) номер цифру? чтоб получить номер строки, есть какой пример? оба способа костыльны, но второй хотябы без перебора
Аккуратно выделить из имени ячейки номер столбца и строки можно так. Нужно при этом учитывать, что для разделенных (Split) ячеек имя ячейки содержит знак точки (см. описание метода getCellByName (https://api.libreoffice.org/docs/idl/ref/interfacecom_1_1sun_1_1star_1_1text_1_1XTextTable.html#a41a52d374875984c2ebfb1bfbe27d994)). Кроме того, для указания номера столбца в CellName Writer использует 52-ричную систему счисления ( ;D ).
' Вычисляет номера столбца и строки (от 0) по имени ячейки текстовой таблицы (CellName).
' Возвращает массив из 2 элементов (Long): номер столбца и номер строки.
' Для разделенной ячейки (имя содержит знак точки) возвращает значения для исходной ячейки (до разделения).
' При некорректном аргументе возвращает массив из двух -1.
Function TextTable_ColumnRowByCellName(ByVal cellName As String)
Dim i As Long, j as Long, column As Long, row As Long, c As String
column=-1 : row=-1 : TextTable_ColumnRowByCellName=Array(column, row)
i=Instr(1, cellName, ".")
If i=1 Then Exit Function
If i>1 Then cellName=Left(cellName, i-1)
i=1 : column=0
Do While i<Len(cellName)
c=Mid(cellName, i, 1)
If c>="A" And c<="Z" Then
column=column * 52 + Asc(c) - Asc("A") + 1
ElseIf c>="a" And c<="z" Then
column=column * 52 + Asc(c) - Asc("a") + 27
Else
Exit Do
End If
i=i+1
Loop
If IsNumeric(Mid(cellName, i)) Then row=Clng(Mid(cellName, i))
If column>0 And row>0 Then TextTable_ColumnRowByCellName=Array(column-1, row-1)
End Function
' Вычисляет номер столбца (от 0) по имени ячейки текстовой таблицы (CellName).
' Для разделенной ячейки (имя содержит знак точки) возвращает значение для исходной ячейки (до разделения).
' При некорректном аргументе возвращает -1.
Function TextTable_ColumnByCellName(ByVal cellName As String)
TextTable_ColumnByCellName=TextTable_ColumnRowByCellName(cellName)(0)
End Function
' Вычисляет номер строки (от 0) по имени ячейки текстовой таблицы (CellName).
' Для разделенной ячейки (имя содержит знак точки) возвращает значение для исходной ячейки (до разделения).
' При некорректном аргументе возвращает -1.
Function TextTable_RowByCellName(ByVal cellName As String)
TextTable_RowByCellName=TextTable_ColumnRowByCellName(cellName)(1)
End Function
Sub testTextTable
Dim s As String
s="AA111"
Msgbox Join(TextTable_ColumnRowByCellName(s))
Msgbox TextTable_ColumnByCellName(s)
Msgbox TextTable_RowByCellName(s)
End Sub
оказывается есть такая функция как Right например, которая обрезает строку с определённого символа. В моём простом случае этого в принципе достаточно, на простых таблицах можно обрезать с первого символа. А где все эти функции описаны? например Right, я и не знал о её существовании
Например, здесь (https://help.libreoffice.org/7.1/en-US/text/sbasic/shared/03120307.html?DbPAR=BASIC)...
Прикрепленный файл чуть устарел. Например, нет функции Replace().
а есть функция получения всех символов конца строки начиная со второго например? я не нашёл
PS всё, разобрался - Mid