Syntax Fehler nach betätigen der Schaltfläche

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

Moderator: Moderatoren

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

Re: Syntax Fehler nach betätigen der Schaltfläche

Beitrag von Toxitom »

Hei MagnaUser,

das Makro ist in LibreOffice (Version 7) geschrieben und getestet worden;)

Aber... die Verwendung des Dispachers und der Zwischenablage kann manchmal tückisch sein... ist leider nicht immer klar, was da drin ist :(

Das was Du siehst ist offensichtlich folgendes: Du hast den Code (vielleicht aus dem Forum) kopiert und über die Zwischenablage in Dein Dokument eingefügt.
Dann das Makro gestartet - und da ist eben auch noch der Code in der Zwischenablage - und der wurde in die Startzelle (A1) eingefügt;)

Tia, ja, das sind so die Tücken...hihi.

Aber... geben wir dem Makro etwas Zeit, alles richtig zu machen.

Code: Alles auswählen

function CopyTabToNewDoc(oSheet as object, oDoc as object, oZielDoc as object)
  DIM oFrame1 as variant, oFrame2 as variant
  Dim oZelle as variant
  Dim oDispatcher as variant
  
  oDispatcher = createUnoService("com.sun.star.frame.DispatchHelper") 
   
  oDoc.CurrentController.Frame.ContainerWindow.setFocus    'nimmt den Focus vom Button! (Formular)
  REM Das zu kopierende Tabellenblatt wird markiert
  oDoc.CurrentController.Select(oSheet)
  wait( 1000 )  'eine Sekunde warten um dem Makro Zeit zu geben..... 
  oFrame1 = oDoc.CurrentController.Frame
  REM Use a dispatch to copy to the clipboard.
  oDispatcher.executeDispatch(oFrame1, ".uno:Copy", "", 0, Array())
  REM Upper left corner of where to paste the data.
  oZelle = oZielDoc.Sheets(0).getCellRangeByName("A1")
  REM Place the view cursor there then paste the clipboard.
  oZielDoc.CurrentController.Select(oZelle) 
  oFrame2 = oZielDoc.CurrentController.Frame 
  oDispatcher.executeDispatch(oFrame2, ".uno:Paste", "", 0, Array())
  REM Cursor setzen in Zelle A1 des Zieldokumentes
  oZielDoc.CurrentController.Select(oZelle)
  
end function
Die wait() Funktion ist neu drin, zusätzlich die Zeile "oDoc.CurrentController.Frame.ContainerWindow.setFocus" - die ist zwar wohl nicht zwingend nötig, gibt aber ein wenig Sicherheit.
die Zeile "oFrame1 = oDoc.CurrentController.Frame" habe ich verschoben!

Wenn alles bei Dir gut funktioniert, kannst Du auch die wait-Funktion etwas reduzieren - wahrscheinlich reichen auch 500 oder sogar 200 (Millisekunden). Hängt aber auch von dem Rechner etc ab ... also besser großzügig bleiben;)

Viele Grüße
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
mikeleb
*******
Beiträge: 1315
Registriert: Fr, 09.12.2011 16:50

Re: Syntax Fehler nach betätigen der Schaltfläche

Beitrag von mikeleb »

Hallo,
mit der Methode .importSheet() sollte es noch einfacher gehen:

Code: Alles auswählen

Sub Datei_speichern()

	'zu prüfenden Zellen und Fehlermeldung erfassen

	aFehler=Array(Array("T5","Keine Datum ausgewählt!"),_
			Array("T6", "Keine Schicht ausgewählt!"), _
			Array("T8", "Kein Einleger 1 ausgewählt!"), _
			Array("V8", "Kein Einleger 2 ausgewählt!"), _
			Array("T9", "Kein Nacharbeiter 1 ausgewählt!"), _
			Array("V9", "Kein Nacharbeiter 2 ausgewählt!"), _
			Array("T10", "Kein nstandhalter ausgewählt!"), _
			Array("U11", "Stückzahl links nicht eingetragen!"), _
			Array("W11", "Stückzahl rechts nicht eingetragen!"), _
			)
	REM Zugriff auf das aktuelle Dokument
	oDoc = ThisComponent
	REM Zugrif auf das aktuelle Tabellenblatt
	oSheet = oDoc.CurrentController.ActiveSheet
	abbruchmeldung=""
	For i=0 to uBound(aFehler)
		If oSheet.getCellRangeByName(aFehler(i)(0)).String="" Then
			abbruchmeldung=abbruchmeldung & aFehler(i)(1) & chr(10)
		End if		
	Next

	If abbruchmeldung<>"" Then
		msgbox(abbruchmeldung)
	Else
	
		vntPathAndFile ="D:\Stoerauswertung\" & Format(Now, "yyyy.mm.dd") & "_" & oSheet.getCellRangeByName("T6").String & "_" & "G26_TV" & ".ods"
		
		' Neue Calc-Datei erzeugen 
		Dim arg(0) as new com.sun.star.beans.PropertyValue
		Arg(0).Name = "Hidden"
		Arg(0).Value = false ' nach Tests auf true setzen:))
		oZielDoc = StarDesktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, arg())
	
		'Tabelle importieren
		oZielDoc.Sheets.importSheet(oDoc,oSheet.name,0)
		'Button entfernen
		oshape=oZielDoc.Sheets(0).drawpage.getbyindex(0)
		oZielDoc.Sheets(0).drawpage.remove(oshape)
		'neues Dokument speichern und schließen
		oZielDoc.storeAsURL(converttourl(vntPathAndFile), array()) 'es wird ohne zu fragen ggf. überschrieben
		oZielDoc.close(false) 
		
		'Eintragungen löschen		
		aLoeschen=Array("T5:W6", "T8:W9", "T10:W10", "U11", "W11", "B12:W27")
		
		For i=0 To ubound(aLoeschen)
			oSheet.getCellRangeByName(aLoeschen(i)).ClearContents(7)
		Next
	
		msgbox "Die Datei" & chr(10) & vntPathAndFile & chr(10) & "wurde gespeichert."
	
	End If
		

End Sub
Gruß,
mikeleb
MagnaUser
*
Beiträge: 10
Registriert: Mo, 07.02.2022 13:01

Re: Syntax Fehler nach betätigen der Schaltfläche

Beitrag von MagnaUser »

Servus an alle Helfer,

Vielen Dank für Eure tolle Hilfe.

@mikeleb
Es funktioniert fast.
Ich habe gesehen, dass Du das mit dem Button löschen mit eingebaut hast.
Er ist aber in der gespeicherten Version noch vorhanden.

Code: Alles auswählen

'Button entfernen
		oshape=oZielDoc.Sheets(0).drawpage.getbyindex(0)
		oZielDoc.Sheets(0).drawpage.remove(oshape)
Kann es sein, dass vielleicht der Name von dem Button fehlt?
Oder würden mit dem Code alle Button entfernt? Wenn ja, dann brauch man ja keinen Namen.

Was ich richtig gut finde, ist das Array für die Abfragen. Könntest Du mir einen Gefallen tun und für den Einleger
und für den Nacharbeiter jeweils ein Markierfeld mit einbauen, damit wenn ich das Markierfeld anklicke
die rechte Zelle vom Einleger oder Nacharbeiter ausgefüllt werden muss.

Es kann sein das wir mal nur mit halber Mannschaft die Anlage betreuen.

Anmerkung 2022-02-10 074043.jpg
Anmerkung 2022-02-10 074043.jpg (44.06 KiB) 2485 mal betrachtet

Ich denke, das war's vielen vielen Dank. Super Arbeit von Euch.

Grüße MagnaUser
mikeleb
*******
Beiträge: 1315
Registriert: Fr, 09.12.2011 16:50

Re: Syntax Fehler nach betätigen der Schaltfläche

Beitrag von mikeleb »

Hallo,
Er ist aber in der gespeicherten Version noch vorhanden.
Bei mir wird er gelöscht (in der exportierten Datei). Ich bin allerdings davon ausgegangen, dass nur ein Button existiert.
Zur Sicherheit (um alle Schaltflächen und andere Formularelemente zu entfernen), kannst du die zwei Zeilen durch folgende ersetzen:

Code: Alles auswählen

		'Button entfernen
		for i=oZielDoc.Sheets(0).drawpage.count-1 to 0 Step -1
			oshape=oZielDoc.Sheets(0).drawpage.getbyindex(i)
			oZielDoc.Sheets(0).drawpage.remove(oshape)
		next
Es kann sein das wir mal nur mit halber Mannschaft die Anlage betreuen.
Würde es bedientechnisch nicht einfacher sein, dass die Eingabe eines 2. optional wäre? Anders gefragt: Wenn es einen 2. Einleger gibt, gibt es dann auch einen 2. Nacharbeiter? Würde das Markierfeld von dir gewählt werden und die Datei dann so an die Mannschaft gegeben? In letzterem Fall, solltest du bedenken bestimmte Bereiche zu schützen.
Gruß,
mikeleb
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Syntax Fehler nach betätigen der Schaltfläche

Beitrag von Toxitom »

Hey MagnaUser,
mikeleb hat geschrieben: Do, 10.02.2022 12:53 Zur Sicherheit (um alle Schaltflächen und andere Formularelemente zu entfernen), kannst du die zwei Zeilen durch folgende ersetzen:
Ganz so einfach ist das leider nicht :( Die Drawpage ist ein Sammelbecken aller grafischen Elemente, also z.B. Bilder, Zeichnungen (Elemente der Zeichenfunktionen), Grafiken, aber eben auch aller Steuerelemente von Formularen etc.

Es ist also nicht immer so einfach, das passende Element zu identifizieren.
1. Schritt: gib dem Element einen eindeutigen Namen - im Falle des Buttons über Extras - Formulare - Entwufsmodus. Dann Button anklicken, Kontextmenü -> Eigenschaften. Dort "Name"- ich nenne es mal beispielhaft "test".
Dann den Entwurfsmodus wieder ausschalten, Dokument speichern.

Nun kannst Du über alle Drawpage-objekte iterieren, prüfen ob es sich um ein ControlShape-Objekt handelt (also ein Formularelement) und dann dort den Namen prüfen. Und nur bei passenden Namen löschen;)

Code: Alles auswählen

  'Button entfernen
  for i=oZielDoc.Sheets(0).drawpage.count-1 to 0 Step -1
     oshape=oZielDoc.Sheets(0).drawpage.getbyindex(i)
     if oShape.supportsService("com.sun.star.drawing.ControlShape") then
          if oShape.control.name = "test" then
               oZielDoc.Sheets(0).drawpage.remove(oshape)
               exit for
           end if
     end if
  next
Zu der zweiten Frage:
Du willst die Kontrollboxen verschieben? - Formular auf Entwurfsmodus setzen und mit der Maus oder den Tasten verschieben.
Oder was meintest Du?

Viele Grüße
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
MagnaUser
*
Beiträge: 10
Registriert: Mo, 07.02.2022 13:01

Re: Syntax Fehler nach betätigen der Schaltfläche

Beitrag von MagnaUser »

Servus,

Vielen Dank für Eure Antworten.
Würde es bedientechnisch nicht einfacher sein, dass die Eingabe eines 2. optional wäre? Anders gefragt: Wenn es einen 2. Einleger gibt, gibt es dann auch einen 2. Nacharbeiter? Würde das Markierfeld von dir gewählt werden und die Datei dann so an die Mannschaft gegeben? In letzterem Fall, solltest du bedenken bestimmte Bereiche zu schützen.
Richtig es soll optional sein. Wenn die Markierfelder angeklickt werden müssen die beiden rechten Zellen ausgefüllt werden.
Wenn 2 Einleger da sind kann auch nur 1 Nacharbeiter da sein oder auch umgedreht. Das entscheidet der Produktionsleiter.
Der Anlagenfahrer füllt dieses Tabellenblatt bis zum Feierabend aus. Der Rest der Mannschaft hat damit nichts zu tun.

@ Tom

Mit deinem Code ist der Button weg. Ich hatte nach deiner Anleitung einen Namen vergeben.

Vielen Dank noch mal für Eure toll Unterstützung.

Grüße MagnaUser
MagnaUser
*
Beiträge: 10
Registriert: Mo, 07.02.2022 13:01

Re: Syntax Fehler nach betätigen der Schaltfläche

Beitrag von MagnaUser »

Hallo an alle,

Hier eine fast komplette Datei. Außer die Personendaten. Dafür habe ich Dummys eingetragen.
Kopie2.ods
(31.33 KiB) 117-mal heruntergeladen
So funktioniert sie wie ich es haben wollte. Es gibt einen Schönheitsfehler. Wenn man die gespeicherte Datei öffnet
denkt man im ersten Moment sie ist leer. Ist sie nicht, der Fokus liegt nur auf der Tabelle 1 und nicht auf das
importierte Blatt. Was muss ich am Makro verändern damit das importierte Blatt das aktive Blatt ist?
Ich denke die Tabelle 1 nach dem importieren zu löschen aber wie?

So vielen Dank noch mal für Eure tolle Hilfe. Allein hätte ich es nicht geschafft.

Grüße MagnaUser
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Syntax Fehler nach betätigen der Schaltfläche

Beitrag von Toxitom »

Hey MagnaUser
MagnaUser hat geschrieben: Fr, 11.02.2022 16:52 Ich denke die Tabelle 1 nach dem importieren zu löschen aber wie?
Wäre wohl die einfachste Möglichkeit.

Füge die folgende Zeile ein vor dem Speichern des Zieldokuments, aber nach dem Einfügen der Seite:

Code: Alles auswählen

if oZielDoc.Sheets.hasByName("Tabelle1") then  oZielDoc.Sheets.removeByName("Tabelle1")
Musste evt. mit den aktuellen Bezeichnungen anpassen.

VG Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
MagnaUser
*
Beiträge: 10
Registriert: Mo, 07.02.2022 13:01

Re: Syntax Fehler nach betätigen der Schaltfläche

Beitrag von MagnaUser »

Hallo Tom,

Super vielen Dank funktioniert bestens.

Ein kleine Verbesserung.
Ich habe noch eine Überprüfung mit reingebracht ob das Netzlaufwerk (in meinem Fall ist es Z) vorhanden ist.

Code: Alles auswählen

  vntPathAndFile = "Z:\_Stoerauswertung_G26\" & Format(Now, "yyyy.mm.dd") & "_" & oSheet.getCellRangeByName("T6").String & "_" & "G26_TH" & ".ods"

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++    
   fullPath = "Z:\_Stoerauswertung_G26\ReadyToSave.txt"
    
    if FILEEXISTS (fullPath) = false then 
		msgbox "Das Netzlaufwerk ist nicht erreichbar," + Chr(13) + "bitte im Windows Explorer prüfen," + Chr(13) + "ob das Z-Laufwerk vorhanden ist"
		exit sub
	endif    
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++    
    
    ' Neue Calc-Datei erzeugen
    ' Dim arg(0) as new com.sun.star.beans.PropertyValue
    arg(0).Name = "Hidden"
    arg(0).Value = False ' nach Tests auf true setzen:))
    oZielDoc = StarDesktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, arg())

Vielen Dank

Grüße MagnaUser
Antworten