我希望能够在LibreOffice Calc中选择两个单元格,然后按某种魔术键,结果交换两个单元格的内容。
我该怎么做?
我找到了Excel的这个解决方案,但它在LibreOffice中不起作用: https://superuser.com/questions/257516/swap-cell-contents-in-excel
由于 的Jesper。
答案 0 :(得分:0)
这可能不是一个简单的解决方案,但你可以写一个宏来读取所选单元格的值并切换它们。然后,您可以将宏链接到工作表上的按钮或您在LibreOffice工具栏中添加的按钮,如果您想将其重复用于多个文档。
这个答案可以帮助你做到这一点: LibreOffice Calc: Access a user selected range in a macro
答案 1 :(得分:0)
我认为答案是不正确的。如果从同一个工作表中调用宏作为函数,则无法从宏执行此操作,因为函数无法更改调用工作表中的任何单元格。
答案 2 :(得分:0)
我也找不到“魔术钥匙”。
但是作为解决方法,我所做的是通过点击最左边部分的行号来选择行,然后按 Alt + Ctrl , 然后将其移动/拖动到您要交换它的行的顶部或底部。它实际上只是复制了行,但是您可以从原始位置删除/删除该行。最终会像你交换它一样。
希望它有所帮助,只需评论任何问题或建议
答案 3 :(得分:0)
我意识到这个问题是在不久前发布的,但现在,至少从LibreOffice 4.2开始,你可以通过 Alt
+拖动来实现这个目标。我今天正在寻找这个解决方案,在看到@wolfQueen的回答之后,我尝试了随机键组合直到我发现它。
根据您的系统,这可能是一个约束操作。在我的操作系统和桌面环境(Ubuntu 16.04,XFCE)中, Alt
+拖动是一个窗口移动操作,所以我必须开始拖动单元格,然后按 {{1} } 以防止窗口管理器窃取节目。
希望这可以帮助任何有同样问题的人!
答案 4 :(得分:0)
您可以使用两个宏来交换单元格
信用:Mauricio
Sub swap_values()
doc = ThisComponent
sel = doc.CurrentSelection
If sel(0).ImplementationName = "ScCellObj" Then
c1 = sel(0)
c2 = sel(1)
Else
If sel(0).Columns.Count = 2 Then
c1 = sel(0).getCellByPosition(0,0)
c2 = sel(0).getCellByPosition(1,0)
Else
c1 = sel(0).getCellByPosition(0,0)
c2 = sel(0).getCellByPosition(0,1)
End If
End If
tmp = c1.String
c1.String = c2.String
c2.String = tmp
End Sub
我写了另一个宏,它使用了不同的方法。
信用Navshah
Sub Swap()
Dim selection as Object
selection = ThisComponent.getCurrentSelection()
cell1Address = ThisComponent.createInstance("com.sun.star.table.CellRangeAddressConversion")
cell2Address = ThisComponent.createInstance("com.sun.star.table.CellRangeAddressConversion")
cell1Address.Address = selection(0).getRangeAddress
cell2Address.Address = selection(1).getRangeAddress
cell1 = cell1Address.UserInterfaceRepresentation
cell2 = cell2Address.UserInterfaceRepresentation
REM if the cells are in contagious single range
If selection.supportsService("com.sun.star.sheet.SheetCellRange") Then
arr = Split(cell1, ":")
cell1 = arr(0)
cell2 = arr(1)
End If
REM // Get the cell references to write values
cellA = ThisComponent.Sheets(0).getCellRangebyName(cell1)
cellB = ThisComponent.Sheets(0).getCellRangebyName(cell2)
REM // Store CellA values temporarily in a string variable 't'
Dim t as String
t = cellA.String
cellA.String = cellB.String
cellB.String = t
End Sub
保存以上任何宏,然后为其分配快捷方式。
完整的帖子可以找到here