[gelöst]Suche nur über eine bestimmte Spalte
Moderator: Moderatoren
[gelöst]Suche nur über eine bestimmte Spalte
Hallo erstmal
Als Frischling in Sachen ooo Basic stellt sich mir gerade ein Problem, für das ich auch nach längerer Suche keine Antwort gefunden haben.
Es geht um folgendes: Auf einem Tabellenblatt wird eine (bzw. mehrere) CAS-Nummern eingegeben, und auf Basis dieser die Tabelle per Makro aus verschiedenen anderen Tabellen ergänzt.
Das Problem dabei ist, dass diese Tabellen einen riesigen Haufen zusätzlicher Informationen beinhalten.
Die Spalte, in der die CAS-Nummer steht, ist bei allen Tabellenblättern bekannt, jedoch finde ich keine Möglichkeit, nur diese Spalte auch tatsächlich zu durchsuchen.
Zuerst bin ich das Ganze mit einer einfachen FOR-Schleife über die relevanten Spalten angegangen, aber das hat unerträglich lange gedauert.
Nun bin ich zum SearchDescriptor übergegangen, das klappt soweit auch ganz gut und vor allem deutlich schneller als mit der Schleife.
Dennoch kann man dem ganzen Vorgang noch ganz gemütlich zuschauen, weil andere Spalten mit für die Suche irrelevanten Daten und ewig langen Texten vollgestopft sind, aber trotzdem in die Suche miteinbezogen werden.
Daher meine Frage:
Kann man dem SearchDescriptor irgendwie mitgeben, dass er nur in einer Spalte zu suchen braucht?
XRay und Suche haben nichts (für mich) verwertbares ergeben, aber das heisst ja noch lange nicht, dass es nicht geht.
Sollte dem nicht so sein: gibt es möglichereweise andere Herangehensweisen / Ideen?
Danke im Voraus
Als Frischling in Sachen ooo Basic stellt sich mir gerade ein Problem, für das ich auch nach längerer Suche keine Antwort gefunden haben.
Es geht um folgendes: Auf einem Tabellenblatt wird eine (bzw. mehrere) CAS-Nummern eingegeben, und auf Basis dieser die Tabelle per Makro aus verschiedenen anderen Tabellen ergänzt.
Das Problem dabei ist, dass diese Tabellen einen riesigen Haufen zusätzlicher Informationen beinhalten.
Die Spalte, in der die CAS-Nummer steht, ist bei allen Tabellenblättern bekannt, jedoch finde ich keine Möglichkeit, nur diese Spalte auch tatsächlich zu durchsuchen.
Zuerst bin ich das Ganze mit einer einfachen FOR-Schleife über die relevanten Spalten angegangen, aber das hat unerträglich lange gedauert.
Nun bin ich zum SearchDescriptor übergegangen, das klappt soweit auch ganz gut und vor allem deutlich schneller als mit der Schleife.
Dennoch kann man dem ganzen Vorgang noch ganz gemütlich zuschauen, weil andere Spalten mit für die Suche irrelevanten Daten und ewig langen Texten vollgestopft sind, aber trotzdem in die Suche miteinbezogen werden.
Daher meine Frage:
Kann man dem SearchDescriptor irgendwie mitgeben, dass er nur in einer Spalte zu suchen braucht?
XRay und Suche haben nichts (für mich) verwertbares ergeben, aber das heisst ja noch lange nicht, dass es nicht geht.
Sollte dem nicht so sein: gibt es möglichereweise andere Herangehensweisen / Ideen?
Danke im Voraus
Zuletzt geändert von DPunch am Mi, 04.11.2009 12:09, insgesamt 1-mal geändert.
- komma4
- ********
- Beiträge: 5332
- Registriert: Mi, 03.05.2006 23:29
- Wohnort: Chon Buri Thailand Asia
- Kontaktdaten:
Re: Suche nur über eine bestimmte Spalte
Willkommen im Forum.
Du kannst den SearchDescriptor auch auf einen Zellbereich anwenden.
Code-Beispiel: durchsucht Spalte A
Hilft Dir das?
P.S.: Ergänzen der Informationen - warum nicht per Formel (SVERWEIS)?
Du kannst den SearchDescriptor auch auf einen Zellbereich anwenden.
Code-Beispiel: durchsucht Spalte A
Code: Alles auswählen
oBlatt = ThisComponent.Sheets().getByName( "Statistik" )
oBereich = oBlatt.getCellRangeByPosition( 0, 0, 0, 100 )
oSuchBeschr = oBereich.createSearchDescriptor()
Hilft Dir das?
P.S.: Ergänzen der Informationen - warum nicht per Formel (SVERWEIS)?
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Re: Suche nur über eine bestimmte Spalte
Ich kann es leider nicht direkt ausprobieren, aber die Möglichkeit, einen bestimmten Zellbereich anzugeben ist ja genau das, wonach ich gesucht habe.
Vielen Dank dafür
(genaueres Feedback dann, wenn ich morgen wieder an der Arbeit bin)
SVerweis wäre theoretisch auch eine Möglichkeit, allerdings müssen die Informationen nach einigen Kriterien gefiltert, formatiert und angepasst werden, dafür schien mir ein Makro Alles in Allem sinnvoller.
Abgesehen davon bin ich im Moment für jede Erfahrung mit OOo Basic und jeden Codeschnipsel dankbar, werde mich nämlich für die nächsten 4 Monate fast ausschliesslich mit diesem Thema beschäftigen "müssen".
Gut möglich also, dass ich noch öfter mit mehr oder weniger intelligenten Fragen hier auftauche
Vielen Dank dafür

SVerweis wäre theoretisch auch eine Möglichkeit, allerdings müssen die Informationen nach einigen Kriterien gefiltert, formatiert und angepasst werden, dafür schien mir ein Makro Alles in Allem sinnvoller.
Abgesehen davon bin ich im Moment für jede Erfahrung mit OOo Basic und jeden Codeschnipsel dankbar, werde mich nämlich für die nächsten 4 Monate fast ausschliesslich mit diesem Thema beschäftigen "müssen".
Gut möglich also, dass ich noch öfter mit mehr oder weniger intelligenten Fragen hier auftauche

- komma4
- ********
- Beiträge: 5332
- Registriert: Mi, 03.05.2006 23:29
- Wohnort: Chon Buri Thailand Asia
- Kontaktdaten:
Re: Suche nur über eine bestimmte Spalte
Mit Deinen Fragen bist Du hier gut aufgehoben
Die "Standards" der OOo Basic-Entwicklung kennst Du:
Xray
Andrew Pitonyaks Makro Dokument
Andrew Pitonyaks Datenbank Dokument
Und meine Erweiterung OOo BTL2 – Basic Text Liste, zum Aufbereiten / Ausdrucken des installierten Basic-Codes.

Die "Standards" der OOo Basic-Entwicklung kennst Du:
Xray
Andrew Pitonyaks Makro Dokument
Andrew Pitonyaks Datenbank Dokument
Und meine Erweiterung OOo BTL2 – Basic Text Liste, zum Aufbereiten / Ausdrucken des installierten Basic-Codes.
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Re: Suche nur über eine bestimmte Spalte
So, da ich jetzt Zeit zum Testen hatte, hier genaueres Feedback:
Funktioniert leider nicht
Der SearchDescriptor durchsucht immer noch das ganze Blatt, nicht nur die entsprechende Spalte.
Der obige SearchDescriptor hat Ergebnisse, egal ob der gesuchte String in Spalte 2 oder 13 steht.
Irgendwelche Lösungsansätze?
P.S.:
Ja, XRay kenne und habe ich natürlich, bei Andrews Dokumenten hatte ich leider schon einige Male das Problem, dass sie mir OOo direkt abgeschossen haben.
Bleibe da aber dran
Funktioniert leider nicht

Der SearchDescriptor durchsucht immer noch das ganze Blatt, nicht nur die entsprechende Spalte.
Code: Alles auswählen
oListA = oDoc.Sheets.getByName("liste 4a")
oCellCursor = oListA.createCursor
nLastRowA = oCellCursor.getRangeAddress().endRow
oSearchDesc = oListA.getCellRangeByPosition(1,1,1,nLastRowA).createSearchDescriptor()
Irgendwelche Lösungsansätze?
P.S.:
Ja, XRay kenne und habe ich natürlich, bei Andrews Dokumenten hatte ich leider schon einige Male das Problem, dass sie mir OOo direkt abgeschossen haben.
Bleibe da aber dran

- komma4
- ********
- Beiträge: 5332
- Registriert: Mi, 03.05.2006 23:29
- Wohnort: Chon Buri Thailand Asia
- Kontaktdaten:
Re: Suche nur über eine bestimmte Spalte
Mit dem geposteten Codeausschnitt hast Du noch gar keine Treffer, erst wenn Du auf den Bereich die Suche auch ausführst kommen Ergebnisse:DPunch hat geschrieben:Der obige SearchDescriptor hat Ergebnisse, egal ob der gesuchte String in Spalte 2 oder 13 steht.
Testdaten in Spalte C
Code: Alles auswählen
sSuchbegriff = "Egon"
With oSearchDesc
.SearchRegularExpression = FALSE
.SearchCaseSensitive = TRUE
.SearchString = sSuchbegriff
End With
oGefunden = oListA.getCellRangeByPosition(2,2,2,nLastRowA).findFirst( oSearchDesc )
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Re: Suche nur über eine bestimmte Spalte
Ohje, hab den Fehler gefunden.
So weit alles in Ordnung, das Problem war, dass ich in der späteren Schleife dann allerdings immer noch
stehen hatte.
Problem erkannt und behoben, funktioniert wunderbar, vielen Dank für Deine Hilfe und entschuldige, dass ich für einen Moment an Deiner Lösung gezweifelt hatte
Code: Alles auswählen
oSearchArea = oListA.getCellRangeByPosition(1,1,1,nLastRowA)
oSearchDesc = oSearchArea.createSearchDescriptor()
Code: Alles auswählen
oResult = oListA.FindFirst(oSearchDesc)
Problem erkannt und behoben, funktioniert wunderbar, vielen Dank für Deine Hilfe und entschuldige, dass ich für einen Moment an Deiner Lösung gezweifelt hatte

Re: [gelöst]Suche nur über eine bestimmte Spalte
Hallo mal wieder
Aufgrund des obigen Falles stellt sich mir gerade eine Frage in Bezug auf den SearchDescriptor:
Macht es einen Unterschied, von welchem Objekt aus er erzeugt wird?
Aus der api.openoffice.org:
Es ist also (bezüglich des Resultates) völlig egal, ob ich den SearchDescriptor mit
thiscomponent.Sheets().getByIndex(1).createSearchDescriptor()
oder
thiscomponent.Sheets().getByIndex(99).createSearchDescriptor()
initialisiere, ich kann damit alle Blätter des (Calc-)Dokumentes durchsuchen.
Gibt es da einen versteckten Haken, z.B. bezüglich Geschwindigkeit, Fehleranfälligkeit o.Ä. - oder kann ich getrost einen einzigen SearchDescriptor für verschiedene Suchen auf verschiedenen Blättern verwenden?
Aufgrund des obigen Falles stellt sich mir gerade eine Frage in Bezug auf den SearchDescriptor:
Macht es einen Unterschied, von welchem Objekt aus er erzeugt wird?
Aus der api.openoffice.org:
Der Container wird ja allerdings erst mit dem Aufrufen der FindFirst-Methode festgelegt.describes what and how to search within a container
Es ist also (bezüglich des Resultates) völlig egal, ob ich den SearchDescriptor mit
thiscomponent.Sheets().getByIndex(1).createSearchDescriptor()
oder
thiscomponent.Sheets().getByIndex(99).createSearchDescriptor()
initialisiere, ich kann damit alle Blätter des (Calc-)Dokumentes durchsuchen.
Gibt es da einen versteckten Haken, z.B. bezüglich Geschwindigkeit, Fehleranfälligkeit o.Ä. - oder kann ich getrost einen einzigen SearchDescriptor für verschiedene Suchen auf verschiedenen Blättern verwenden?