Я пытаюсь найти столбец Индекс для последнего заполненного столбца для конкретной строки и для той же цели я пытаюсь написать функцию в LibreOffice. Сначала я должен сказать, что я новичок в написании макросов, особенно в LibreOffice, так как я работаю в Excel. Хотя я пытался написать функцию с помощью форумов, я не могу полностью исправить функцию для столбцов, вот ссылка на оригинальную функцию для поиска последней строки:

https://forum.openoffice.org/en/forum/viewtopic.php?f=20&t=10817

Буду признателен за помощь, если кто-то может помочь мне найти ошибку в функции, проблема, похоже, связана только с разделом индекса столбца.

Function LastColumnIndex (InformedRow, Optional InformedSheet) as long
'this function returns the index of the last column with data in a row
'it returns -1 if the whole row is empty
   Dim oSheet As Object, C as Long
   Dim oColumn As Object, oFinder As Object, oResult as object
   Dim PartsOfTheName   

   '------- Sheet -------
   If IsMissing(InformedSheet) then
      oSheet = ThisComponent.CurrentController.ActiveSheet
   ElseIf IsNumeric(InformedSheet) then
      oSheet = ThisComponent.Sheets(InformedSheet)
   Else
      oSheet = ThisComponent.Sheets.GetByName(InformedSheet)
   End If

   '------- Row -------
   If Not IsNumeric(InformedRow) then
      Dim AllRowNames (0 to 1048575)      
      AllRowNames = oSheet.Rows.ElementNames
      For i = 0 to 1048575
         If AllRowNames(i) = UCase(InformedRow) then
            C = i
         End If
      Next
   Else
      C = InformedRow
   End If

   '------- Search -------
   oRow = oSheet.Rows(C)
   oFinder = oRow.createSearchDescriptor
   oFinder.searchRegularExpression = true
   oFinder.SearchString = "."
   oResult = oRow.FindAll(oFinder)

   '------- Column Index -------
   If Not IsNull(oResult) then
      ResultName$ = oResult.AbsoluteName
      PartsOfTheName = Split(ResultName,"$")
      LastColumnIndex = Val(PartsOfTheName(ubound(PartsOfTheName))) - 1
   Else
      LastColumnIndex = - 1
   End If
End Function

1 ответ1

0

Извините, но у кода много проблем. Похоже, вы были сбиты с толку относительно того, должен ли код содержать строки или столбцы, какие части должны быть числовыми по сравнению с именованными буквами, и как работать с объектами UNO. Вы пробовали инструмент для самоанализа, такой как Xray?

Вот функция, которая работает:

Function LastColumnIndex (InformedRow As Long, Optional InformedSheet) As Long
    'this function returns the index of the last column with data in a row
    'it returns -1 if the whole row is empty
    Dim oSheet As Object
    Dim oColumn As Object, oFinder As Object, oResult as object
    Dim PartsOfTheName
    Dim LastColumnName As String

    '------- Sheet -------
    If IsMissing(InformedSheet) then
        oSheet = ThisComponent.CurrentController.ActiveSheet
    ElseIf IsNumeric(InformedSheet) then
        oSheet = ThisComponent.Sheets(InformedSheet)
    Else
        oSheet = ThisComponent.Sheets.GetByName(InformedSheet)
    End If

   '------- Search -------
   oRow = oSheet.Rows(InformedRow)
   oFinder = oRow.createSearchDescriptor
   oFinder.searchRegularExpression = true
   oFinder.SearchString = "."
   oResult = oRow.FindAll(oFinder)

   '------- Column Index -------
   LastColumnIndex = -1
   If Not IsNull(oResult) then
      ResultName$ = oResult.AbsoluteName
      PartsOfTheName = Split(ResultName,"$")
      LastColumnName = PartsOfTheName(UBound(PartsOfTheName) - 1)
      oColumns = oSheet.getColumns()
      If oColumns.hasByName(LastColumnName) Then
          oColumn = oColumns.getByName(LastColumnName)
          LastColumnIndex = oColumn.getRangeAddress().StartColumn
      End If
   End If
End Function

Я проверил это с помощью этой процедуры:

Sub LastColumnIndexExample
    MsgBox LastColumnIndex(3, 0)  'row 4 of the first sheet
End Sub

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .