Hallo, ich möchte gerne eine for-each-Schleife in calc nutzen. In Excel kam ich mit folgender Vorgehensweise (natürlich mit leichten Veränderungen der Syntax) immer zum Ziel. Ist der Befehl for each in OoBasic noch nicht implementiert? Ich las da einen veralteten Beitrag auf einer Webseite rund um Oo.
Ausgangssituation:
Die Zeilen A12:A16 enthalten Werte. Nun möchte ich rein zu Testzwecken, dass jede Zelle, welche den Wert 5 enthält, eine bestimmte Hintergrundfarbe erhält. Dazu nutze ich folgenden Code:
sub schleife
dim sheet as object
sheet = thisComponent.sheets(0)
dim oRange as object
oRange = sheet.getCellRangeByName("A12:A16")
dim cell
For Each cell in oRange
if cell.value = 5 then
cell.CellbackColor = rgb(172,255,47)
end if
next cell
end sub
Leider spuckt mir Oo immer den Hinweis aus, dass sich die Datentypen wohl nicht vertragen. Was mache ich falsch? Bin für jeden Hinweis sehr dankbar.
mir ist bewusst, dass ich dies auch mit der bedingten Formatierung lösen kann. Ich bin gerade aber dabei von excel vba auf Oo basic umzuschwenken und daher möchte ich natürlich alles testen, was möglich ist. Ich danke Dir für Deinen Tipp und werde diesen umgehend ausprobieren. Gibt es in Oo keine for each Schleife?
edit:
Habe es auch ohne for each hinbekommen. Ich hatte nämlich noch das Problem, dass ich mehrere Spalten auf diese Weise formatieren möchte. Sicherlich könnte man den von Dir genannten code mehrmals untereinander ausführen lassen, was aber bei 100 Spalten mühsam wäre und den code aufplustern würde. Habe es jetzt so gelöst.
dim cell as object
do until counter = 15
for i = 11 to 15
cell = sheet.getcellbyposition(counter, i )
if cell.value = 5 then
cell.CellbackColor = rgb(172,255,47)
end if
next i
counter = counter + 1
loop
Option VBASupport 1
Sub Schleife()
Dim Zelle As Range
For Each Zelle in Sheets(1).Range("A12:A16")
With Zelle
If .Value = 5 then
.Interior.Color = RGB(172,255,47)
Else
.Interior.ColorIndex = xlNone
End If
End With
Next
End Sub
Gruß, René
Windows 7 Home Premium (auf Acer Desktop PC)
Windows 8 Professional (auf Microsoft Surface Pro 3).
MSO 365 Home Premium
LibreOffice 4.2.
F-Secure Internet Security
Das Problem im vorliegenden Fall ist aber, dass die CellRange keine simple Auflistung von Zellen enthält.
Man kann sich also nicht pro Schleifendurchlauf einfach eine Zelle zurückgeben lassen.
Ein mögliches Anwendungsbeispiel für eine for-each Schleife:
Alle Zellen in einem Bereich blau färben, wenn sie das Wort "Hallo" enthalten.
oDoc = thisComponent
oSheet = oDoc.Sheets(0)
oRange = oSheet.getCellRangeByName("A1:A16")
oSearchDesc = Sheet.createSearchDescriptor
oSearchDesc.SearchString = "Hallo"
oSearchDesc.searchWords = True
oResult = oRange.findAll(oSearchDesc)
If NOT isNull(oResult) Then
For Each cellRange in oResult
cellRange.CellBackColor = RGB(0,0,255)
Next cellRange
End If