ฟังก์ชั่นเพื่อค้นหาคอลัมน์ที่มีคนสุดท้ายในแมโคร LibreOffice


0

ฉันกำลังพยายามค้นหาคอลัมน์ดัชนีสำหรับคอลัมน์ที่มีประชากรล่าสุดสำหรับแถวที่เฉพาะเจาะจงและเพื่อจุดประสงค์เดียวกันฉันพยายามเขียนฟังก์ชันใน 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

คำตอบ:


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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.