在 libre office calc 中反转列顺序

问题描述 投票:0回答:6

假设我有这个这个细胞:

然后出于某种原因,我想自动反转列的顺序,变成这样的:

任何帮助将不胜感激!

libreoffice-calc
6个回答
8
投票

快速步骤:

  • 在 1
  • 上方插入新行
  • 用单调递增的整数索引向右填充行。
  • 然后选择您的数据并降序排序,因此索引最高的右列排在第一位
  • 复制并粘贴结果


https://gr-plus.blogspot.com/2015/01/reverse-column-or-row-order-in-excel-or.html


1
投票

所以这是一种使用 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


0
投票

以防万一这里有人想要颠倒(而不是列)的顺序......我采用了@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

0
投票

不幸的是,第一个答案不起作用,因为它不是逐列排序,而是每列单独排序。

您不会颠倒列的顺序,而是获得每列的最高值到最低值。刚才试过了。在旧的 excel 中,您可以执行转置技巧,但 2021 年 libre office 中不提供相同的功能


0
投票

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 |

0
投票

这是 droid192 建议的方法,但有一些有用的图片。我有同样的问题,我的数据有一列有 2100 个条目。手工做那件事是不会发生的。

首先,如果您使用常规的升序或降序排序,您实际上对数据进行了排序,而不仅仅是翻转它,并且使用右键单击特殊粘贴和转置选项也不太正确。

因此,复制您的专栏并将其粘贴到远离其他所有内容的地方。在该列旁边创建一个数字系列,从 1 到列中有多少个单元格(键入 1,然后键入 2,然后键入 3,然后一直向下拖动。)

现在选择并突出显示新列并单击按降序排序按钮并选择展开选择并选择要翻转的列。

现在翻转了。删除另一列并在需要的地方越过新列。

© www.soinside.com 2019 - 2024. All rights reserved.