Makro (CALC) ein bestimmtes Wort finden und komplette Zeile kopieren

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

Moderator: Moderatoren

clag
********
Beiträge: 3562
Registriert: Di, 27.01.2009 15:30

Makro (CALC) ein bestimmtes Wort finden und komplette Zeile kopieren

Beitrag von clag » Fr, 12.07.2019 05:37

Hallo Gemeinde ,
foldendes wurde ich per PM gefragt, kann aber nicht helfen da ich LO nicht nutze.

Hallo clag,

Du hattest hier vor einiger Zeit ein echt tolles Makro gepostet:
http://oooforum.de/viewtopic.php?t=65995

Und zwar zwei Versionen bzw. ein sehr einfaches -
findeText_kopiereZeile.ods - und dann ein stark erweitertes -
findeText_kopiere_alle_Zeilen.ods -, das ich für eine private Tabelle super
brauchen könnte.

Jedoch läuft bei mir dieses erweiterte Makro - ich nutze LibreOffice in der
aktuellsten Version - genau ein Mal.
Denn bei der zweiten Suche nach einem String in Deiner Beispieltabelle
bricht das Makro mit folgender Fehlermeldung ab:

BASIC-Laufzeitfehler:
Eigenschaft oder Methode nicht gefunden: Spreadsheet

Der Fehler wird angezeigt in Zeile 5:
oSheet = oCalc.CurrentSelection.Spreadsheet

Das Makro läuft nur dann tadellos weiter, wenn man das erstellte neue Blatt
mit den Suchergebnissen vor einer weiteren Suche löscht.

Weißt Du vielleicht, woran das liegt und wie man dieses Problem beheben
kann ?
LG
clag

nutzt: WinXP SP3 / AOO 4.1.6 / Firefox

F3K Total
********
Beiträge: 3359
Registriert: Mo, 28.02.2011 17:49

Re: Makro (CALC) ein bestimmtes Wort finden und komplette Zeile kopieren

Beitrag von F3K Total » Sa, 13.07.2019 18:26

Hallo Clag,
habe mir deine Datei heruntgeladen und unter LibreOffice 6.2.5 getestet.
Ich kann keinen Fehler feststellen, läuft bei mir einwandfrei.

Gruß R

F3K Total
********
Beiträge: 3359
Registriert: Mo, 28.02.2011 17:49

Re: Makro (CALC) ein bestimmtes Wort finden und komplette Zeile kopieren

Beitrag von F3K Total » Sa, 13.07.2019 18:32

... hier noch ein Bild dazu ...
CLAG.png
CLAG.png (68.27 KiB) 638 mal betrachtet

clag
********
Beiträge: 3562
Registriert: Di, 27.01.2009 15:30

Re: Makro (CALC) ein bestimmtes Wort finden und komplette Zeile kopieren

Beitrag von clag » Sa, 13.07.2019 19:01

Hallo F3K Total

vielen Dank, das Du Dir die Mühe gemacht hast es zu überprüfen.
Ich hoffe dem ursprünglichen Fragesteller hilft es weiter.

Ich selbst habe die Datei auch heruterladen müssen um zu sehen was Ich eigentlich da mal angestellt habe.
Dabei ist mir dann noch die Idee gekommen ggf den Text der akuellen Zelle zur Suche einzuspannen.

zwei Zeilen zusätzlich

Code: Alles auswählen

REM  *****  BASIC  *****

sub FindeStringKopiereFundzeile
oCalc = ThisComponent
oSheet = oCalc.CurrentSelection.Spreadsheet 

'--------------------------------------------------
'suchstring aus der selektierten Zelle lesen 
	myString = oCalc.CurrentSelection.String
'--------------------------------------------------
'suchstring beliebig eingeben 
'	myString = InputBox( _
'	"bei Fund, eine weitere so benannte Tabelle erstellen " & chr(10) & _
'	"und in Diese, dann die gesamte Fundzeile kopieren" & chr(10) & _
'	"es können auch mehrere Suchbegriffe ';' getrennt eingegeben werden" _
'	,"den eingegebenen Begiff suchen ")
'--------------------------------------------------

	if Len(myString) = 0  then
		MsgBox("nichts eingegeben Aktion abgebrochen")
		exit sub
	end if

	mAllText = split(myString,";")
	for i=0 to uBound(mAllText)
	result = SucheNach( mAllText(i))
		if result = "-"  then
			mAllText(i) = mAllText(i) & " - nicht gefunden, keine weitere Aktion" 
			goto jumpover
		else
			ix=1 
			newTable = mAllText(i)
			do while oCalc.Sheets.hasByName(newTable) 
				ix = ix+1
				newTable = mAllText(i) & "(" & ix &")"
				if oCalc.Sheets.count > 255 then 
					msgbox "zu viele Tabellenblätter"
					exit sub
				endif
			loop
			Sheet=oCalc.createInstance("com.sun.star.sheet.Spreadsheet")
			oCalc.Sheets.insertByName(newTable, sheet)
		endif
	oSheet2 = oCalc.Sheets.getByName(newTable)
	oSourceRange = oSheet.getCellRangeByPosition(0,result,1023,result)
	oSourceRangeAddresse = oSourceRange.getRangeAddress
	oTarget = oSheet2.getCellByPosition(0,1)
	oTargetCellAdresse = oTarget.getCellAddress
	oSheet2.copyRange(oTargetCellAdresse,oSourceRangeAddresse)
	mAllText(i) = "Tabelle " & newTable & " erstellt und Zeile " & result+1 & " kopiert "
	jumpover:
	next 
	msgbox join(mAllText(), chr(10)) 
end sub 


'==============================================================================

function SucheNach( sText$ )

rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Sel"
args1(0).Value = false
dispatcher.executeDispatch(document, ".uno:GoToStart", "", 0, args1())

rem ----------------------------------------------------------------------
dim args2(17) as new com.sun.star.beans.PropertyValue
args2(0).Name = "SearchItem.StyleFamily"
args2(0).Value = 2
args2(1).Name = "SearchItem.CellType"
args2(1).Value = 0
args2(2).Name = "SearchItem.RowDirection"
args2(2).Value = false
args2(3).Name = "SearchItem.AllTables"
args2(3).Value = false
args2(4).Name = "SearchItem.Backward"
args2(4).Value = false
args2(5).Name = "SearchItem.Pattern"
args2(5).Value = false
args2(6).Name = "SearchItem.Content"
args2(6).Value = false
args2(7).Name = "SearchItem.AsianOptions"
args2(7).Value = false
args2(8).Name = "SearchItem.AlgorithmType"
args2(8).Value = 1
args2(9).Name = "SearchItem.SearchFlags"
args2(9).Value = 65536
args2(10).Name = "SearchItem.SearchString"
args2(10).Value = "^" & sText & "$"
args2(11).Name = "SearchItem.ReplaceString"
args2(11).Value = ""
args2(12).Name = "SearchItem.Locale"
args2(12).Value = 255
args2(13).Name = "SearchItem.ChangedChars"
args2(13).Value = 2
args2(14).Name = "SearchItem.DeletedChars"
args2(14).Value = 2
args2(15).Name = "SearchItem.InsertedChars"
args2(15).Value = 2
args2(16).Name = "SearchItem.TransliterateFlags"
args2(16).Value = 1024
args2(17).Name = "SearchItem.Command"
args2(17).Value = 0
dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args2())

	if ThisComponent.CurrentSelection.String = sText then
		SucheNach = ThisComponent.CurrentSelection.CellAddress.Row
	else
		SucheNach = "-"
	endif		

end function


Ich hoffe es hilft irgend einem Leser einmal.

findeText_kopiereZeile.ods
(19.7 KiB) 6-mal heruntergeladen
LG
clag

nutzt: WinXP SP3 / AOO 4.1.6 / Firefox

gerry1
Beiträge: 3
Registriert: Do, 11.07.2019 21:27

Re: Makro (CALC) ein bestimmtes Wort finden und komplette Zeile kopieren

Beitrag von gerry1 » Mi, 17.07.2019 19:45

F3K Total hat geschrieben:
Sa, 13.07.2019 18:32
... hier noch ein Bild dazu ...
Zunächst danke für Deinen Test !
Ich hatte bis vor kurzem die gleiche Version von Libre wie Du.
Da das Makro von clag dann crashte, habe ich es gewagt die neue 6.3.0.1 zu installieren, die sehr viele Bugfixes und etliche Neuerungen enthält und mit allen sonstigen Dokumenten und Makros bisher tadellos läuft.
Leider auch hier wieder ein Crash beim genannten Makro.

Frage an Dich, F3K Total:

Hast Du die Funktion des Makro nur mit einer 1x-igen Suche getestet ?

Nach einem einmaligen Suchlauf funktioniert auch bei mir das Makro immer.

Wenn ich danach aber nach einem weiteren String suchen will, so muss ich das Tabellenblatt, das für die letzte Suche angelegt wurde, immer davor löschen, denn sonst führt die nächste Suche zu einem Crash des Makro.

Beispiel 1:
Ich suche nach dem String "Hannelore".
Der String wird 3x gefunden und das Makro legt ein Blatt "Hannelore" an, das die gefundenen Zeilen enthält.
Ich lösche das Blatt "Hannelore" und suche mit dem Makro nach einem weiteren String, z.B. "Heidi".
Diese Suche funktioniert, so wie jede weitere Suche, wenn ich jeweils davor das angelegte Blatt mit den gefundenen Zeilen lösche.

Beispiel 2:
Ich suche nach dem String "Hannelore".
Der String wird 3x gefunden und das Makro legt ein Blatt "Hannelore" an, das die gefundenen Zeilen enthält.
Ich lösche das Blatt "Hannelore" NICHT, sondern schließe nur das Suchfenster und rufe dann eine neue Suche mit dem Suchbutton auf.
Das Makro crasht sofort mit dem Fehler: "Basic-Laufzeitfehler: Eigenschaft oder Methode nicht gefunden: Spreadsheet" (siehe Screenshots).

Wärst Du so nett und könntest das bitte auch testen ?

Falls das bei Dir OHNE das Löschen des hinzugefügten Such-Blattes auch funktionieren sollte, dann wäre ich mit meinem Latein am Ende.

Habe Libre auf einem ganz neuen Dell-Notebook mit Win10 Pro installiert. Auf dem neuen Notebook laufen daher noch nicht viele andere Programe, die eventuell stören könnten.
Und vor Libre 6.3.0.1 und 6.2.5 hatte ich keine andere Version installiert.
Dateianhänge
Suche1.jpg
Suche1.jpg (156.53 KiB) 397 mal betrachtet
Suche2.jpg
Suche2.jpg (94.7 KiB) 397 mal betrachtet

gerry1
Beiträge: 3
Registriert: Do, 11.07.2019 21:27

Re: Makro (CALC) ein bestimmtes Wort finden und komplette Zeile kopieren

Beitrag von gerry1 » Mi, 17.07.2019 20:00

Hallo clag,

dieses neue bzw. veränderte Makro von Dir läuft bei mir auch nicht :-(
Bzw. nicht wie es offenbar laufen sollte.

Also ich starte Deine Datei und klicke mal - ohne etwas Bestimmtes zu markieren - auf den Button.

Der Cursor steht auf der Zelle C5 mit Inhalt "Anette".
Die Message Box sagt "Anette - nicht gefunden, keine weitere Aktion".
Das ist paradox, denn das Feld gibt es ja...

Ich stelle den Cursor auf Zelle A5, die leer ist.
Die Message Box sagt "Nichts eingegeben Aktion abgebrochen".
Gut, das passt.

Nun markiere ich die gesamte Zeile 5.
Ein Klick auf den Suchbutton lässt das Makro abstürzen mit der der Fehlermeldung "BASIC Laufzeitfehler. Eigenschaft oder Methode nicht gefunden: String" (siehe Screenshot).

Diese Fehlermeldung ist übrigens ähnlich wie jene, die ich bei Deinem anderen Makro bekomme und auch eine Methode (dort "Spreadsheet") auf einmal nicht finden kann.

Wenn ich nur wüsste, was da los ist :-(
Dateianhänge
suche3.jpg
suche3.jpg (73.56 KiB) 391 mal betrachtet

Stephan
********
Beiträge: 11076
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Makro (CALC) ein bestimmtes Wort finden und komplette Zeile kopieren

Beitrag von Stephan » Do, 18.07.2019 08:54

Der Cursor steht auf der Zelle C5 mit Inhalt "Anette".
Die Message Box sagt "Anette - nicht gefunden, keine weitere Aktion".
Das ist paradox, denn das Feld gibt es ja...
wahrscheinlich stimmt die Selektion nicht
Nun markiere ich die gesamte Zeile 5.
Ein Klick auf den Suchbutton lässt das Makro abstürzen mit der der Fehlermeldung "BASIC Laufzeitfehler. Eigenschaft oder Methode nicht gefunden: String" (siehe Screenshot).
eine Zeile verfügt nicht über die Eigenschaft "String"


Gruß
Stephan

clag
********
Beiträge: 3562
Registriert: Di, 27.01.2009 15:30

Re: Makro (CALC) ein bestimmtes Wort finden und komplette Zeile kopieren

Beitrag von clag » Do, 18.07.2019 11:15

Hallo gerry1,

tut mir leid ich habe dich misverstanden und das falsche Makro übergeprüft,
Du hast die "gepimte " Version gemeint und ja da gibt es bei mir den selben Fehler,
wenn man die durch die Suche selektierten Zellen nicht abwählt.

Das kann man manuell zB. durch einen Tastendruck "strgl+Pos1" in der Tabelle erreichen,
nachdem das Makro die neue Tabelle angelegt hat , du brauchst nicht die Tabelle löschen.

Ich werde den Makrocode aber noch anpassen, damit das automatisch geschieht.
LG
clag

nutzt: WinXP SP3 / AOO 4.1.6 / Firefox

clag
********
Beiträge: 3562
Registriert: Di, 27.01.2009 15:30

Re: Makro (CALC) ein bestimmtes Wort finden und komplette Zeile kopieren

Beitrag von clag » Do, 18.07.2019 13:16

Hallo gerry1.

hier mal auf die Schnelle eine "quick and dirty" Lösung

findeText_kopiere_alle_Zeilen+.ods
(33.06 KiB) 4-mal heruntergeladen

ich hoffe das hilft dir
LG
clag

nutzt: WinXP SP3 / AOO 4.1.6 / Firefox

gerry1
Beiträge: 3
Registriert: Do, 11.07.2019 21:27

Re: Makro (CALC) ein bestimmtes Wort finden und komplette Zeile kopieren

Beitrag von gerry1 » Do, 18.07.2019 21:03

clag hat geschrieben:
Do, 18.07.2019 13:16
Hallo gerry1.

hier mal auf die Schnelle eine "quick and dirty" Lösung


findeText_kopiere_alle_Zeilen+.ods
ich hoffe das hilft dir
Vielen, vielen Dank, lieber clag !
Funktioniert nun perfekt.
Du bist ein Könner.

Antworten