Как перебирать диапазон строк в электронной таблице LibreOffice Calc, сравнивая значения ячеек, устанавливая значения ячеек и удаляя строку, если условие истинно

У меня есть следующее требование к моей электронной таблице LibreOffice Calc:


ForEach Row 'r' в выбранном диапазоне, начиная с последней строки в диапазоне, и двигаясь назад (вверх) по одной строке за раз,

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


т.е.

Представляя CellValue(Column[A], Row[r]) как A[r],

И представляя строку перед (чуть выше), что, как A[r-1],

Мне нужно сделать следующее:

  FOR (r = LastRowInSelectedRange; r>1; r=r-1) {

    IF FollowingConditionsAreTrue (
      (r > 1)
      AND (A[r] IsEqualTo A[r-1])
      AND (B[r] IsEqualTo C[r-1])
      AND (E[r] IsEqualTo E[r-1])
    ) ThenDoTheFollowing {

      SET C[r-1] = C[r]
      DeleteRow(r)

    } EndIF

  } EndFOR

Вопрос: Как это реализовать в LibreOffice Calc?


person Anto Jose    schedule 02.03.2020    source источник


Ответы (1)


Следующее должно помочь. Предполагается, что ваши данные находятся в диапазоне A1:E10 на листе с именем Sheet1. Чтобы использовать другой диапазон, измените соответствующие строки. Если вы хотите выбрать диапазон вручную, закомментируйте строку oCellRange = oSheet.getCellRangeByName("A1:E10") и раскомментируйте строку oCellRange = oDoc.getCurrentSelection(). Это будет работать только в том случае, если у вас есть один выбор, а не несколько.

Sub iterateThroughRange()

    Dim oDoc As Object
    oDoc =  ThisComponent

    Dim oSheet As Object
    oSheet = oDoc.getSheets().getByName("Sheet1")

    Dim oCellRange As Object    
    oCellRange = oSheet.getCellRangeByName("A1:E10") 

    'The above line gets a named range. To get a slected area instead
    'comment it out and uncomment the following line:
    'oCellRange = oDoc.getCurrentSelection() 

    Dim oTableRows As Object
    oTableRows = oCellRange.getRows()

    Dim nRows As Integer
    nRows = oTableRows.getCount()

    Dim oTableColumns As Object
    oTableColumns = oCellRange.getColumns()

    Dim nColumns As Integer
    nColumns = oTableColumns.getCount() 

    Dim oThisRow As Object, oPreviousRow As Object
    Dim oThisRowData() As Variant, oPreviousRowData() As Variant
    Dim oThisRowAddress As Variant

    For r = nRows - 1 To 1 Step - 1

        oThisRow = oCellRange.getCellRangeByPosition(0, r, nColumns - 1, r)
        oThisRowData = oThisRow.getDataArray()         

        oPreviousRow = oCellRange.getCellRangeByPosition(0, r - 1, nColumns - 1, r - 1)
        oPreviousRowData = oPreviousRow.getDataArray()

        'Column A = index 0
        'Column B = index 1
        'Column C = index 2
        'Column E = index 4

        If oThisRowData(0)(0) = oPreviousRowData(0)(0) AND _
           oThisRowData(0)(1) = oPreviousRowData(0)(2) AND _
           oThisRowData(0)(4) = oPreviousRowData(0)(4) Then

            oPreviousRowData(0)(2) = oThisRowData(0)(2)
            oPreviousRow.setDataArray(oPreviousRowData)

            'The following two lines delete the range and move the cells up
            oThisRowAddress = oThisRow.getRangeAddress()
            oSheet.removeRange(oThisRowAddress, com.sun.star.sheet.CellDeleteMode.UP)

            'To delete the entire row instead of just the affected cells,
            'comment out the above two lines and uncomment the following line:
            'oTableRows.removeByIndex(r, 1)

        End If

    Next r

End Sub
person Howard Rudd    schedule 24.07.2020