将光标定位在包含今天日期的单元格上

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

现有电子表格,A 列包含一年的日期(不连续 - 意味着其中有空白行,而不是日期)。 在打开电子表格并且不执行任何操作时,我希望将光标定位在包含今天日期的 A 列中的单元格上。 这让我可以移动到该行的特定列来输入今天的数据。

我可以有条件地突出显示我希望输入数据的单元格,但似乎没有办法在没有手动干预的情况下将光标定位在该单元格上。

如上 - 我可以突出显示我希望光标出现的单元格,但我如何让 calc 自动为我进行定位。

libreoffice-calc
2个回答
0
投票

是的,光标定位(选择单元格)的任务是使用宏解决的。程序代码不会很复杂。您的任务包括三个步骤:

  1. 创建一个宏,它会尝试在 A 列中找到具有当前日期的行,并将光标移动到所需的单元格
  2. 确保代码能正确处理您的数据
  3. 教 Calc 在打开文档时运行宏。

您没有说要在电子表格的哪一张表中选择一个单元格。也许你只有一张纸。但是,我们将告诉宏要在其上执行操作的工作表的名称,例如“myData”。

你也没有指定光标应该放在哪一列。假设这是D列(这一列的编号是3)

宏代码可以是这样的:

Sub selectCellByDate(Optional oEvent As Variant)
Const DEFAULT_SHEET_NAME = "myData"
Const COLUMN_TO_SELECT = 3
Dim oSheets As Variant, oSheet As Variant, oRange As Variant, oCursor As Variant
Dim dDate As Long 
Dim oFA As Variant 
Dim rowOfToday As Variant
Rem Get all sheetsa of the current spreadsheet:
    oSheets = ThisComponent.getSheets()
    If Not oSheets.hasByName(DEFAULT_SHEET_NAME) Then
        MsgBox("The current spreadsheet does not contain a sheet named  " & DEFAULT_SHEET_NAME, 16, "Attention!")
        Exit Sub
    EndIf
Rem Get sheet by name:
    oSheet = oSheets.getByName(DEFAULT_SHEET_NAME)
Rem Find last used row in sheet:
    oCursor = oSheet.createCursor()
    oCursor.gotoEndOfUsedArea(True)
Rem Range from A1 to last used cell in column A:
    oRange = oSheet.getCellRangeByPosition(0, 0, 0, oCursor.getRangeAddress().EndRow)
Rem TODAY - we must store result of Date() to variable
Rem See https://help.libreoffice.org/latest/en-US/text/sbasic/shared/03030301.html
    dDate = Date()
Rem To call Calc function from code:
    oFA = createUnoService( "com.sun.star.sheet.FunctionAccess" )
Rem Try to search:
    rowOfToday = oFA.callFunction("MATCH",Array(dDate,oRange,0))
    If IsEmpty(rowOfToday) Then 
        MsgBox("Cell with today's date not found in range " & oRange.AbsoluteName, 16, "Attention!")
        Exit Sub
    EndIf
Rem Cell to enter new data:
    oRange = oSheet.getCellByPosition(COLUMN_TO_SELECT, rowOfToday - 1)
Rem Select cell:
    oCurrentController = ThisComponent.getCurrentController()
    oCurrentController.Select(oRange)
Rem ...and deselect cell:
    oCurrentController.Select(ThisComponent.createInstance("com.sun.star.sheet.SheetCellRanges"))
End Sub

希望代码中的备注能帮助大家理解这个子程序是干什么的,怎么做的

将代码放入电子表格中尝试运行

如果这对您来说有困难,那么请查看此页面 - 在Structuring部分,您将找到在文档中嵌入基本代码的必要说明

如果宏无法正常工作,请确保更改 DEFAULT_SHEET_NAME 常量中的工作表名称。此外,只有当 A 列包含实际日期而不是类似日期的文本字符串时,宏才会正常工作。检查 A 列的内容 - 按 CTRL+F8 并查看值显示的颜色:如果它们是黑色,那么这是文本,宏将不起作用 - 值应该是蓝色。

如果您遇到这样的问题,请不要担心 - 此页面包含有关如何解决此问题的详细说明。

最后一步。将宏设置为事件 Open Document - 这在文档中也有详细说明。例如这个页面 - 如何运行宏

评论中有更多问题后更新

  1. 是的,您可能会遇到类似的问题。我向你保证,两三个月后你就不会再把这些困难当成“问题”了。只需将包含您的文件的子目录添加到可信来源列表(您信任这个宏,不是吗?)
  2. 请将宏触发的事件从“打开文档”更改为“文档加载完成”(是的,我知道 - 我弄错了,抱歉)

Set Event Handler

还要注意底部的下拉列表 - 在这里您可以指定是否需要为任何打开的文档运行宏,或者只为指定的文档运行宏。


0
投票

也许宏可以帮助您解决这个问题?

有点像

cursor=ThisComponent.CurrentController.getViewCursor()
cursorPrevPos=cursor.Start
cursor.goToRange(cursorPrevPos, false)
© www.soinside.com 2019 - 2024. All rights reserved.