как узнать текущюю строку таблицы?

Автор kms, 31 марта 2021, 15:58

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

kms

речь про таблицу во Writer
я нашёл в ячейке таблицы нужную мне закладку

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

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

Cell = Anchor.Cell
Table = Anchor.TextTable

мне надо удалить строку в этой таблице где содержится эта ячейка, как это сделать?!
   

sokol92

Продолжайте исследование: у ячейки Cell есть свойство CellName.  :)
Владимир.

kms

я в курсе про CellName, но я же не могу по CellName удалить строку таблицы, или мне что, парсить имя ячейки и выковыривать из имени номер строки?! я думаю есть какойто более валидный метод

sokol92

Цитата: kms от 31 марта 2021, 16:20парсить имя ячейки и выковыривать из имени номер строки
До сих пор так и делал...
Владимир.

kms

Цитата: sokol92 от 31 марта 2021, 16:29
Цитата: kms от 31 марта 2021, 16:20парсить имя ячейки и выковыривать из имени номер строки
До сих пор так и делал...
ну согласись это какойто костыльный способ, неужели нет какогото метода для получения строки текущей ячейки

sokol92

Владимир.

eeigor

#6
В Writer'е никогда не работал... почти.

Макрос получает строку по имени пустой ячейки и удаляет всю строку:
https://ask.libreoffice.org/en/question/243251/writer-macro-to-delete-empty-rows-in-tables/
Адаптируйте код под себя.
Приведу другой «костыльный» способ для сравнения, похожий  на этот. В диалогах контрол combobox, в отличие от списка и аналогичного элемента управления MS Forms, почему-то не имеет свойства ListIndex, и чтобы удалить пунктик, значение которого мы знаем, и оно выбрано, надо организовать цикл с перебором значений, чтобы вычислить, а не получить индекс пункта. Добавят – будем делать по другому... in one go
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

kms

Цитата: 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

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

ну и второй вопрос, костыльный, как тут принято выуживать из строки (имени ячейки) номер цифру? чтоб получить номер строки, есть какой пример? оба способа костыльны, но второй хотябы без перебора

sokol92

Аккуратно выделить из имени ячейки номер столбца и строки можно так. Нужно при этом учитывать, что для разделенных (Split) ячеек имя ячейки содержит знак точки (см. описание метода getCellByName). Кроме того, для указания номера столбца в 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
Владимир.

kms

оказывается есть такая функция как Right например, которая обрезает строку с определённого символа. В моём простом случае этого в принципе достаточно, на простых таблицах можно обрезать с первого символа. А где все эти функции описаны? например Right, я и не знал о её существовании

eeigor

#10
Например, здесь...
Прикрепленный файл чуть устарел. Например, нет функции Replace().
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

kms

#11
а есть функция получения всех символов конца строки начиная со второго например? я не нашёл
PS всё, разобрался - Mid