[OOoBasic+Calc] Über selektierte Zellen iterieren

22/02/2010 - 17:01 von Jens Lenge | Report spam
Hallo Welt,

mit viel Zusammensuchen und einigen Tipps habe ich mir zusammengesucht,
wie man zellenweise über die aktuelle Auswahl iteriert; also quasi das
OOoBasic-Gegenstück zu

' VBA:
'==Dim cell As Range
For Each cell In Selection
MachWasMitZelle cell
Next cell

Mein "OOoBasic-Äquivalent" ist nun im Vergleich derart unhandlich, dass
ich es nochmal zur Diskussion stelle - was làsst sich verbessern bzw.
ist das überhaupt der Weg, den man in OOo gehen sollte?

' OOoBasic:
'=Dim oSelection As Object
oSelection = ThisComponent.CurrentSelection
Dim i As Long, x As Long, y As Long

' A) Single cell selected
'-
If oSelection.supportsService("com.sun.star.sheet.SheetCell") Then
MachWasMitZelle(oSelection)

' B) Cell range selected
'
ElseIf oSelection.supportsService("com.sun.star.sheet.SheetCellRange") Then
For x = 0 To oSelection.RangeAddress.EndColumn _
- oSelection.RangeAddress.StartColumn
For y = 0 To oSelection.RangeAddress.EndRow _
- oSelection.RangeAddress.StartRow
MachWasMitZelle(oSelection.GetCellByPosition(x, y))
Next
Next

' C) Multiple cell ranges selected
'-
ElseIf oSelection.supportsService("com.sun.star.sheet.SheetCellRanges") Then
For i = 0 To oSelection.Count - 1
For x = 0 To oSelection.RangeAddresses(i).EndColumn _
- oSelection.RangeAddresses(i).StartColumn
For y = 0 To oSelection.RangeAddresses(i).EndRow _
- oSelection.RangeAddresses(i).StartRow
MachWasMitZelle(oSelection.GetByIndex(i).GetCellByPosition(x, y))
Next
Next
Next
End If
 

Lesen sie die antworten

#1 Peter Schleif
22/02/2010 - 20:15 | Warnen spam
Jens Lenge schrieb am 22.02.2010 17:01 Uhr:

Mein "OOoBasic-Äquivalent" ist nun im Vergleich derart unhandlich, dass
ich es nochmal zur Diskussion stelle - was làsst sich verbessern




Am Algorithmus IMHO wenig. Ein paar Dinge sind mir aufgefallen.

- Ein With-Block macht den Code etwas kürzer und spart oSelection.

- Statt "supportsService" könntest Du "ImplementationName" abfragen

- Du könntest die ganze Prozedur in einer Function kapseln,
die eine Collection aller Zellen zurück liefert. Das ermöglich
im Hauptprogramm zumindest einen For-Each-àhnlichen Aufruf

Peter


Function ForEachInSelection() As Collection
Dim i As Long, x As Long, y As Long
Dim oColl As New Collection

With ThisComponent.CurrentSelection

If .ImplementationName = "ScCellObj" Then
oColl.Add .GetCellByPosition(0, 0)

ElseIf .ImplementationName = "ScCellRangeObj" Then
For x = 0 To .RangeAddress.EndColumn _
- .RangeAddress.StartColumn
For y = 0 To .RangeAddress.EndRow _
- .RangeAddress.StartRow
oColl.Add .GetCellByPosition(x, y)
Next
Next

ElseIf .ImplementationName = "ScCellRangesObj" Then
For i = 0 To .Count - 1
For x = 0 To .RangeAddresses(i).EndColumn _
- .RangeAddresses(i).StartColumn
For y = 0 To .RangeAddresses(i).EndRow _
- .RangeAddresses(i).StartRow
oColl.Add .GetByIndex(i).GetCellByPosition(x, y)
Next
Next
Next
End If

End With

ForEachInSelection = oColl
End Function


Sub IterateSelection()
Dim i As Long, x As Long, y As Long

With ThisComponent.CurrentSelection

If .ImplementationName = "ScCellObj" Then
MachWasMitZelle .GetCellByPosition(0, 0)

ElseIf .ImplementationName = "ScCellRangeObj" Then
For x = 0 To .RangeAddress.EndColumn _
- .RangeAddress.StartColumn
For y = 0 To .RangeAddress.EndRow _
- .RangeAddress.StartRow
MachWasMitZelle .GetCellByPosition(x, y)
Next
Next

ElseIf .ImplementationName = "ScCellRangesObj" Then
For i = 0 To .Count - 1
For x = 0 To .RangeAddresses(i).EndColumn _
- .RangeAddresses(i).StartColumn
For y = 0 To .RangeAddresses(i).EndRow _
- .RangeAddresses(i).StartRow
MachWasMitZelle .GetByIndex(i).GetCellByPosition(x,y)
Next
Next
Next
End If

End With
End Sub

Ähnliche fragen