Seite 1 von 2
[GELÖST] Suchen - finden und Zell-Adresse auslesen
Verfasst: Fr 3. Dez 2021, 17:09
von Ich Bins
Hallo zusammen,
im Zeilenbereich B2:AA2 möchte ich das Zeichen x finden und den String über der Zelle mit dem x auslesen.
Beispiel: Das x befindet sich in Zelle F2, dann benötige ich den Sting aus Zelle F1.
Mit nachfolgendem Code ist mir das gelungen.
Code: Alles auswählen
Sub SuchenFinden
oDoc = ThisComponent.Sheets
oMySheet = oDoc.getByName("MeinArbeitsblatt")
oRange = oMySheet.getCellRangeByName("B2:AA2")
oSearchDesc = oRange.createSearchDescriptor()
oSearchDesc.SearchString = "x"
oFound = oMySheet.findFirst(oSearchDesc)
oFlagAddress = oFound.CellAddress
oMyCell = oMySheet.getCellByPosition(oFlagAddress.Row,oFlagAddress.Column-1)
oMyString = oMyCell.string
MsgBox oMyString
End Sub
Kann man oMyCell (5,0 oder F1) auch weniger umständlich ermitteln?
Viele Grüße
Ich Bins
Re: Suchen - finden und Zell-Adresse auslesen
Verfasst: Sa 4. Dez 2021, 08:54
von karolus
Dein Code tut vor allem
nicht das, was du behauptest!!
da sind zwei entscheidende Fehler.
jetzt kopier ich ach noch aus Versehen eine mögliche Pythonlösung:
Code: Alles auswählen
def find_the_x(*_):
doc = XSCRIPTCONTEXT.getDocument()
sheet = doc.Sheets.Tabelle1
search_range = sheet["B2:AA2"].DataArray[0]
result_range = sheet["B1:AA1"].DataArray[0]
print(result_range[ search_range.index("x") ])
Re: Suchen - finden und Zell-Adresse auslesen
Verfasst: Mo 6. Dez 2021, 11:56
von Ich Bins
Hallo karolus,
Vielen Dank für den Hinweis :
karolus hat geschrieben: ↑Sa 4. Dez 2021, 08:54
Dein Code tut vor allem nicht das, was du behauptest!!
Du hast recht!
Row und Column sind in (oFlagAddress.
Row,oFlagAddress.
Column-1)
vertauscht und damit habe ich mir mal wieder selbst "ein Bein gestellt".
Getestet habe ich es mit einem
x in Zelle B2 und B2 =
1,1 und -1 lieferte zufällig den richtigen Zellinhalt.
Allerdings beschränkt sich die Suche nach der Korrektur
Code: Alles auswählen
oMyCell = oMySheet.getCellByPosition(oFlagAddress.[b]Column[/b],oFlagAddress.[b]Row[/b]-1)
wie ich jetzt feststellen musste nicht auf den Bereich B2:AA2 und findet
x auch außerhalb des Bereiches im Arbeitsblatt???
Deine Formel
karolus hat geschrieben: ↑Sa 4. Dez 2021, 08:54
=INDEX(B1:Z1;VERGLEICH("x";B2:Z2;0))
liefert das richtige Ergebnis, wenn ich sie in einer Zelle ausführe.
Wie man das mit Basic realisiert ist mir ein Rätsel.
Nach Deinem Python-Beispiel versuchte ich über WE zu ergründen wie man Python mit LibreOffice "verheiratet".
Ich konnte dabei auch einiges aus Deiner "Feder" für die Linux-Umgebung entdecken. Für Windows aber so gut wie nichts. Mit den wenigen Informationen für eine Windows-Umgebung wagte ich mich nicht an die Umsetzung.
Viele Grüße
Ich Bins
Re: Suchen - finden und Zell-Adresse auslesen
Verfasst: Mo 6. Dez 2021, 13:00
von karolus
wie ich jetzt feststellen musste nicht auf den Bereich B2:AA2 und findet x auch außerhalb des Bereiches im Arbeitsblatt???
Genau, deshalb schrieb ich ja
zweiFehler
vielleicht hilfts ja wenn du hinter
oh_my_found das
Oh_My_Sheet gegen die Apfelsine tauscht.
wie man Python mit LibreOffice "verheiratet".
Die sind bereits verheiratet, aber die Ehe wird wohl noch auf die nächsten 20 Jahre stark belastet, von der unsäglichen Schwiegermutter namens
BASICa
Re: Suchen - finden und Zell-Adresse auslesen
Verfasst: Mo 6. Dez 2021, 17:27
von mikele
Hallo,
leider liefert Basic nicht so schöne Array-Methoden mit, aber mit einer Schleife lässt es sich machen
Code: Alles auswählen
Sub Main
oDoc = ThisComponent
oSheet = oDoc.Sheets.getByName("Tabelle1")
aDaten = oSheet.getCellRangeByName("B1:AA2").getDataArray
oMyString=""
for i=0 to ubound(aDaten(1))
if aDaten(1)(i)="x" then oMyString=aDaten(0)(i)
next
msgbox oMyString
End Sub
Re: Suchen - finden und Zell-Adresse auslesen
Verfasst: Mi 8. Dez 2021, 00:00
von Ich Bins
karolus hat geschrieben: ↑Mo 6. Dez 2021, 13:00
gegen die Apfelsine tauscht.
Es dauerte einen Moment

bis ich die Apfelsine zuordnen konnte.
Nach der Korrektur war ich auch andere Ungereimtheiten los.
In nachfolgendem Code erhalte ich in der zweiten Do While Schleife bei der Zeile
oMyTable = oMyCell.string
den
Fehler
Kein Zugriff auf Objekt.
Falsche Verwendung eines Objekts.
Code: Alles auswählen
REM ***** BASIC *****
Option Explicit
global oSheets, oMyTable, oMyCell, oMySheet
Sub SuchenFinden
Dim oRange, oSearchDesc, oFound, oFlagAddress, oMyString, oProbe, oCell, oRow, oColumn
oSheets = ThisComponent.Sheets
oMySheet = oSheets.getByName("MeinArbeitsblatt")
oRange = oMySheet.getCellRangeByName("B2:AE2")
oSearchDesc = oRange.createSearchDescriptor()
oSearchDesc.SearchString = "x"
oFound = oRange.findFirst(oSearchDesc)
Do While Not IsNull(oFound)
oFlagAddress = oFound.CellAddress
oMyCell = oMySheet.getCellByPosition(oFlagAddress.Column,oFlagAddress.Row-1)
oMyTable = oMyCell.string
Call mach_was
oFound = oRange.findNext(oFound, oSearchDesc)
Loop
oRange = oMySheet.getCellRangeByName("A3:AE3")
oSearchDesc = oRange.createSearchDescriptor()
oSearchDesc.SearchString = "x"
oFound = oRange.findFirst(oSearchDesc)
Do While Not IsNull(oFound)
oFlagAddress = oFound.CellAddress
oMyCell = oMySheet.getCellByPosition(oFlagAddress.Column,oFlagAddress.Row-2)
oProbe = oMyCell.string 'hier kann ich oMyCell.string an oProbe übergeben.
oMyTable = oMyCell.string 'HIER ERHALTE ICH DIE FEHLERMELDUNG
Call mach_was_anderes
oFound = oRange.findNext(oFound, oSearchDesc)
Loop
End Sub
Sub mach_was
'mach was damit
oMySheet = oSheets.getByName("MeinArbeitsblatt")
End Sub
In der ersten Do While Schleife suche ich in
MeinArbeitsblatt nach den x in Zeile 2 hole mir nacheinander die Namen der Arbeitblätter in Zeile 1 und bearbeite diese in der Sub
mach_was in Select Case Bereichen. Weil ich in der Sub
mach_was Informationen aus weiteren Arbeitsblättern benötige schreibe ich vor dem Ende der Subroutine noch
MeinArbeitsblatt in die Variable oMySheet. Die erste Do While Schleife funzt ohne Probleme. Wenn darin alle x der Zeile 2 abgearbeitet sind suche ich mit der zweiten Do While Schleife in
MeinArbeitsblatt nach den x in Zeile 3 suchen hole mir nacheinander die Namen des Arbeitblätter in Zeile 1 usw. usw.
So war es eigentlich gedacht, aber wegen der Fehlermeldung geht es in Schleife 2 nicht weiter.
Seltsamerweise kann ich eine Code-Zeile darüber oMyCell.string an die Variable oProbe übergeben, aber nicht mehr an die globale Variable oMyTable.
Re: Suchen - finden und Zell-Adresse auslesen
Verfasst: Mi 8. Dez 2021, 08:05
von karolus
Hallo
Lass das "global …" weg, du bist noch Lichtjahre davon entfernt das benutzen zu müssen.
Lass auch bitte endlich die Bescheuerten prefixe weg.
Warum benutzt du …findFirst() und …findNext() wo es doch auch die Methode …findAll gibt.
Setz das erstmal um und komm wieder mit lesbaren Code, ansonsten bin ich raus…
Re: Suchen - finden und Zell-Adresse auslesen
Verfasst: Mi 8. Dez 2021, 09:37
von karolus
Hallo
Du solltest das eher unkompliziert lösen wie es Mikele weiter oben im Thema schon skizziert hat.
Code: Alles auswählen
function machwas(document, sheetname)
print sheetname & " @ " & document.Title
'mach hier mehr draus'
end function
Sub Main
doc = ThisComponent
sheet = Doc.Sheets.getByName("Tabelle1")
daten = Sheet.getCellRangeByName("B1:AA2").getDataArray()
sheetnames = daten( 0 )
x_array = daten( 1 )
for i=0 to ubound(x_array)
if x_array( i ) = "x" then
machwas(doc, sheetnames( i ) )
end if
next
End Sub
Re: Suchen - finden und Zell-Adresse auslesen
Verfasst: Fr 10. Dez 2021, 22:33
von Ich Bins
Hallo karolus, hallo mikele,
vielen Dank für den unkomplizierten Lösungsansatz.
In meiner Calc-Datei befinden sich im günstigsten Fall 24 Arbeitsblätter die untereinander verknüpft sind. Im neuen Jahr fallen Arbeitsblätter weg und neue kommen dazu. Bisher habe ich das manuell durchgeführt und nun versuche ich viele von diesen Aktionen zu automatisieren.
Viele Grüße
Ich Bins
Re: Suchen - finden und Zell-Adresse auslesen
Verfasst: Sa 11. Dez 2021, 00:33
von Ich Bins
Die unkomplizierte Lösung verwende ich in einem Arbeitsblatt in dem ich mehrere Flag finden muss.
Weil ich in einigen der oben genannten Arbeitsblättern nur nach einem String suchen muss komme ich noch einmal zurück auf meinen ersten Beitrag. Mit dem Code unten erhalte ich aus oFound.CellAddress die Position Column 11 und Row 2 (11, 2). Ich brauche jedoch den Spaltenbuchstaben
L damit ich in der Zelle
L31 in der Formel =AUFRUNDEN(SUMME(INDEX($GTZ.$C:$GTZ.$C;VERGLEICH($
K$26;$GTZ.$A:$GTZ.$A;0)):INDEX($GTZ.$C:$GTZ.$C;VERGLEICH($
K$27;$GTZ.$A:$GTZ.$A;0)));0)
aus den beiden $K$26 je $L$26 machen kann.
Wie kann man aus oFound.CellAddress L3 gewinnen? Gibt es einen Übersetzer, der aus der Position (11,2) L3 macht?
Code: Alles auswählen
Sub SuchenFinden
oDoc = ThisComponent.Sheets
oMySheet = oDoc.getByName("Arbeitsblatt")
oRange = oMySheet.getCellRangeByName("B2:AA2")
oSearchDesc = oRange.createSearchDescriptor()
oSearchDesc.SearchString = "xyz"
oFound = oRange.findFirst(oSearchDesc)
oFlagAddress = oFound.CellAddress
oMyCell = oMySheet.getCellByPosition(oFlagAddress.Row,oFlagAddress.Column)
oMyString = oMyCell.string
MsgBox oMyString
End Sub