Suchefunktion durch Makro gestalten

Das Tabellenkalkulationsprogramm

Moderator: Moderatoren

Loewelutz
*
Beiträge: 14
Registriert: Di, 05.12.2006 12:27
Wohnort: Goslar

Suchefunktion durch Makro gestalten

Beitrag von Loewelutz »

In einem Calc-Dokument soll die Suchefunktion komfortabler gestaltet werden, da die übliche Eingabemaske (Strg + „G“) zu viel vom Dokument verdeckt.

Vorgesehen ist die Zelle „D6“ als Suchfeld. Mit einem Button soll die Suche in dem geöffneten Dokument gestartet werden. Mit einem zweiten Button soll weiter gesucht werden.

Wie ich Schaltflächen erstelle, ist mir bekannt. Allerdings fehlen mir die Kenntnisse zur erforderlichen Makroprogrammierung.

Wie lässt sich dieses Problem am geschmeidigsten lösen? (Open Office 1.1)

Herzlichen Dank ... Lutz
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Beitrag von Karolus »

Hallo Lutz
Wie lässt sich dieses Problem am geschmeidigsten lösen? (Open Office 1.1)
Mit kreativer Nutzung von ->Extras->Makros aufzeichnen.
Da ich nicht sicher bin, wie gut das in OOo1.1 funktioniert, bin ich für dich mal kreativ geworden :

Code: Alles auswählen

sub sucheanfang
suchdok = thisComponent
suchtab = suchdok.sheets(0) '0→erstes Tabellenblatt
suchtext = suchtab.getcellbyPosition(3,5).string '-->D6
suchen(suchtext,0)
end sub

sub weitersuchen
suchdok = thisComponent
suchtab = suchdok.sheets(0) 'erstes Tabellenblatt
suchtext = suchtab.getcellbyPosition(3,5).string '-->D6
suchen(suchtext,1)
end sub

sub suchen(suchtext,w)
rem aufgezeichneter Code von->su&ersetzen-'suchen', nachträglich sind-
rem - die Variblen 'suchtext' und 'w' eingefügt.
rem define variables
dim document   as object
dim dispatcher as object
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

dim args1(17) as new com.sun.star.beans.PropertyValue
args1(0).Name = "SearchItem.StyleFamily"
args1(0).Value = 2
args1(1).Name = "SearchItem.CellType"
args1(1).Value = 0
args1(2).Name = "SearchItem.RowDirection"
args1(2).Value = true
args1(3).Name = "SearchItem.AllTables"
args1(3).Value = false                       'hier true, falls alle Blätter durchsucht werden sollen
args1(4).Name = "SearchItem.Backward"
args1(4).Value = false
args1(5).Name = "SearchItem.Pattern"
args1(5).Value = false
args1(6).Name = "SearchItem.Content"
args1(6).Value = false
args1(7).Name = "SearchItem.AsianOptions"
args1(7).Value = false
args1(8).Name = "SearchItem.AlgorithmType"
args1(8).Value = 0           '1→'regulärer Ausdruck'
args1(9).Name = "SearchItem.SearchFlags"
args1(9).Value = 65536
args1(10).Name = "SearchItem.SearchString"
args1(10).Value = suchtext          '←da ist die Variable
args1(11).Name = "SearchItem.ReplaceString"
args1(11).Value = ""
args1(12).Name = "SearchItem.Locale"
args1(12).Value = 255
args1(13).Name = "SearchItem.ChangedChars"
args1(13).Value = 2
args1(14).Name = "SearchItem.DeletedChars"
args1(14).Value = 2
args1(15).Name = "SearchItem.InsertedChars"
args1(15).Value = 2
args1(16).Name = "SearchItem.TransliterateFlags"
args1(16).Value = 1280
args1(17).Name = "SearchItem.Command"
args1(17).Value = w         'w=0→suchen,w=1→weitersuchen

dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args1())


end sub
Speichere den Code in der Standardbiliothek deines Dokuments, und verknüpfe die schaltflächen mit den Subs 'sucheanfang' und 'weitersuchen'.


Gruß Karo
Loewelutz
*
Beiträge: 14
Registriert: Di, 05.12.2006 12:27
Wohnort: Goslar

Makro - Suchen

Beitrag von Loewelutz »

Super Karo, da ziehe ich den Hut!

Durch Dein Makro bin ich kurz vor dem Ziel. Ob Du mir noch bei der Feinabstimmung helfen könntest?

Ich habe beide Schaltflächen „suchen“ und „weitersuchen“ mit dem entsprechenden Makros verknüpft. Beim Auslösen des ersten Makro erhalte ich die Fehlermeldung:

„BASIC-Laufzeitfehler. Argument ist nicht optional“

Danach die Schaltfläche „Weitersuchen“ betätigt und der Suchbegriff im Calc-Dokument wird schwarz hinterlegt (auch Mehrfachtreffer). Allerdings springt das Programm noch nicht automatisch zur entsprechenden Stelle im Dokument (Datei wird später einmal mehrere tausend Zeilen umfassen).

Nun müssen es natürlich nicht unbedingt zwei Schaltflächen sein. Ich habe mir dies bisher nur aus der ursprünglichen `Suchefunktion` abgeschaut.

Ließe sich die Sache auch so lösen, dass nach Aktivierung einer einzelnen Schaltfläche die Markierung zunächst zum ersten Treffer wechselt, nach einer erneuten Aktivierung zur zweiten u.s.w.? Das wäre genial ;-)

Herzlicher Gruß ... Lutz
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Beitrag von Karolus »

Hallo Lutz

Ich kann leider nicht die Fehlermeldung nachvollziehen, die du beim Auslösen von 'sucheanfang' erhälst. Bei mir tut dieses Makro genau das was du :
Ließe sich die Sache auch so lösen, dass nach Aktivierung einer einzelnen Schaltfläche die Markierung zunächst zum ersten Treffer wechselt, nach einer erneuten Aktivierung zur zweiten u.s.w.? Das wäre genial.
-hier wünscht, nämlich bei jedem Tastendruck zum nächsten Treffer wechseln.
Was passiert bei dir wenn du die Schaltfläche mehrmals betätigst ?
Falls nur die andere Schaltfläche funktioniert, hast du evtl. irrtümlich die erste Schaltfläche mit mit der Sub 'suchen(.,.,.)' verknüpft, statt mit 'sucheanfang' ?

Gruß
Loewelutz
*
Beiträge: 14
Registriert: Di, 05.12.2006 12:27
Wohnort: Goslar

Makro für Suchefunktion

Beitrag von Loewelutz »

Hey Karo,

Du hast natürlich absolut Recht. Ich hatte irrtümlich die erste Schaltfläche mit der Sub 'suchen' verknüpft, statt mit 'sucheanfang' ?

Nun funktioniert alles perfekt! Ich hatte nicht damit gerechnet, dass sich mein Idealwunsch verwirklichen lässt.

Tausend Dank !!! Lutz
funnyzocker
Beiträge: 5
Registriert: Sa, 14.04.2007 12:19

Sorry

Beitrag von funnyzocker »

Sorry das ich das alte Thema nochmals hochhole.
Aber ich habe das gerade dank der Suche im Forum gefunden.

Ich kann genau das Makro sehr gut gebrauchen nur leider habe ich das Problem das nicht alle Tabellen durchsucht werden.

Ich habe eine Hauptübersicht und je Monat 1 Tabelle.
Nun soll in der Hauptübersicht in Suchformular wo ich einen Auftragsnummer eingeben kann (Die ja unique) ist. Nach Klick sollen alle Tabellen in Durchsucht werden. Leider findet das Makro immer keine Einträge.

Habe ein Textfeld und eine Schaltfläche. Die Schaltfläche Funktioniert (Also es wird die suche ausgeführt) Aber er sucht nicht nach dem eintrag in dem Textfeld. Muss ich die beiden Verknüpfen oder wie?
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Beitrag von Karolus »

Hallo
Du möchtest alle Tabellen durchsuchen, dafür hatte ich an entsprechender Stelle einen Kommentar eingetragen:

Code: Alles auswählen

...
args1(3).Name = "SearchItem.AllTables"
args1(3).Value = false                       'hier true, falls alle Blätter durchsucht werden sollen 
...
ändere die Zeile auf:

Code: Alles auswählen

...
args1(3).Value = true
....
Gruß Karo
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Beitrag von turtle47 »

Hallo Funnyzocker,
Habe ein Textfeld und eine Schaltfläche.
Wer hat denn was von einem Textfeld geschrieben.
Der zu suchende Text steht in Zelle D6!
Vorgesehen ist die Zelle „D6“ als Suchfeld

Code: Alles auswählen

suchtext = suchtab.getcellbyPosition(3,5).string '-->D6
Viel Erfolg.

Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
funnyzocker
Beiträge: 5
Registriert: Sa, 14.04.2007 12:19

TExtfeld

Beitrag von funnyzocker »

Kann ich das irgendwie ändern das es über das Textfeld läuft?
Sieht besser aus
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Beitrag von Karolus »

Hallo

Gib doch in den Einstellungen des Textfeldes unter 'Daten'-->'Verknüpfte Zelle'
die Zelle D6 ein.

Gruß Karo
funnyzocker
Beiträge: 5
Registriert: Sa, 14.04.2007 12:19

Geht ja nicht

Beitrag von funnyzocker »

Wenn ich das Textfeld mit der Zelle Verknüpfe, wird wenn ich in das Textfeld was eingebe das selbe in der Zelle eingegeben und er findet als erstes das.
Er soll aber nur das Finden was wirklich da ist und nicht was ich als Suche eingegeben habe.
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Beitrag von Karolus »

Hallo

Tausch mal die ersten beiden Makros gegen:

Code: Alles auswählen

sub sucheanfang
suchdok = thisComponent
suchtab = suchdok.sheets(0) '0→erstes Tabellenblatt
odraw1= suchtab.drawpage
  form1=odraw1.forms.getbyIndex(0)
  oContr=form1.getbyname("TextBox")
suchtext = oContr.Text 
'suchtext = suchtab.getcellbyPosition(3,5).string '-->D6
suchen(suchtext,0)
end sub

sub weitersuchen
suchdok = thisComponent
suchtab = suchdok.sheets(0) 'erstes Tabellenblatt
odraw1= suchtab.drawpage
  form1=odraw1.forms.getbyIndex(0)
  oContr=form1.getbyname("TextBox")
suchtext = oContr.Text 
'suchtext = suchtab.getcellbyPosition(3,5).string '-->D6
suchen(suchtext,1)
end sub
Gruß Karo
funnyzocker
Beiträge: 5
Registriert: Sa, 14.04.2007 12:19

Danke

Beitrag von funnyzocker »

Ja Danke nun Funktioniert es so wie ich es mit vorgestellt habe.
Vielen Dank
Antworten