现有电子表格,A 列包含一年的日期(不连续 - 意味着其中有空白行,而不是日期)。 在打开电子表格并且不执行任何操作时,我希望将光标定位在包含今天日期的 A 列中的单元格上。 这让我可以移动到该行的特定列来输入今天的数据。
我可以有条件地突出显示我希望输入数据的单元格,但似乎没有办法在没有手动干预的情况下将光标定位在该单元格上。
如上 - 我可以突出显示我希望光标出现的单元格,但我如何让 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 - 这在文档中也有详细说明。例如这个页面 - 如何运行宏
评论中有更多问题后更新
还要注意底部的下拉列表 - 在这里您可以指定是否需要为任何打开的文档运行宏,或者只为指定的文档运行宏。
也许宏可以帮助您解决这个问题?
有点像
cursor=ThisComponent.CurrentController.getViewCursor()
cursorPrevPos=cursor.Start
cursor.goToRange(cursorPrevPos, false)