宏可使 LibreOffice Calc 中选定行下的 3 行保持可见

宏可使 LibreOffice Calc 中选定行下的 3 行保持可见

在 Calc 或 MS Excel 中,当完成一行单元格的编辑后,按 Enter 键将转到下面的下一行。继续这样做,最终您将到达屏幕上可见的最后一行。在这里,当您按 Enter 键时,它将转到下一行,但现在它是最后一行。在 Nreal Air 眼镜等屏幕上很难看清最后一行(因为底部总是模糊的)。我的解决方案是将当前选定的行保持在中间。这意味着每当按下 Enter 键时,宏都会检查新选定行下有多少行可见。如果小于 3,可见行将向上移动(因此将选定行保持在中间)。下列的答案解决了 MS Excel 中的这个确切问题。我想在 LibreOffice Calc 中做同样的事情。但是,到目前为止,我还没有成功编写一个宏来检查所选行下的可见行,并在每次按 Enter 时添加一个新行(因此将下一个选定行保持在屏幕中间)。有人知道如何在 Calc 中做到这一点吗?

答案1

你的任务并不难实现——事实上,你只需要使用.setFirstVisibleRow() 方法根据“当前行”和“最后可见行”的值来更改显示区域。例如,此宏可以执行以下操作:

Sub onSelectionChanged(Optional oEvent As Variant)
Dim oCurrentController As Variant
Dim arrayOfString() As String, tmpString As String
Dim aVisibleRange As New com.sun.star.table.CellRangeAddress
Dim nSheet As Integer,  nStartRow As Long,  nEndRow As Long, nCurrentRow As Long
    oCurrentController = ThisComponent.getCurrentController()
    aVisibleRange = oCurrentController.getVisibleRange()
    nSheet = aVisibleRange.Sheet
    nStartRow = aVisibleRange.StartRow
    nEndRow = aVisibleRange.EndRow
    arrayOfString = Split(oCurrentController.getViewData(), ";")
    If UBound(arrayOfString) < (3 + nSheet) Then Exit Sub
    tmpString = arrayOfString(3 + nSheet)
    If InStr(tmpString,"+") > 0 Then
        arrayOfString() = Split(tmpString, "+")
    Else
        arrayOfString() = Split(tmpString, "/")
    EndIf
    nCurrentRow = CLng(arrayOfString(1))
    If nEndRow - nCurrentRow < 4 Then  oCurrentController.setFirstVisibleRow(nStartRow + nCurrentRow - nEndRow + 3)
End Sub

主要的困难在于选择如何运行这个宏。例如,您可以将此脚本指定为“选择已更改”事件的处理程序。

设置事件监听器

但在这种情况下,宏只对指定了宏的工作表起作用。(顺便说一句,您在问题中提到的 Excel 解决方案的工作原理完全相同 - 仅适用于指定的工作表)。

你可以想象某种通用宏,当你打开任何电子表格时,它会将此事件监听器分配给所有工作表,并且将其分配给整个办公套件

相关内容