Função para encontrar a última coluna preenchida no LibreOffice Macro

0

Estou tentando encontrar o índice da coluna da última coluna preenchida para uma linha específica e, para o mesmo propósito, estou tentando gravar uma função no LibreOffice. Primeiro devo dizer que sou um novato total na escrita de macros, especialmente o LibreOffice, já que estou vindo do background do Excel. Embora eu tenha tentado escrever uma função com a ajuda de fóruns, eu não consigo corrigir a função para colunas totalmente aqui é o link para a função original para encontrar a última linha:

link

A ajuda seria apreciada se alguém puder me ajudar a encontrar o erro na função, o problema parece estar apenas com a seção de Índice de Colunas.

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
    
por Addy 29.10.2016 / 07:21

1 resposta

0

Desculpe, mas o código tem muitos problemas. Parece que você estava confuso sobre se o código deveria ser sobre linhas ou colunas, quais partes deveriam ser numéricas versus nomeadas por letra e como trabalhar com objetos UNO. Você já tentou uma ferramenta de introspecção, como Xray ?

Aqui está uma função que funciona:

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

Eu testei com essa rotina:

Sub LastColumnIndexExample
    MsgBox LastColumnIndex(3, 0)  'row 4 of the first sheet
End Sub
    
por 29.10.2016 / 09:44