在Libre Office Calc中反转列顺序

4
假设我有这些单元格: Initial Enteries 出于某种原因,我想自动将列的顺序反转,变成这样: enter image description here 感谢任何帮助!

这个问题与编程有什么关系?在旧列“A”左侧插入一个新的空列“A"。剪切/粘贴现在的最后一列“D”到其中。现在将列“B”剪切/粘贴到现在的空列“D”中。删除现在的空列“B”。 - Axel Richter
@AxelRichter 感谢您的评论。但我认为有一个误解。这3列只是一个例子。我想对大量列执行此操作。因此,剪切和粘贴不是我要寻找的。这可能需要通过编程来完成。 - SirSaleh
那么应该使用什么编程语言? - Axel Richter
任何可以在LibreOffice Calc中使用的脚本。抱歉,我不知道LibreOffice Calc本身有哪些编程工具! - SirSaleh
6个回答

9

我的问题属于很久以前的事情!但是解决方案非常明智。谢谢。:)) - SirSaleh
太聪明了(如果没有太多条目的话)。 - Clément

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

这首先确定第一行中最后一个填充的列。然后将进行列反转过程,直到该列为止。
要了解Libreoffice中的宏,请从这里开始:https://wiki.documentfoundation.org/Macros

我不知道我哪里做错了,这个宏会停止并显示“BASIC语法错误。预期:Sub。” - SirSaleh
错误的意思是,期望找到关键字Sub但未找到。你看到我的代码第一行以sub ReverseColumns()开头了吗? - Axel Richter
是的!我在我的代码中检查过了!我也有它,但错误仍然存在。 - SirSaleh
在存储代码的模块中,所有代码都必须是可编译的,因为它们将在运行之前全部被编译。因此,最好确保在此模块中只有提供的代码,在 sub ReverseColumns() 之前除了 REMarks 以外没有任何内容,在 end sub 之后也是如此。如果模块中有更多的代码,则所有代码必须位于 Sub ... End SubFUNCTION ... END FUNCTION 内,除了 REMarks 或全局定义 (DIM ..., GLOBAL ..., PUBLIC ..., PRIVATE ..., ...)。 - Axel Richter

0

很遗憾,第一个答案不起作用,因为它不是按列排序,而是单独按每一列排序。

您不需要颠倒列的顺序,而是获取每一列的最高到最低值。我刚试过了。在旧版 Excel 中,您可以使用转置技巧,但在 2021 年的 LibreOffice 中,该功能不可用。


请注意,如果您认为所选答案无效,请编辑您的答案并插入您建议的解决方案。 - robertobatts
这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - João Dias

0

这是droid192提出的方法,但附带了一些有用的图片。我遇到了同样的问题,我的数据有一个包含2100条目的列。手动完成这项任务是不可能的。

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

因此,请复制您的列并将其粘贴到离其他所有内容较远的位置。在该列旁边创建一个数字系列,从1到您列中拥有的单元格数量(输入1,然后2,然后3,然后拖到底部)。

column flip vertivally

现在选择并突出显示新列,然后单击降序排序按钮,选择扩展选择并选择您想要翻转的列。

sortDescendingButton

extendSelectionScreenShot

FinalOutcomeFlippedColumn

现在它已经翻转了。删除另一列,将您的新列粘贴到需要的位置。


0
2021年更好的解决方案是INDEX函数。
=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 |

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接