code optimierung

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

kannenklaus
*****
Beiträge: 319
Registriert: Mi, 14.12.2005 08:08
Wohnort: freising - oder dort, wo das bier herkommt

code optimierung

Beitrag von kannenklaus »

hallo zusammen,

mit eurer hilfe habe ich ein funktionierendes makro, das mehrere su/er-vorgänge auch über alle sheets hinweg durchführt. meine frage ist nun, ob der code noch optimiert werden kann. dies wird sicherlich möglich sein, da ich mich erst seit anfang dezember mit starbasic beschäftige.

Code: Alles auswählen

Sub SuErMultipleAlleBlaetter
	Dim oDoc as Object
	Dim oSheets as Object
	Dim oSheet as Object
	Dim oSuche1 as Object
	Dim oSuche2 as Object
	Dim sSu1 as String 'Variable für den 1. Suchbegriff
	Dim sEr1 as String 'Variable für die 1. Ersetzung
	Dim sSu2 as String 'Variable für den 2. Suchbegriff
	Dim sEr2 as String 'Variable für die 2. Ersetzung
	Dim I as integer
	Dim bSWords as boolean, bSCase as boolean 'Schalter für einmal vorkommende Wörter bzw. Groß/Kleinschreibung	
	oDoc = ThisComponent
	oSheets = oDoc.sheets 
	oSheet = oDoc.CurrentController.activeSheet

	
' -- Chechboxen Wörter und Groß/Kleinschreibung abfragen 
	If oDlg.getControl("cbxSuWort").state=1 AND oDlg.getControl("cbxGrossKlein").state=1 then 
           bSWords = true 'nur ein Wort darf vorkommen
           bSCase = true 'Großschreibung              
       Elseif oDlg.getControl("cbxSuWort").state=1  AND oDlg.getControl("cbxGrossKlein").state=0  then 
           bSWords = true 
           bSCase = false             
       Elseif oDlg.getControl("cbxSuWort").state=0  AND oDlg.getControl("cbxGrossKlein").state=1 then 
           bSWords = false 
           bSCase = true 
     End If
          	
'--Su/er-Eingabe des Dialogs werden an die Variablen ausgelesen
	sSu1 = oDlg.getControl("txtSu1").getText
	sEr1 = oDlg.getControl("txtEr1").getText
	sSu2 = oDlg.getControl("txtSu2").getText
	sEr2 = oDlg.getControl("txtEr2").getText


'--ein ReplaceDescriptor wird für den jeweiligen Suchen/Ersetzungsvorgang bezogen auf oSheet erstellt
	oSuche1 = oSheet.createReplaceDescriptor
	oSuche2 = oSheet.createReplaceDescriptor	
	
'--1. Suchen/Ersetzen Ausdruck wird definiert	
'--Schleife über alle Blätter	
	For I = 0 to oSheets.getCount() -1
		oSheet = oSheets.getByIndex(I)
		oSuche1.setSearchString(sSu1)
		oSuche1.setReplaceString(sEr1)
	  	oSuche1.SearchWords = bSWords 
	  	oSuche1.SearchCaseSensitive = bSCase
		oSheet.replaceAll(oSuche1)	
	next I


'--2. Suchen/Ersetzen Ausdruck wird definiert
'--Schleife über alle Blätter	
	For I = 0 to oSheets.getCount() -1	
		oSheet = oSheets.getByIndex(I)
		oSuche2.setSearchString(sSu2)
		oSuche2.setReplaceString(sEr2)
        oSuche2.SearchWords = bSWords 
        oSuche2.SearchCaseSensitive = bSCase
		oSheet.replaceAll(oSuche2)
	next I	
End sub
freue mich auf eine antwort

grüße klaus
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Klaus,

hmm, sieht doch schon ganz gut aus.

Verbesserung: Dein Abschnitt mit Suchen/Ersetzen wird zeimlich identisch zweimal aufgeführt. Redundanzen sollten vermieden werden. Das kannst du zum Beispiel durch eine eigenständige Prozedur lösen:

Code: Alles auswählen

sub SucheErsetze(sSu, sEr, oSheet, bSWords as boolean, bsCase as boolean)
  oSuche1 = oSheet.createReplaceDescriptor 
  For I = 0 to oSheets.getCount() -1
      oSheet = oSheets.getByIndex(I)
      oSuche1.setSearchString(sSu)
      oSuche1.setReplaceString(sEr)
        oSuche1.SearchWords = bSWords
        oSuche1.SearchCaseSensitive = bSCase
      oSheet.replaceAll(oSuche1)   
   next I
end sub
Die Funktion erwartet fünf Parameter, die jeweiligen Such- und Ersetzen Strings, das Blattobjekt. sowie die Boolschen Werte. Die könntest du natürlich auch als globalke Variablen definieren, dann brauchst du sie nicht übergeben.

Dann rufst du die Funktion an passender Stelle auf:

Code: Alles auswählen

'--Su/er-Eingabe des Dialogs werden an die Variablen ausgelesen
   sSu1 = oDlg.getControl("txtSu1").getText
   sEr1 = oDlg.getControl("txtEr1").getText
   sSu2 = oDlg.getControl("txtSu2").getText
   sEr2 = oDlg.getControl("txtEr2").getText

   REM hier jetzt die Funktion aufrufen:
   SucheErsetze(sSu1, sEr1, oSheet, bSWords, bSCase)
   SucheErsetze(sSu2, sEr2, oSheet, bSWords, bSCase)
    REM  das war es
end sub
Wobei ich die Logik des Programms natürlich nicht prüfen kann .
(Warum zum Beispiel gibt es zwei Begriffe, die ersetzt werden sollen, und nicht einer, drei oder zehn?)

Viele Grüße

Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
kannenklaus
*****
Beiträge: 319
Registriert: Mi, 14.12.2005 08:08
Wohnort: freising - oder dort, wo das bier herkommt

Beitrag von kannenklaus »

hallo thomas,

danke für deine antwot.
Verbesserung: Dein Abschnitt mit Suchen/Ersetzen wird zeimlich identisch zweimal aufgeführt.
weil ich in einem dialog bis zu sechs su/er-paare ausführen will. deswegen gibt es suche1, suche3 etc. für diesem hintergrund scheint mir deine funktion sub ScheErsetze nur dann redundanzen zu vermeiden, wenn sie alle su/er-paare abarbeiten kann. oder?

grüße

klaus
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Klaus,
...diesem hintergrund scheint mir deine funktion sub ScheErsetze nur dann redundanzen zu vermeiden, wenn sie alle su/er-paare abarbeiten kann. oder?
Genau! kann sie ja, du übergibst die Parameter und die Funktion wird jeweils durchgelaufen. Wenn du also später wirklich 6 Suchpaare erzeugst, lohn sich sogar noch eine Schleife weiter oben, dann benenne die Boxen fortlaufend (hast du ja schon :wink: ) und schreib:

Code: Alles auswählen

'--Su/er-Eingabe des Dialogs werden an die Variablen ausgelesen
For i = 1 to 2  'später eben 6
   sSu = oDlg.getControl("txtSu" & i).getText
   sEr = oDlg.getControl("txtEr" & i).getText
   
   REM hier jetzt die Funktion aufrufen:
   SucheErsetze(sSu, sEr, oSheet, bSWords, bSCase)
next
   
    REM  das war es
end sub
Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
kannenklaus
*****
Beiträge: 319
Registriert: Mi, 14.12.2005 08:08
Wohnort: freising - oder dort, wo das bier herkommt

Beitrag von kannenklaus »

hallo thomas,

danke für den tipp. der code ist jetzt noch knapper geworden.

gruß

klaus
Antworten