I wrote some test code to see which was faster. I found the following:

Shorter version: 0.1337 system ticks per iteration
Longer version:  0.2431 system ticks per iteration

My understanding is that the Basic interpreter is not nearly as efficient as the API, so I guessed that I could make the longer version more efficient by reducing the number of statements and not assigning the address to a temporary variable. This brought the longer longer version down in time to 0.2228 system ticks per iteration. This is better, but still not as good as the first version.

Sub TestGetSpeed
  Dim nItCount As Integer
  Dim nMaxIt As Integer
  Dim lTick1 As Long
  Dim lTick2 As Long
  Dim oSheet
  Dim nRow As Integer
  Dim s As String


  Dim oCell
  Dim oCursor
  Dim aAddress

  nMaxIt = 10000
  oSheet = ThisComponent.getSheets().getByIndex(0)
  lTick1 = GetSystemTicks()
  For nItCount = 1 To nMaxIt
    oCursor = oSheet.createCursor
    oCursor.GotoEndOfUsedArea(False)
    nRow = oCursor.RangeAddress.EndRow
  Next
  lTick2 = GetSystemTicks()

  s = s & "Small version used " & (lTick2 - lTick1) & " ticks for " & _
          nMaxIt & " iterations " & CHR$(10) & _
          CStr((lTick2 - lTick1) / nMaxIt) & _
          " ticks per iteration" & CHR$(10)

  lTick1 = GetSystemTicks()
  For nItCount = 1 To nMaxIt
    oCell = oSheet.GetCellbyPosition( 0, 0 )
    oCursor = oSheet.createCursorByRange(oCell)
    oCursor.GotoEndOfUsedArea(False)
    nRow = oCursor.RangeAddress.EndColumn
  Next
  lTick2 = GetSystemTicks()



  s = s & "Large version used " & (lTick2 - lTick1) & " ticks for " & _
          nMaxIt & " iterations " & CHR$(10) & _
          CStr((lTick2 - lTick1) / nMaxIt) & _
          " ticks per iteration" & CHR$(10)


  MsgBox s, 0, "Run Time"
End Sub


On 09/07/2009 06:40 AM, Steffen Grund wrote:
I was just wondering: createCursor() creates a cursor containing the whole sheet, which could be slow when you have a big sheet.
Maybe this is a way to create the cursor with better performance.

Just an idea, Steffen

Andrew Douglas Pitonyak wrote:
Nice tip... I will change this in my document...

I have no idea why this is written as it is, but many of the snippets were created years ago with OOo 1.x, so, the issue may be that the author of that particular macro (probably me) was not properly efficient, or, that OOo did not support the methodology. In this case, I suspect the first.

On 08/30/2009 08:54 AM, Johnny Rosenberg wrote:
At page 142 in the macro manual by A. Pitonyak, there is a section
about how to do it, here's a function that returns the last column of
the used area:

Function getLastUsedColumn(oSheet as Object) as Integer
   Dim oCell As Object
   Dim oCursor As Object
   Dim aAddress As Variant
   oCell = oSheet.GetCellbyPosition( 0, 0 )
   oCursor = oSheet.createCursorByRange(oCell)
   oCursor.GotoEndOfUsedArea(True)
   aAddress = oCursor.RangeAddress
   GetLastUsedColumn = aAddress.EndColumn
End Function

I am wondering about the oCell thing. Why is that necessary? I tried
the following and it seems to work:

Function getLastUsedColumn(oSheet as Object) as Integer
   Dim oCursor As Object
   Dim aAddress As Variant
   oCursor = oSheet.createCursor
   oCursor.GotoEndOfUsedArea(True)
   aAddress = oCursor.RangeAddress
   GetLastUsedColumn = aAddress.EndColumn
End Function

Or even shorter, and still works and just as easy to follow (in my opinion):

Function getLastUsedColumn(oSheet as Object) as Integer
   Dim oCursor As Object
   oCursor = oSheet.createCursor
   oCursor.GotoEndOfUsedArea(True)
   GetLastUsedColumn = oCursor.RangeAddress.EndColumn
End Function

Johnny Rosenberg

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]


--
Andrew Pitonyak
My Macro Document: http://www.pitonyak.org/AndrewMacro.odt
My Book: http://www.hentzenwerke.com/catalog/oome.htm
Info:  http://www.pitonyak.org/oo.php
See Also: http://documentation.openoffice.org/HOW_TO/index.html


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to