Seite 1 von 2

suchen spezial

Verfasst: Di, 10.03.2009 17:52
von clag
Hallo Leutz, Kenner und Könner,

ich möchte mit einer Tastenkombination in der gerade aktiven Spalte zu einer bestimmten bzw zur nächsten Zelle die einem Kriterium entspricht springen
eine solche Funktion gibt es leider nicht regulär, mit der "suchen und ersetzen" Funktion kan man sich einigemaßen behelfen ist aber noch ziemlich umständlich.

Meine Frage ist nun kann man per Basic die "suchen ersetzen Funktion" soweit verbiegen das ein Hotkey dabei raus kommt?

Meine Vorstellung wäre man ruft die s&e Funktion so auf, dass nur in der gerade fokusierten Spalte operiert wird,
nicht mit dem original Dialog sondern nur ein Feld in den man den Such string eingibt zB "^Tom" .* wird grundsätzlich angehängt
nach einem enter wird dann die nächste Zelle die mit "Tom" beginnt fokusiert und angezeigt.

ein weiterer Gedanke ist, der Suchstring sollte in einer Variablen gespeichert werden damit bei erneutem aufruf des Makro der String gleich wieder eingefügt wird
und man so bei einer unsortierten Spalte gleich die nächste Zelle suchen kann ohne den String erneut eingeben zu müssen.

wenn man nun das Makro auf eine Tastenkombination legt sollte man so recht schnell zum Ziel kommen

Das Problem ist ich bin nicht in der Lage die Idee in sinnigen Basic Code umzusetzen :(

ich hoffe ihr erbarmt euch meiner Basic-armen Seele und helft mir :D

schonmal Dank vorraus ........

Re: suchen spezial

Verfasst: Di, 10.03.2009 20:47
von turtle47
Hi Clag,
clag hat geschrieben:Das Problem ist ich bin nicht in der Lage die Idee in sinnigen Basic Code umzusetzen
Ich weis nicht ob der folgende Code sinnig ist aber vielleicht entspricht er in etwa Deinen Vorstellungen.

Code: Alles auswählen

Global RegSearch as variant
Sub Main
	myDoc = thisComponent
	If RegSearch <> "" then
	RegSearch1 = RegSearch
	end if
	RegSearch = InputBox("Suchbegriff eingeben", "Input Suchen", RegSearch1)
	oSelect=ThisComponent.CurrentSelection.getRangeAddress
	Start_Column=oSelect.StartColumn
	End_Column=oSelect.EndColumn
	Start_Row =oSelect.StartRow
	mySheet = ThisComponent.CurrentController.getActiveSheet()
	for i = Start_Row to 500 ' bis Zeile 501 suchen
	mycell = mysheet.getCellByPosition(Start_Column,i +1)	
	SearchDesc = mycell.createSearchDescriptor
	SearchDesc.SearchString = RegSearch
	SearchDesc.SearchCaseSensitive = True
	SearchDesc.SearchRegularExpression = True
	Found = mycell.findFirst(SearchDesc)
	Do While Not IsNull(Found)
	oTCurs = mycell.CreateTextCursorByRange(Found.getStart()) 
	oTCurs.gotoRange(Found.getEnd(), true) 
	myView = myDoc.CurrentController
	myView.Select(mycell)
	exit sub
	Loop
	Next i
End Sub
Viel Erfolg.

Jürgen

Re: suchen spezial

Verfasst: Mi, 11.03.2009 07:41
von clag
Hallo Jürgen,

erst einmal danke für deine "Action" :D

leider rührt sich hier bei mir die Markierung nicht von der Stelle wenn ich das Makro aufrufe,
egal was für einen Suchstring ich in die "InputBox" eingebe :(

was könnte da schief laufen ?


edit: habe gerade bemerkt, in einer Spalte mit Zahlen funktioniert es doch,
aber bei Text tut sich nix

Re: suchen spezial

Verfasst: Mi, 11.03.2009 08:08
von Charly
Hallo Clag!

Bei mir funktioniert das Makro einwandfrei. Meinen Dank dafür für Jürgen.

Ich habe sie in unsere Testdatei eingebaut. Leider merke ich gerade, dass ich sie vom Büro aus nicht mehr hochladen kann. Ein neuer Virenscanner verhindert das.



Gruß
Charly

Re: suchen spezial

Verfasst: Mi, 11.03.2009 08:28
von clag
Hallo Charly,

erst "Ahhh" :)
Charly hat geschrieben:Bei mir funktioniert das Makro einwandfrei. Meinen Dank dafür für Jürgen.
und dann doch "och nö" :(
Charly hat geschrieben:Ich habe sie in unsere Testdatei eingebaut. Leider merke ich gerade, dass ich sie vom Büro aus nicht mehr hochladen kann. Ein neuer Virenscanner verhindert das.
na da muss ich mich dann wohl bis Feierabend gedulden :D

Re: suchen spezial

Verfasst: Mi, 11.03.2009 09:34
von clag
Hallo,

jetzt hab ich erkannt wo das Problem liegt.... (zumindest teilweise zwischen meine Ohren) :lol:
nach dem ich das Makro in die "Testdatei" eingebaut habe funktioniert es auch hier.

da wo es nicht funktionierte war der Inhalt der Zelle das Ergebniss einer Formel,
aber auch da müsste es doch eigentlich funktionieren !?
jedenfalls die normale Suche tut es, wenn man suchen in Werten einstellt.

Re: suchen spezial

Verfasst: Mi, 11.03.2009 10:01
von Charly
Hallo Clag!

Ich werde dir heute abend die Datei hochladen. Vorher kannst du noch probieren, ob der Suchdescriptors zu fein eingestellt ist. Bei mir hat er nämlich auch nichts gesucht, wenn ich nach Großbuchstaben gesucht habe und in der Spalte waren nur Kleinbuchstaben.

setze folgenden Befehl:

Code: Alles auswählen

SearchDesc.SearchCaseSensitive = true
auf

Code: Alles auswählen

SearchDesc.SearchCaseSensitive = false
Ansonsten bis abend.

Gruss
Charly

Re: suchen spezial

Verfasst: Mi, 11.03.2009 10:11
von turtle47
Hallo Zusammen,

es scheint wiklich so, dass man die Suchoptionen extra noch einstellen muss.
Mit der Formel ist mir gestern nicht aufgefallen.

Ich habe jetzt leider keine Zeit mehr zum testen.
Xray zeigt mir folgende möglichen Suchoptionen an:

Code: Alles auswählen

SearchDesc.SearchBackwards
SearchDesc.SearchByRow
SearchDesc.SearchCaseSensitive
SearchDesc.SearchRegularExpression
SearchDesc.SearchSimilarity
SearchDesc.SearchSimilarityAdd
SearchDesc.SearchSimilarityExchange
SearchDesc.SearchSimilarityRelax
SearchDesc.SearchSimilarityRemove
SearchDesc.SearchString
SearchDesc.SearchStyles
SearchDesc.SearchType
SearchDesc.SearchWords
Jürgen

Re: suchen spezial

Verfasst: Do, 12.03.2009 08:55
von clag
Moin moin liebe Leutz,

ich habe noch so 2-.... Fragen zu dem Makro, die aus meinem Unwissen resultieren

sind RegSearch und RegSearch1 beides Variablen ?

könnte

Code: Alles auswählen

If RegSearch <> "" then
   RegSearch1 = RegSearch
   end if
nicht auch einfach

Code: Alles auswählen

RegSearch = RegSearch
sein

bzw könnte man nicht ganz darauf verzichtem, und gleich diese Zeile

Code: Alles auswählen

RegSearch = InputBox("Suchbegriff eingeben", "Input Suchen", RegSearch1)
in

Code: Alles auswählen

RegSearch = InputBox("Suchbegriff eingeben", "Input Suchen", RegSearch)
ändern

mein Gedanke dabei ist wenn das Makro erstmals aufgerufen wird ist "RegSearch" leer,
wird ein String in der InputBox eingegeben dann RegSearch mit "String" belegt
bis bei bei einem erneuten Makro aufruf ein neuerString eingegeben wird,
wenn nicht dann bleibt RegSearch unverändert ?

wenn das Makro im Angezeigten Bereich eine passende Zelle findet geht's fast ohne delay
aber wenn der nächste treffer ein paar Hundert Zellen weiter ist dauert es einige Sekunden
bis die Zeile/Zelle angezeigt wird

das

Code: Alles auswählen

for i = Start_Row to 500 ' bis Zeile 501 suchen
sieht irgendwie nach einer Schleife aus
aus meiner ExcelVB zeit kann ich mich entsinnen Schleifen machen Makros lahm
könnte man nicht einen Bereich bzw gleich die ganze Spalte benennen um die Schleife zu vermeiden?
auch weil die Tabelle in der ich das Makro anwenden will über 20.000 Zeilen hat
zZ habe ich die 500 erstmal durch 20.000 ersetz.


diese Xray liste von Turtle47 zeigt mögliche Optionen die an Search übergeben werden können ?
aber da seh ich nichts was der Einstellung in "Werten" oder "Formeln" suchen entsprechen könnte oder ?

ich hoffe, ich habe euch jetzt mit der Fragerei nicht vergrault
und könnt mein VerständnisDunkel etwas aufhellen :)

Re: suchen spezial

Verfasst: Do, 12.03.2009 09:52
von Charly
Hallo Clag!

Ich habe mal versucht, das Makro von Turtle zu verkürzen. Es scheint zu funktionieren. Aber teste du auch mal.

Code: Alles auswählen

Global RegSearch as variant
Sub Suche1()
       myDoc = thisComponent
       myView = myDoc.CurrentController
       mySheet = myView.ActiveSheet
       
       Cursor = mySheet.createCursor
       Cursor.goToEndOfUsedArea(0)
       Endzeile = Cursor.getRangeAddress().EndRow
       oSelect=ThisComponent.CurrentSelection.getRangeAddress
       StartSpalte=oSelect.StartColumn
       EndSpalte=oSelect.EndColumn
       StartZeile =oSelect.StartRow+1
       Bereich = mySheet.getCellRangeByPosition(Startspalte,Startzeile,Endspalte,Endzeile)
       
       RegSearch = InputBox("Suchbegriff eingeben", "Input Suchen", RegSearch)
       SearchDesc = Bereich.createSearchDescriptor
       SearchDesc.SearchString = RegSearch
       SearchDesc.SearchCaseSensitive = True
       SearchDesc.SearchRegularExpression = True
       Found = Bereich.findFirst(SearchDesc)
       
       myView.Select(found)
       
    End Sub
Für das Suchen in Formeln habe ich allerdings auch keine Lösung gefunden.

Gruß
Charly

Ich habe nachträglich noch die Globale Deklaration von RegSearch eingetragen und das +1 bei der EndSpalte entfernt.

Re: suchen spezial

Verfasst: Do, 12.03.2009 11:15
von clag
Hallo Leutz, Hallo Charly,

das Tuning hat sich gelohnt der komplette Durchgang: Suchstart in Z11 bis Treffer in Z20.000 unter 1 Sek !!

das ist Spitze !

einen Wunsch habe ich aber noch
zZ wird scheinbar von der aktuellen Zeile nur abwärts gesucht ?

kann man die Suche im Kreis laufen lassen, also wenn letzte Zeile ereicht ist sprung nach (oben)Z11 und weiter suchen ?
(ohne Treffer könnte das natürlich in eine endlos Schleife führen hm...)

also dann vielleicht noch so etwas dazu:

Suche>
BereichsEnde ereicht
sprung nach Oben Z11
auf "SprungFlag" prüfen:
wenn vorhaden: Meldung "keine Treffer", SprungFlag löschen, Makro beenden
Sonst "SprungFlag" setzen
weiter suchen
Treffer: Sprungflag löschen, TrefferZelle zeigen

oder so :D

Re: suchen spezial

Verfasst: Do, 12.03.2009 11:41
von Charly
Hallo Clag!

Teste mal das:

Code: Alles auswählen

 Sub Suche()
       Global RegSearch as variant
       myDoc = thisComponent
       myView = myDoc.CurrentController
       mySheet = myView.ActiveSheet
       
       Cursor = mySheet.createCursor
       Cursor.goToEndOfUsedArea(0)
       Endzeile = Cursor.getRangeAddress().EndRow
       oSelect=ThisComponent.CurrentSelection.getRangeAddress
       StartSpalte=oSelect.StartColumn
       EndSpalte=oSelect.EndColumn
       StartZeile =oSelect.StartRow+1
       Bereich = mySheet.getCellRangeByPosition(Startspalte,Startzeile,Endspalte,Endzeile)
       
       RegSearch = InputBox("Suchbegriff eingeben", "Input Suchen", RegSearch)
       
       For I= 1 to 2
       SearchDesc = Bereich.createSearchDescriptor
       SearchDesc.SearchString = RegSearch
       SearchDesc.SearchCaseSensitive = false
       SearchDesc.SearchRegularExpression = True
       Found = Bereich.findFirst(SearchDesc)
       
       If Not isnull(Found) then
       myView.Select(found)
       exit sub
       end if
       Bereich = mySheet.getCellRangeByPosition(Startspalte,11,Endspalte,Startzeile-1)
       next I
       MSGBOX ("Der Suchbegriff wurde nicht gefunden")
    End Sub
Gruß
Charly

Re: suchen spezial

Verfasst: Do, 12.03.2009 13:02
von clag
Hallo Charly,

jetzt läuft das Makro wunderbar "rund" oder im Kreis oder wie jetzt nun :D

allerdings ist da noch immer ein kleines Problem,
war vorher schon, aber ich hatte gehofft mit der Änderung würde es verschwinden, aber leider nicht

wenn der Treffer in der letzten Zeile des DatenBereich liegt
und man will dann das Makro erneute aufrufen, gibt es folgende Fehlermeldung

BASIC-Laufzeitfehler
Es ist eine Exception aufgetreten
Type: com.sun.starlang.IndexOutOfBondsException
Message: .


und diese CodeZeile wird mit dem Pfeil markiert

Code: Alles auswählen

 Bereich = mySheet.getCellRangeByPosition(Startspalte,Startzeile,Endspalte,Endzeile)
(*.jpg gehen ja gerade nicht hochzuladen)

Re: suchen spezial

Verfasst: Do, 12.03.2009 13:18
von Charly
Hallo Clag!
Clag hat geschrieben: wenn der Treffer in der letzten Zeile des DatenBereich liegt
und man will dann das Makro erneute aufrufen, gibt es folgende Fehlermeldung

BASIC-Laufzeitfehler...
Da war noch ein Bug. Den habe ich jetzt mit einer Abfrage beseitigt.

Code: Alles auswählen

 Global RegSearch as variant

     Sub Suche()
       myDoc = thisComponent
       myView = myDoc.CurrentController
       mySheet = myView.ActiveSheet
       
       Cursor = mySheet.createCursor
       Cursor.goToEndOfUsedArea(0)
       Endzeile = Cursor.getRangeAddress().EndRow
       oSelect=ThisComponent.CurrentSelection.getRangeAddress
       StartSpalte=oSelect.StartColumn
       EndSpalte=oSelect.EndColumn
   
       StartZeile =oSelect.StartRow+1
       
       If StartZeile = Endzeile+1 then
       Startzeile = Endzeile
       end if
       
       Bereich = mySheet.getCellRangeByPosition(Startspalte,Startzeile,Endspalte,Endzeile)
       
       RegSearch = InputBox("Suchbegriff eingeben", "Input Suchen", RegSearch)
       
       For I= 1 to 2
       SearchDesc = Bereich.createSearchDescriptor
       SearchDesc.SearchString = RegSearch
       SearchDesc.SearchCaseSensitive = false
       SearchDesc.SearchRegularExpression = True
       Found = Bereich.findFirst(SearchDesc)
       
       If Not isnull(Found) then
       myView.Select(found)
       exit sub
       end if
       If Startzeile < Endzeile then
       Startzeile = Startzeile-1
       end if
       Bereich = mySheet.getCellRangeByPosition(Startspalte,11,Endspalte,Startzeile)
       next I
       MSGBOX ("Der Suchbegriff wurde nicht gefunden")
    End Sub

Re: suchen spezial

Verfasst: Do, 12.03.2009 13:38
von clag
Hi Charly,

ok die Fehlemeldung ist weg aber .....
die Suche wird leider trotzdem nicht fortgesetzt

vielleicht schaust nochmal genau :wink: