Suppose I have This This Cells:
And then for some reason I want to reverse the order of columns automatically to become something like This:
any help will be appreciated!
Suppose I have This This Cells:
And then for some reason I want to reverse the order of columns automatically to become something like This:
any help will be appreciated!
quick steps:
https://gr-plus.blogspot.com/2015/01/reverse-column-or-row-order-in-excel-or.html
So here is an approach using Libreoffice Basic and the 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
This first determines the last filled column in row 1. The column reversing process will then be done until that column.
For learning about Macros in Libreoffice start here: https://wiki.documentfoundation.org/Macros
In case anyone here wants to reverse the order of rows (instead of columns) ... I took the macro code posted by @Axel-Richter and edited it so it does just that:
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
Unfortunately the first answer does not work as it does not sort column by column but each column on its own.
You do not reverse the order of the columns but get the highest to lowest value of each column. Tried it just now. In old excel you could do a transpose trick but the same function is not available in libre office in 2021
A better solution in 2021 is the INDEX- function.
=INDEX($A$1:$NN$25;1+$A30;25-A$30)
It takes the defined range of data you have, in a locked grid with dollar signs and takes the first row minus a value from two lists in increasing numbers.
1,2,3...in rows and 1,2,3 in columns. Locking the column in one instance, or the row in the other instance does the trick. Below you see a index table example with the stackoverflow ASCII formatting.
| 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 |
Here's the method droid192 suggested, but with some useful pics. I had the same issue and my data had a column with 2100 entries. Doing that by hand was not going to happen.
First if you use a regular ascending or descending sort you actually sort the data not just flip it and using the right click paste-special and transpose option isn't quite right either.
So, make a copy of your column and paste it away from everything else. Next to that column create a numeric series from 1 to however many cells you have in your column (type 1 then 2 then 3 then drag all the way down.)
Now select and high-light the new column and click the sort in descending order button and choose expand selection and choose your column you want flipped.
Now its flipped. Remove the other column and past your new column where you need it.