快速步骤:
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
这首先确定第 1 行中最后填充的列。然后将进行列反转过程,直到该列为止。
要了解 Libreoffice 中的宏,请从这里开始:https://wiki.documentfoundation.org/Macros
以防万一这里有人想要颠倒行(而不是列)的顺序......我采用了@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
不幸的是,第一个答案不起作用,因为它不是逐列排序,而是每列单独排序。
您不会颠倒列的顺序,而是获得每列的最高值到最低值。刚才试过了。在旧的 excel 中,您可以执行转置技巧,但 2021 年 libre office 中不提供相同的功能
2021 年更好的解决方案是 INDEX- 函数。
=INDEX($A$1:$NN$25;1+$A30;25-A$30)
它采用您拥有的定义范围的数据,在带有美元符号的锁定网格中,并采用第一行减去两个列表中递增数字的值。
1,2,3...在行中,1,2,3 在列中。在一个实例中锁定列,或在另一个实例中锁定行就可以了。下面是一个索引表示例,采用 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 |