OO-Snippets: erase-create_range_name

Commons

Keywordsmacro, named range, delete/create named range, last used row, cell containing last balance, erase named range, create named range
LanguageOOBasic
ApplicationCalc
AuthorsEnnio-Sr (initial)
Andrew Douglas Pitonyak
Marc Santhoff
Sasa Kelesevic
Supported Versions1.1.4  1.9.82 beta  
Supported OSLinux  
QuestionReassign named range to a cell in last used row

How to determine last row used and set a named range for a cell in that row

GregChi <geardoc36@snet.net>; asked a similar question on users@openoffice.org

and received workarounds more than a direct answer. I had a similar problem and after

reading Andrew Pitonyak's "Useful Macro Information for OOo" and asking a few questions

on dev@api.openoffice.org, wrote a macro which does the job. It considers col. F as the one

containing a formula to determine current account balance (i.e. previous balance , plus credit,

minus debit). Col. headings (A to F) are: Date, Value_date, Description, Debit, Credit, Balance).

Once you have copy pasted the code in your Calc file, you can well assign the macro

(_0_create_last_bal) to the Event/Opening of document so that it is run when the file

is opened. A second macro (create_last_bal) mentioned in the dialog box, does the same

as it just calls the previous one.

Answer

Code-Snippet-Listing (snippet-source)

sub _0_create_last_bal
' ----------------------------
'  On error exit
On Error goto Label

' define variables
Dim oDoc As Object    ' The spreadsheet we are working on
Dim oSheet As Object  ' The sheet (usually first one)
Dim oCell As Object   ' The particular cell we select
Dim oRange            ' The created range
Dim oRanges           '  All named ranges
Dim sName$            ' Name of the named range to create
msg$ = "I' m ready to accept new records: for each new one copy formula " +_
    "in last balance cell (or run macro 'create_new_rec')."

oDoc=ThisComponent
ocell=ThisComponent.CurrentSelection
oRanges = ThisComponent.NamedRanges
sName$="last_bal"

' Here we verify whether there is already a range with that name and,
' in the affirmative, erase it so that the new one can be created:
If oRanges.hasByName(sName$) Then
   oRanges.getByName(sName$)
   oRanges.removeByName(sName$)
End If

' We go to the last cell on the desired column
odoc   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
Dim args1(0) as new com.sun.star.beans.PropertyValue
' We save the file to make sure what is displayed is read correctly
' SEEMS NOT NECESSARY dispatcher.executeDispatch(oDoc, ".uno:Save", "", 0, array())
args1(0).Name = "ToPoint"
args1(0).Value = "$F$6"
dispatcher.executeDispatch(oDoc, ".uno:GoToCell", "", 0, args1())
dispatcher.executeDispatch(oDoc, ".uno:GoDownToEndOfData", "", 0, args1())

' and check whether its value is zero
ocell=ThisComponent.CurrentSelection ' gets value of new current cell
vlc = oCell.getValue()    ' get value of selected cell (last cell)
if vlc = 0 then
   dispatcher.executeDispatch(oDoc, ".uno:Cut", "", 0, args1())
   dispatcher.executeDispatch(oDoc, ".uno:GoUp", "", 0, args1())
   ' we determine the row number of the selected cell: 
   ' numbering starts from 0, so we need add 1:
   r$ = oCell.CellAddress.row+1
   xcl$ = "Sheet1.$F$"+r$                            ' ref to col F may be changed
else
   ' This is a special case, so we need add 2
   r$ = oCell.CellAddress.row+2
   xcl$ = "Sheet1.$F$"+r$                            ' ref to col F may be changed
End if

' we set our named range name:
Dim oCellAddress As new com.sun.star.table.CellAddress
oCellAddress.Sheet = 0       ' The first sheet
oRanges.addNewByName(sName$,xcl$,oCellAddress,0)    

' We arrange for copying the formula from last used row to the next one
dispatcher.executeDispatch(oDoc, ".uno:Copy", "", 0, Args1())
Dim args2(1) as new com.sun.star.beans.PropertyValue
args2(0).Name = "By"
args2(0).Value = 1
args2(1).Name = "Sel"
args2(1).Value = false
dispatcher.executeDispatch(oDoc, ".uno:GoDown", "", 0, args2())
dispatcher.executeDispatch(oDoc, ".uno:Paste", "", 0, Args2())
dispatcher.executeDispatch(oDoc, ".uno:GoToStartOfRow", "", 0, args2())
Print msg$
Exit sub

Label:
    print "Error!"
Exit Sub

End Sub

Rem ###################################################################

Sub create_new_rec
'  we call the previous macro:
sub _0_create_last_bal
End Sub   

' #####################################################################

Changelog

DateUserModification
2005-06-24ennio_srVersion 2.0 I discovered some flaws in the initial version (on some circumstances "last_bal" was created on the last but one row). So it was necessary to re-write the code. The file structure is very simple (as said above). You can put this formula in cell F6: =IF(ISBLANK(B6);0;F5-D6+E6).

and