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

Главная категория => Макросы => Тема начата: kms от 31 марта 2021, 15:58

Название: как узнать текущюю строку таблицы?
Отправлено: kms от 31 марта 2021, 15:58
речь про таблицу во Writer
я нашёл в ячейке таблицы нужную мне закладку

Anchor = Doc.Bookmarks.getByName("MY").getAnchor()

далее я знаю ячейку и таблицу этой закладки

Cell = Anchor.Cell
Table = Anchor.TextTable

мне надо удалить строку в этой таблице где содержится эта ячейка, как это сделать?!
   
Название: Re: как узнать текущюю строку таблицы?
Отправлено: sokol92 от 31 марта 2021, 16:12
Продолжайте исследование: у ячейки Cell есть свойство CellName.  :)
Название: Re: как узнать текущюю строку таблицы?
Отправлено: kms от 31 марта 2021, 16:20
я в курсе про CellName, но я же не могу по CellName удалить строку таблицы, или мне что, парсить имя ячейки и выковыривать из имени номер строки?! я думаю есть какойто более валидный метод
Название: Re: как узнать текущюю строку таблицы?
Отправлено: sokol92 от 31 марта 2021, 16:29
Цитата: kms от 31 марта 2021, 16:20парсить имя ячейки и выковыривать из имени номер строки
До сих пор так и делал...
Название: Re: как узнать текущюю строку таблицы?
Отправлено: kms от 31 марта 2021, 16:31
Цитата: sokol92 от 31 марта 2021, 16:29
Цитата: kms от 31 марта 2021, 16:20парсить имя ячейки и выковыривать из имени номер строки
До сих пор так и делал...
ну согласись это какойто костыльный способ, неужели нет какогото метода для получения строки текущей ячейки
Название: Re: как узнать текущюю строку таблицы?
Отправлено: sokol92 от 31 марта 2021, 16:33
Подождем спецов по Writer...
Название: Re: как узнать текущюю строку таблицы?
Отправлено: 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
Название: Re: как узнать текущюю строку таблицы?
Отправлено: kms от 31 марта 2021, 19:05
Цитата: 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

ну как бы не совсем он тут получает строку по имени пустой ячейки, он просто перебирает строки по индексу, и смотрит есть ли пустые ячейки в нём. тоесть только перебором и сравнением имён ячеек с моей можно выявить?!

ну и второй вопрос, костыльный, как тут принято выуживать из строки (имени ячейки) номер цифру? чтоб получить номер строки, есть какой пример? оба способа костыльны, но второй хотябы без перебора
Название: Re: как узнать текущюю строку таблицы?
Отправлено: sokol92 от 31 марта 2021, 19:37
Аккуратно выделить из имени ячейки номер столбца и строки можно так. Нужно при этом учитывать, что для разделенных (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
Название: Re: как узнать текущюю строку таблицы?
Отправлено: kms от 31 марта 2021, 22:30
оказывается есть такая функция как Right например, которая обрезает строку с определённого символа. В моём простом случае этого в принципе достаточно, на простых таблицах можно обрезать с первого символа. А где все эти функции описаны? например Right, я и не знал о её существовании
Название: Re: как узнать текущюю строку таблицы?
Отправлено: eeigor от 31 марта 2021, 22:43
Например, здесь (https://help.libreoffice.org/7.1/en-US/text/sbasic/shared/03120307.html?DbPAR=BASIC)...
Прикрепленный файл чуть устарел. Например, нет функции Replace().
Название: Re: как узнать текущюю строку таблицы?
Отправлено: kms от 31 марта 2021, 23:36
а есть функция получения всех символов конца строки начиная со второго например? я не нашёл
PS всё, разобрался - Mid