https://gr-plus.blogspot.com/2015/01/reverse-column-or-row-order-in-excel-or.html
这里介绍一种使用Libreoffice Basic和Libreoffice API的方法。
sub ReverseColumns()
oThisWorkbook = ThisComponent
oActiveSheet = oThisWorkbook.CurrentController.ActiveSheet
oRow1 = oActiveSheet.getRows().getByIndex(0)
aFilledCellsRow1 = oRow1.queryContentCells(1+2+4+16).getRangeAddresses()
if ubound(aFilledCellsRow1) = -1 then exit sub
lLastFilledColumnRow1 = aFilledCellsRow1(ubound(aFilledCellsRow1)).EndColumn
c = 0
for i = lLastFilledColumnRow1 to 1 step -1
oCellTargetColumn = oActiveSheet.getCellByPosition(c, 0)
oRangeAddressTargetColumn = oCellTargetColumn.RangeAddress
oActiveSheet.insertCells(oRangeAddressTargetColumn, com.sun.star.sheet.CellInsertMode.COLUMNS)
oCellTargetColumn = oActiveSheet.getCellByPosition(c, 0)
oCellAddressTargetColumn = oCellTargetColumn.CellAddress
oRangeSource = oActiveSheet.Columns.getByIndex(lLastFilledColumnRow1 + 1)
oRangeAddressSource = oRangeSource.RangeAddress
oActiveSheet.moveRange(oCellAddressTargetColumn, oRangeAddressSource)
c = c + 1
next
end sub
Sub
但未找到。你看到我的代码第一行以sub ReverseColumns()
开头了吗? - Axel Richtersub ReverseColumns()
之前除了 REM
arks 以外没有任何内容,在 end sub
之后也是如此。如果模块中有更多的代码,则所有代码必须位于 Sub ... End Sub
或 FUNCTION ... END FUNCTION
内,除了 REM
arks 或全局定义 (DIM ...
, GLOBAL ...
, PUBLIC ...
, PRIVATE ...
, ...)。 - Axel Richter很遗憾,第一个答案不起作用,因为它不是按列排序,而是单独按每一列排序。
您不需要颠倒列的顺序,而是获取每一列的最高到最低值。我刚试过了。在旧版 Excel 中,您可以使用转置技巧,但在 2021 年的 LibreOffice 中,该功能不可用。
=INDEX($A$1:$NN$25;1+$A30;25-A$30)
它使用带有美元符号的锁定网格中定义的数据范围,并从两个递增数字列表中减去第一行的值。
在行和列中分别使用锁定列或锁定行即可完成操作。下面是一个索引表示例,使用stackoverflow ASCII格式。
| A30 | B30 | C30 |
| ---- |----------------------------------- |-----------------------------------|
| A31 | =INDEX($A$1:$NN$25;1+$A30;25-A$30 | =INDEX($A$1:$NN$25;1+$A30;25-B$30 |
| A32 | =INDEX($A$1:$NN$25;1+$A31;25-A$30 | =INDEX($A$1:$NN$25;1+$A30;25-B$30 |
如果有人想要反转行的顺序(而不是列)...我使用了由 @Axel-Richter发布的宏代码,并对其进行了编辑,以实现这一点:
sub ReverseRows()
oThisWorkbook = ThisComponent
oActiveSheet = oThisWorkbook.CurrentController.ActiveSheet
oColumn1 = oActiveSheet.getColumns().getByIndex(0)
aFilledCellsColumn1 = oColumn1.queryContentCells(1+2+4+16).getRangeAddresses()
if ubound(aFilledCellsColumn1) = -1 then exit sub
lLastFilledRowColumn1 = aFilledCellsColumn1(ubound(aFilledCellsColumn1)).EndRow
c = 0
for i = lLastFilledRowColumn1 to 1 step -1
oCellTargetRow = oActiveSheet.getCellByPosition(0, c)
oRangeAddressTargetRow = oCellTargetRow.RangeAddress
oActiveSheet.insertCells(oRangeAddressTargetRow, com.sun.star.sheet.CellInsertMode.ROWS)
oCellTargetRow = oActiveSheet.getCellByPosition(0, c)
oCellAddressTargetRow = oCellTargetRow.CellAddress
oRangeSource = oActiveSheet.Rows.getByIndex(lLastFilledRowColumn1 + 1)
oRangeAddressSource = oRangeSource.RangeAddress
oActiveSheet.moveRange(oCellAddressTargetRow, oRangeAddressSource)
c = c + 1
next
end sub