BITTE helfen Sie uns HEUTE mit einer SPENDE
Helfen Sie das LibreOffice Forum zu erhalten!

❤️ DANKE >><< DANKE ❤️

> KEINE WERBUNG FÜR REGISTRIERTE BENUTZER!<
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

[GELÖST] Suchen - finden und Zell-Adresse auslesen

Alles zur Programmierung im LibreOffice.
Ich Bins
Beiträge: 236
Registriert: Do 2. Aug 2018, 12:30

[GELÖST] Suchen - finden und Zell-Adresse auslesen

Beitrag von Ich Bins » Fr 3. Dez 2021, 17:09

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
Zuletzt geändert von Ich Bins am Fr 17. Dez 2021, 10:50, insgesamt 3-mal geändert.

Benutzeravatar
karolus
Beiträge: 2170
Registriert: Fr 10. Dez 2010, 10:01

Re: Suchen - finden und Zell-Adresse auslesen

Beitrag von karolus » Sa 4. Dez 2021, 08:54

Dein Code tut vor allem nicht das, was du behauptest!!
da sind zwei entscheidende Fehler.

Code: Alles auswählen

=INDEX(B1:Z1;VERGLEICH("x";B2:Z2;0))
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") ])
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.3.2 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

Ich Bins
Beiträge: 236
Registriert: Do 2. Aug 2018, 12:30

Re: Suchen - finden und Zell-Adresse auslesen

Beitrag von Ich Bins » Mo 6. Dez 2021, 11:56

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

Benutzeravatar
karolus
Beiträge: 2170
Registriert: Fr 10. Dez 2010, 10:01

Re: Suchen - finden und Zell-Adresse auslesen

Beitrag von karolus » Mo 6. Dez 2021, 13:00

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. :roll:
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
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.3.2 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

mikele
Beiträge: 1642
Registriert: Mo 1. Aug 2011, 20:51

Re: Suchen - finden und Zell-Adresse auslesen

Beitrag von mikele » Mo 6. Dez 2021, 17:27

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
Gruß,
mikele

Ich Bins
Beiträge: 236
Registriert: Do 2. Aug 2018, 12:30

Re: Suchen - finden und Zell-Adresse auslesen

Beitrag von Ich Bins » Mi 8. Dez 2021, 00:00

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.

Benutzeravatar
karolus
Beiträge: 2170
Registriert: Fr 10. Dez 2010, 10:01

Re: Suchen - finden und Zell-Adresse auslesen

Beitrag von karolus » Mi 8. Dez 2021, 08:05

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…
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.3.2 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

Benutzeravatar
karolus
Beiträge: 2170
Registriert: Fr 10. Dez 2010, 10:01

Re: Suchen - finden und Zell-Adresse auslesen

Beitrag von karolus » Mi 8. Dez 2021, 09:37

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

LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.3.2 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

Ich Bins
Beiträge: 236
Registriert: Do 2. Aug 2018, 12:30

Re: Suchen - finden und Zell-Adresse auslesen

Beitrag von Ich Bins » Fr 10. Dez 2021, 22:33

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

Ich Bins
Beiträge: 236
Registriert: Do 2. Aug 2018, 12:30

Re: Suchen - finden und Zell-Adresse auslesen

Beitrag von Ich Bins » Sa 11. Dez 2021, 00:33

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

An alle, die das LibreOffice-Forum nutzen:


Bitte beteiligen Sie sich mit 7 Euro pro Monat und helfen uns bei unserem Budget für das Jahr 2024.
Einfach per Kreditkarte oder PayPal.
Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet.

❤️ Vielen lieben Dank für Ihre Unterstützung ❤️

Antworten