Syntax Fehler nach betätigen der Schaltfläche

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

Moderator: Moderatoren

MagnaUser
*
Beiträge: 10
Registriert: Mo, 07.02.2022 13:01

Syntax Fehler nach betätigen der Schaltfläche

Beitrag von MagnaUser »

Moderatorenhinweis: Thema verschoben!

Guten Tag,

Ich bin neu hier bei Euch und könnte Eure Hilfe gebrauchen.

Hintergrund warum ich mich an Euch wende, ist das ich mich nicht mit OpenOffice auskenne. (Nur Excel)
Des Weiteren, weil wir auf unseren Anlagen PCs keine Excel haben.
Auf einem dieser PCs muss ich jetzt eine Excel Tabelle mit OpenOffice nutzen,
wo die Kollegen ihre Störzeiten eintragen.
Die installierte Version von OpenOffice ist 4.1.11
Die Excel Tabelle habe ich in das OpenOffice Format konvertiert.
Diese konvertierte Tabelle funktioniert in OpenOffice sehr gut.
In der Excel Tabelle gab es auch einen Button zum Speichern.
Der Button ist in der konvertierten Datei nicht vorhanden gewesen.
Ich habe die Schaltfläche nachgerüstet.
Den VBA Code habe ich mit diesem Konverter übersetzen lassen. Ob das eine gute Idee war, weiß ich nicht.
https://www.business-spreadsheets.com/vba2oo.asp
Den übersetzten Code habe ich dann dieser Schaltfläche zugeordnet.
Als ich dann die Schaltfläche gedrückt habe, kam es zu einem Syntaxfehler.

Makro.JPG
Makro.JPG (69.05 KiB) 3235 mal betrachtet

Ich drücke dann auf OK und das wars. Ich bekomme keine weiteren Informationen.

Der Excel VBA-Code:

Code: Alles auswählen

Sub CommandButton1_Click()

Dim vntPathAndFile As String
                                               
If Range("T5") = "" Then
    MsgBox "Keine Datum ausgewählt!"
    
Exit Sub
End If
                                               
If Range("T6") = "" Then
    MsgBox "Keine Schicht ausgewählt!"
    
Exit Sub
End If

If Range("T8") = "" Then
    MsgBox "Kein Einleger 1 ausgewählt!"
    
Exit Sub
End If

If Range("V8") = "" Then
    MsgBox "Kein Einleger 2 ausgewählt!"
    
Exit Sub
End If

If Range("T9") = "" Then
    MsgBox "Kein Nacharbeiter 1 ausgewählt!"
    
Exit Sub
End If

If Range("V9") = "" Then
    MsgBox "Kein Nacharbeiter 2 ausgewählt!"
    
Exit Sub
End If

If Range("T10") = "" Then
    MsgBox "Kein Instandhalter ausgewählt!"
    
Exit Sub
End If

If Range("U11") = "" Then
    MsgBox "Stückzahl links nicht eingetragen!"
    
Exit Sub
End If

If Range("W11") = "" Then
    MsgBox "Stückzahl rechts nicht eingetragen!"
    
Exit Sub
End If

vntPathAndFile = "D:\Stoerauswertung\" & "G26_TH_" & Range("T6") & "_" & Format(Now, "yyyy.mm.dd-hh.mm") & ".xlsx"
   
Rem Wenn Dialog abgebrochen, dann Makro verlassen
If vntPathAndFile = "Falsch" Then Exit Sub

Rem Neue Arbeitsmappe erstellen
Workbooks.Add xlWBATWorksheet

Rem Bildschirmmeldungen auschalten
Application.DisplayAlerts = False
Application.ScreenUpdating = False

Rem Einfügen und speichern
ThisWorkbook.Sheets(1).Cells.Copy ActiveSheet.Cells(1)

With ActiveWorkbook
     .SaveAs Filename:=vntPathAndFile, FileFormat:=xlOpenXMLWorkbook
     .Close
End With

Range("T5:W6").ClearContents
Range("T8:W9").ClearContents
Range("T10:W10").ClearContents
Range("U11").ClearContents
Range("W11").ClearContents
Range("B12:W27").ClearContents

Rem Bildschirmmeldungen einschalten
Application.DisplayAlerts = True
Application.ScreenUpdating = True

End Sub

Der konvertierte Code:

Code: Alles auswählen

Sub CommandButton1_Click()

Dim vntPathAndFile As String
                                               
If Dim oSheet as Object[n]oSheet = ThisComponent.CurrentController.ActiveSheet[n]oSheet.getCellRangeByName($1)("T5") = "" Then
    MsgBox "Keine Datum ausgewählt!"
    
Exit Sub
End If
                                               
If Dim oSheet as Object[n]oSheet = ThisComponent.CurrentController.ActiveSheet[n]oSheet.getCellRangeByName($1)("T6") = "" Then
    MsgBox "Keine Schicht ausgewählt!"
    
Exit Sub
End If

If Dim oSheet as Object[n]oSheet = ThisComponent.CurrentController.ActiveSheet[n]oSheet.getCellRangeByName($1)("T8") = "" Then
    MsgBox "Kein Einleger 1 ausgewählt!"
    
Exit Sub
End If

If Dim oSheet as Object[n]oSheet = ThisComponent.CurrentController.ActiveSheet[n]oSheet.getCellRangeByName($1)("V8") = "" Then
    MsgBox "Kein Einleger 2 ausgewählt!"
    
Exit Sub
End If

If Dim oSheet as Object[n]oSheet = ThisComponent.CurrentController.ActiveSheet[n]oSheet.getCellRangeByName($1)("T9") = "" Then
    MsgBox "Kein Nacharbeiter 1 ausgewählt!"
    
Exit Sub
End If

If Dim oSheet as Object[n]oSheet = ThisComponent.CurrentController.ActiveSheet[n]oSheet.getCellRangeByName($1)("V9") = "" Then
    MsgBox "Kein Nacharbeiter 2 ausgewählt!"
    
Exit Sub
End If

If Dim oSheet as Object[n]oSheet = ThisComponent.CurrentController.ActiveSheet[n]oSheet.getCellRangeByName($1)("T10") = "" Then
    MsgBox "Kein Instandhalter ausgewählt!"
    
Exit Sub
End If

If Dim oSheet as Object[n]oSheet = ThisComponent.CurrentController.ActiveSheet[n]oSheet.getCellRangeByName($1)("U11") = "" Then
    MsgBox "Stückzahl links nicht eingetragen!"
    
Exit Sub
End If

If Dim oSheet as Object[n]oSheet = ThisComponent.CurrentController.ActiveSheet[n]oSheet.getCellRangeByName($1)("W11") = "" Then
    MsgBox "Stückzahl rechts nicht eingetragen!"
    
Exit Sub
End If

vntPathAndFile = "D:\Stoerauswertung\" & "G26_TH_" & Dim oSheet as Object[n]oSheet = ThisComponent.CurrentController.ActiveSheet[n]oSheet.getCellRangeByName($1)("T6") & "_" & Format(Now, "yyyy.mm.dd-hh.mm") & ".xlsx"
   
Rem Wenn Dialog abgebrochen, dann Makro verlassen
If vntPathAndFile = "Falsch" Then Exit Sub

Rem Neue Arbeitsmappe erstellen
Workbooks.Add xlWBATWorksheet

Rem Bildschirmmeldungen auschalten
Application.DisplayAlerts = False
ThisComponent.LockControllers

Rem Einfügen und speichern
ThisWorkbook.Sheets(1).Cells.Copy ThisComponent.CurrentController.ActiveSheet.Cells(1)

With ThisComponent
     .SaveAs Filename:=vntPathAndFile, FileFormat:=xlOpenXMLWorkbook
$1.Close(False)
End With

getCellThisComponent.CurrentController.ThisComponent.CurrentController.ActiveSheet.getCellDim oSheet as Object[n]oSheet = ThisComponent.CurrentController.ActiveSheet[n]oSheet.getCellRangeByName($1)ByName(ByName(("T5:W6")).clearContents(com.sun.star.sheet.CellFlags.VALUE + com.sun.star.sheet.CellFlags.STRING + com.sun.star.sheet.CellFlags.DATETIME)(com.sun.star.sheet.CellFlags).Value + com.sun.star.sheet.CellFlags.STRING + com.sun.star.sheet.CellFlags.DATETIME + com.sun.star.sheet.CellFlags.ANNOTATION + com.sun.star.sheet.CellFlags.FORMULA + com.sun.star.sheet.CellFlags.HARDATTR + com.sun.star.sheet.CellFlags.STYLES + com.sun.star.sheet.CellFlags.OBJECTS + com.sun.star.sheet.CellFlags.EDITATTR)Contents
getCellThisComponent.CurrentController.ThisComponent.CurrentController.ActiveSheet.getCellDim oSheet as Object[n]oSheet = ThisComponent.CurrentController.ActiveSheet[n]oSheet.getCellRangeByName($1)ByName(ByName(("T8:W9")).clearContents(com.sun.star.sheet.CellFlags.VALUE + com.sun.star.sheet.CellFlags.STRING + com.sun.star.sheet.CellFlags.DATETIME)(com.sun.star.sheet.CellFlags).Value + com.sun.star.sheet.CellFlags.STRING + com.sun.star.sheet.CellFlags.DATETIME + com.sun.star.sheet.CellFlags.ANNOTATION + com.sun.star.sheet.CellFlags.FORMULA + com.sun.star.sheet.CellFlags.HARDATTR + com.sun.star.sheet.CellFlags.STYLES + com.sun.star.sheet.CellFlags.OBJECTS + com.sun.star.sheet.CellFlags.EDITATTR)Contents
getCellThisComponent.CurrentController.ThisComponent.CurrentController.ActiveSheet.getCellDim oSheet as Object[n]oSheet = ThisComponent.CurrentController.ActiveSheet[n]oSheet.getCellRangeByName($1)ByName(ByName(("T10:W10")).clearContents(com.sun.star.sheet.CellFlags.VALUE + com.sun.star.sheet.CellFlags.STRING + com.sun.star.sheet.CellFlags.DATETIME)(com.sun.star.sheet.CellFlags).Value + com.sun.star.sheet.CellFlags.STRING + com.sun.star.sheet.CellFlags.DATETIME + com.sun.star.sheet.CellFlags.ANNOTATION + com.sun.star.sheet.CellFlags.FORMULA + com.sun.star.sheet.CellFlags.HARDATTR + com.sun.star.sheet.CellFlags.STYLES + com.sun.star.sheet.CellFlags.OBJECTS + com.sun.star.sheet.CellFlags.EDITATTR)Contents
getCellThisComponent.CurrentController.ThisComponent.CurrentController.ActiveSheet.getCellDim oSheet as Object[n]oSheet = ThisComponent.CurrentController.ActiveSheet[n]oSheet.getCellRangeByName($1)ByName(ByName(("U11")).clearContents(com.sun.star.sheet.CellFlags.VALUE + com.sun.star.sheet.CellFlags.STRING + com.sun.star.sheet.CellFlags.DATETIME)(com.sun.star.sheet.CellFlags).Value + com.sun.star.sheet.CellFlags.STRING + com.sun.star.sheet.CellFlags.DATETIME + com.sun.star.sheet.CellFlags.ANNOTATION + com.sun.star.sheet.CellFlags.FORMULA + com.sun.star.sheet.CellFlags.HARDATTR + com.sun.star.sheet.CellFlags.STYLES + com.sun.star.sheet.CellFlags.OBJECTS + com.sun.star.sheet.CellFlags.EDITATTR)Contents
getCellThisComponent.CurrentController.ThisComponent.CurrentController.ActiveSheet.getCellDim oSheet as Object[n]oSheet = ThisComponent.CurrentController.ActiveSheet[n]oSheet.getCellRangeByName($1)ByName(ByName(("W11")).clearContents(com.sun.star.sheet.CellFlags.VALUE + com.sun.star.sheet.CellFlags.STRING + com.sun.star.sheet.CellFlags.DATETIME)(com.sun.star.sheet.CellFlags).Value + com.sun.star.sheet.CellFlags.STRING + com.sun.star.sheet.CellFlags.DATETIME + com.sun.star.sheet.CellFlags.ANNOTATION + com.sun.star.sheet.CellFlags.FORMULA + com.sun.star.sheet.CellFlags.HARDATTR + com.sun.star.sheet.CellFlags.STYLES + com.sun.star.sheet.CellFlags.OBJECTS + com.sun.star.sheet.CellFlags.EDITATTR)Contents
getCellThisComponent.CurrentController.ThisComponent.CurrentController.ActiveSheet.getCellDim oSheet as Object[n]oSheet = ThisComponent.CurrentController.ActiveSheet[n]oSheet.getCellRangeByName($1)ByName(ByName(("B12:W27")).clearContents(com.sun.star.sheet.CellFlags.VALUE + com.sun.star.sheet.CellFlags.STRING + com.sun.star.sheet.CellFlags.DATETIME)(com.sun.star.sheet.CellFlags).Value + com.sun.star.sheet.CellFlags.STRING + com.sun.star.sheet.CellFlags.DATETIME + com.sun.star.sheet.CellFlags.ANNOTATION + com.sun.star.sheet.CellFlags.FORMULA + com.sun.star.sheet.CellFlags.HARDATTR + com.sun.star.sheet.CellFlags.STYLES + com.sun.star.sheet.CellFlags.OBJECTS + com.sun.star.sheet.CellFlags.EDITATTR)Contents

Rem Bildschirmmeldungen einschalten
Application.DisplayAlerts = True
ThisComponent.UnlockControllers

End Sub
Ob meine Vorgehensweise richtig war/ist weiß ich auch nicht.
Auf folgender Seite gab es ein wenig Hilfe.
https://www.openoffice.org/de/doc/oooau ... makros.pdf

Wer kann mir sagen was ich tun muss das der Code in Calc läuft?

Ich sage schon mal vielen Dank.

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,

Hmm, also das Konvertierungsprogramm ist wohl nicht wirklich gut und produziert viel "Mist";)

Ein erster Blick auf den ursprünglichen Code.... der könnte auch so unter OOo laufen, unter LibreOffice ziemlich sicher. Wenn Du dort die ursprüngliche Datei öffnest, sollte schon eigentlich alles funktionieren. Evt. musst Du die Buttons neu erzeugen und verknüpfen.

Du kannst den Code auch manuell rüberkopieren, dann muss aber in der ersten Zeile des Moduls (oder aller Module) stehen:

Code: Alles auswählen

Option VBASupport 1
Müsste also im Modul wie folgt aussehen:

Code: Alles auswählen

REM  *****  BASIC  *****
Option VBASupport 1

Sub CommandButton1_Click()

  Dim vntPathAndFile As String
                                               
  If Range("T5") = "" Then
    MsgBox "Keine Datum ausgewählt!"   
    Exit Sub
  End If
                                               
  If Range("T6") = "" Then
    MsgBox "Keine Schicht ausgewählt!"
    Exit Sub
  End If   
  
  '... und so weiter
  
Wie gesagt, sollte an sich so funktionieren.

Die Zeilen Mittig und am Ende mit den DisplayAlerts und Screenupdates würde ich weglassen. Die brauchts wahrscheinlich nicht und die dürften auch nicht gehen.

Die Probleme des konvertierten Codes:

Range() kennt OO Basic nicht, die würde abgebildet

Code: Alles auswählen

oSheet = ThisComponent.CurrentController.ActiveSheet
  if oSheet.oSheet.getCellRangeByName("T5") = "" then 
    MsgBox "Keine Datum ausgewählt!"   
    Exit Sub
  End If
das "Dim osheet as Object" kann man sich sparen, Basic legt die Variablen direkt an.

Die Zeile mit dem "oSheet = ...." brauchste im Makro nur einmal ... am Anfang. Damit ist das Objekt des Tabellenblattes gespeichert und Du kannst jederzeit darauf zurückgreifen, also direkt in jeder if-Abfrage.

So, da kannste schon mal was testen.

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 »

Hallo Tom,

Vielen Dank für deine Antwort.

Da habe ich was zu testen.
unter LibreOffice ziemlich sicher
Ich habe im Grunde genommen noch die Wahl ob ich OpenOffice nehme oder LibreOffice.
Wenn ich mich nicht täusche ist sogar nur die Portable Version drauf abgelegt.
LibreOffice gibt es auch in 64Bit. Und VBA läuft anscheinend besser.

Welche Version würdest du mir empfehlen?

Na dann werde ich mal ein bisschen probieren.

Vielen Dank nochmal.

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,

Welche Version würdest du mir empfehlen?
Ich würde die neueste LibreOffice Version empfehlen (7.3). LibreOffice wird sehr aktiv weiterentwickelt und hat sich insbesondere im Bereich der Kompatibilität stark an MS Office angeglichen.

Kommt aber sicher auch auf den verwendeten Rechner und das Betriebssystem an. Aber ein einigermaßen aktueller Rechner, ein 64 Bit BS (linux oder Windows 10 oder höher) - dann immer LibreOffice :))

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,

Vielen Dank für deine Antwort. Die hilft mir sehr weiter.

Du hattest Recht was den VBA Code betrifft, ich konnte ihn 1:1 einfügen.
Die ganzen MsgBox abfragen funktionieren. Wenn der Zielordner für das Speichern nicht da ist wird sogar erstellt.
Es kommt auch eine Abfrage ob gespeichert werden soll oder nicht.
Der Dateiname ist auch so wie ich es wollte.
Was aber nicht funktioniert sieht man wenn man die gespeicherte Datei öffnet.
Sie ist leer.
Das Makro läuft sauber durch, tut aber nicht wirklich etwas.

Da ich keine Fehlermeldung bekomme und viele Sachen vom Makro funktionieren kann ich nichts machen.
Ich vermute es liegt an diesen Zeilen:

Code: Alles auswählen

Rem Einfügen und speichern
ThisWorkbook.Sheets(1).Cells.Copy ActiveSheet.Cells(1)

With ActiveWorkbook
     .SaveAs Filename:=vntPathAndFile, FileFormat:=xlOpenXMLWorkbook
     .Close
End With
Screenshot 2022-02-07 180222.JPG
Screenshot 2022-02-07 180222.JPG (203 KiB) 3171 mal betrachtet

Wie man sieht ist hinter der Dialogbox nichts.
Wenn nichts kopiert wird kann auch nichts gespeichert werden.

Hättest du eine Idee?

Vielen Dank für deine Hilfe.

Gruß 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 MagneUser,
Hättest du eine Idee?
Hmm, so spontan erst mal nicht;) Dazu weis ich zu wenig über die Datei, die Funktion und das, was passieren soll.

Hat die Datei wichtige Daten drin, oder Geheimnisse oder personenbezogene Daten? Wenn nicht, kannst Du sie nicht einfach hier mit hochladen - dan kann man damit experimentieren. Und in Kurzfassung vielleicht noch schreiben, was genau passieren soll? Also das erwarete Verhalten?

Falls Du selbst testen möchtest würde ich wie folgt vorgehen:

In eine der ersten Codezeilen einen Haltepunkt setzen oder gleich das Makro in der IDE per Einzelschritt starten und dann Schritt für schritt durchgehen. Wenn Du einen großen Bildschirm hast, so siehst Du sowohl die IDE (im Verdergrund) als auch das Tabellenblatt im Hintergrund - jetzt kannst Du Schritt für Schritt verfolgen, was so passiert und den Punkt identifizieren, wo es von der Vorgabe abweicht.

Und kommentiere unbedingt die Zeilen

Code: Alles auswählen

Rem Bildschirmmeldungen auschalten
Application.DisplayAlerts = False
Application.ScreenUpdating = False
....
Rem Bildschirmmeldungen einschalten
Application.DisplayAlerts = True
Application.ScreenUpdating = True
aus. Die sind meiner Meinung eh überflüssig und blockieren lediglich den View-Controller so dass Du auch nichts mehr sehen würdest am Bildschim (von dem was passiern soll...).

Wenn ich das auf dem Bildschirm richtig sehe ist das eine Calc-DAtei (*.ods).

Der Code

Code: Alles auswählen

With ActiveWorkbook
     .SaveAs Filename:=vntPathAndFile, FileFormat:=xlOpenXMLWorkbook
     .Close
End With
speichert aber unter MS Format (.xlsx) - und zwar als "Save as" - also als zusätzliche Datei. Da sieht man in der aktuellen Datei gar nichts. Schau mal auf die Festplatte, ob dort eine Datei erzeugt wurde??

Aber alles Spekulationen - müsste man halt mal probieren ;)

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 »

Hallo Tom,

Vielen Dank für deine Antwort. Ja, sie hat personenbezogene Daten.

Ich kann die eine umgebaute Version hochladen.

Noch ein Hinweis ich habe die Datei auch in OO getestet und mit OO bekomme ich einen Laufzeitfehler 423 SaveAs.
Wie du weißt, bei LibreOffice passiert ja nichts.
Schau mal auf die Festplatte, ob dort eine Datei erzeugt wurde??
Ich sagte ja, das Makro läuft durch und es kommt eine Dialogbox mit dem richtigen Dateinamen,
ob gespeichert werden soll und es wird auch wirklich eine Datei erstellt.

Die Datei ist halt nur leer.

Vielen Dank nochmal für deine Unterstützung.

Kopie.ods
(27.15 KiB) 108-mal heruntergeladen

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,

ok, Datei habe ich - was ich aber immer noch benötige ist der gewünschte Arbeitsablauf.

Bis jetzt kann ich nur folgendes feststellen:

Code: Alles auswählen

Rem Wenn Dialog abgebrochen, dann Makro verlassen
If vntPathAndFile = "Falsch" Then Exit Sub

Rem Neue Arbeitsmappe erstellen
Workbooks.Add xlWBATWorksheet
Die erste Zeile ist Unsinn... die Variable vntPathAndFile ist mit einem String vorbelegt (siehe Zeile davor) und somit nie "falsch" ;)
Und die Zeile ruft auch keinen Dialog auf - kannste also löschen.

Die zweite Zeile erzeugt eine neue Datei - ist das so gewünscht? Und in die soll dann etwas kopiert werden? Also das komplette Tabellenblatt?

Wenn dem so ist und es so gewünscht wird, liegt der Fehler genau in dieser Zeile. Durch das Erzeugen der neuen Datei wird diese in den Vordergrund gerückt - und der Begriff "ThisWorkbook" bezieht sich dann auf die neue Datei. Hier funktioniert die Konvertierung dann nicht...

Da der Fokus nun auf der neuen Datei liegt und die dann geschlossen wird, funktionieren auch die Löschungen am Ende nicht mehr.

Schätze, das wirst Du doch nativ programmieren müssen :( ... aber, so schwer ist das auch nicht.

Hier noch mal der Anfang:

Code: Alles auswählen

Sub Datei_speichern()

  Dim vntPathAndFile As String
  
  REM Zugriff auf das aktuelle Dokument
  oDoc = ThisComponent
  REM Zugrif auf das aktuelle Tabellenblatt
  oSheet = oDoc.CurrentController.ActiveSheet
  
  REM Abfrage des Inhalts der einzelnen Zellen - Type 0 = leer 
  if oSheet.getCellRangeByName("T5").Type = 0 then 
    MsgBox "Keine Datum ausgewählt!"   
    Exit Sub
  End If
  ...
So kannst Du die anderen Abfragen schon mal umsetzen.
Beim Rest kann ich Dir helfen, sobald ich weis, was eigentlich gemacht werden soll...:)

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 »

Servus Tom,

Vielen Dank für deine Hilfe, ich wäre echt aufgeschmissen.

Sorry hattest du gesagt und ich habe es vergessen dir den Arbeitsablauf zu beschreiben.

Es ist aber ganz einfach und klein gehalten. Die Kollegen wählen rechts oben über Dropdown alles aus.
Während der Schicht tragen sie ihre Störungen ein und zum Feierabend sollen sie die Schaltfläche betätigen.
Aufgabe von dem Makro:
- Soll prüfen, ob sie alles ausgewählt haben, wenn nicht, dann die MsgBox anzeigen.
- Von der Tabelle eine Kopie mit den Einträgen, ohne Makros und ohne Button erstellen.
- Unter einem bestimmten Dateinamen speichern, der aus Datum + Schicht + Anlage aufgebaut ist.

Dann schaue ich mal, was ich schon vorbereiten kann. Weil der Hauptteil scheint ja wirklich das schwerste zu sein.

Vielen Dank noch mal für deine Mühe.

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,
Unter einem bestimmten Dateinamen speichern, der aus Datum + Schicht + Anlage aufgebaut ist.
Ich vermute mal, dass die Schichtergebnisse auf diese Art archiviert werden sollen. Wie wäre es denn, so als Idee, die Tabelle als pdf zu speichern?
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,

also, der Hinweis von mikeleb ist sehr gut und sollte beachtet werden. Wäre wahrscheinlich die bessere Lösung - falls die Dateien nicht mehr per Makro oder so ausgewertet werden....

Unabhängig davon hier mal der Rumpf-Code für das von Dir gewünschte Verfahren:

Code: Alles auswählen

REM  *****  BASIC  *****
Option explicit

Sub Datei_speichern()
  DIM oDoc as variant, oSheet as variant
  Dim oZielDoc as variant
  Dim vntPathAndFile As String
  dim arg(0) as new com.sun.star.beans.PropertyValue
  
  REM Zugriff auf das aktuelle Dokument
  oDoc = ThisComponent
  REM Zugrif auf das aktuelle Tabellenblatt
  oSheet = oDoc.CurrentController.ActiveSheet
  
  REM Abfrage des Inhalts der einzelnen Zellen - Type 0 = leer 
  if oSheet.getCellRangeByName("T5").Type = 0 then 
    MsgBox "Keine Datum ausgewählt!"   
    Exit Sub
  End If
  REM  hier die anderen Abfragen einpflegen
  
  
  REM Zieldatei Pfad und Name
  vntPathAndFile = convertToURL("D:\Stoerauswertung\" & Format(Now, "yyyy.mm.dd") & "_" & oSheet.getCellRangeByName("T6").string & "_" & "G26_TV" & ".ods") 
  
  REM Neue Calc-Datei erzeugen 
  Arg(0).Name = "Hidden"
  Arg(0).Value = false ' nach Tests auf true setzen:))
  oZielDoc = StarDesktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, arg())
  
  oZielDoc.storeAsURL(vntPathAndFile, array())
  
  REM jetzt aktuelles Tabellenblatt in neue Datei kopieren
  CopyTabToNewDoc(oSheet, odoc, oZielDoc)
  
  REM  der Button sollte hier noch entfernt werden - sonst bleibt die Info, dass das Dokument Makros enthält - was aber nicht stimmt
  
  REM Neues Dokument speichern und schliessen
  With oZielDoc
    .store()
    .close(true)
  end with
  
  REM löschen der Inhalte der Zellen des Quelldokumentes
  REM 1 = Werte, 2 = Datumwerte, 4 = Texte (Strings), 16 = Formeln
  REM #### korrekten Werte einfügen und anpassen!!! ###
  with oSheet
    .getCellRangeByName("A1").clearContents(1+2+4+16)
    .getCellRangeByName("D1:E1").clearContents(1+2+4+16)
  end with
  
  REM Cursor Ursprungsdokument auf Zelle 
  oDoc.CurrentController.Select(oSheet.getCellRangeByName("A1"))
  
  REM Dokument speichern
  oDoc.store()
  
end sub



'/** CopyTabToNewDoc
'*************************************************************************.
'* @kurztext kopiert ein übergebenes Tabellenblatt in eine andere Datei
'* Diese Funktion kopiert ein übergebenes Tabellenblatt einer Calc-Datei in eine
'* andere Calc-Datei, und zwar auf das Sheet(0) - also das erste Tabellenblatt
'*
'* @param1  oSheet as object    Das zu kopierende Tabellenblatt als Objekt  
'* @param2  oDoc as object      Das Quelldokument
'* @param2  oZielDoc as object  Das Zieldokument
'*
'* @return 
'*************************************************************************
'*/
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") 
  
  oFrame1 = oDoc.CurrentController.Frame 
  REM Das zu kopierende Tabellenblatt wird markiert
  oDoc.CurrentController.Select(oSheet)
  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
Funktioniert, musst Du halt noch entsprechend anpassen bzw. ergänzen.

Was nicht gut ist:
  • Der Name der Zieldatei. Ich würde keine Punkte im Dateinamen akzeptieren - das Datum also entweder schreiben "JJJMMDD" oder statt Punkten Bindestriche nehmen.
  • Eine Abfrage sollte eingebaut werden, ob die Zieldatei schon existiert - dann entsprechend Fehlermeldung oder so.
  • Beim Kopieren des Tabellenblattes wird auch der Button mitkopiert - nicht aber das Makro. Der Button behält aber die Verbindung. Das Dokument glaubt also, dass noch ein Makro drin ist - entsprechende Abfrage... der sollte entfernt werden....
Ich würde das neue Dokument versteckt erzeugen - das ist praxisnäher:) Ändere nach den Tests den entsprechenden Wert von False auf true.

Arbeit nur mit einer Kopie deines Arbeitsdokumentes zum TEsten ... nicht, dass es evt. Kaputt geht ;))

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,
mal eine Variante mit pdf-Export.
Die verschiedenen Fehlermeldungen habe ich mal zusammengefasst, sodass eine Gesamtmeldung kommt, wenn mehrere Dinge fehlen.

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 Instandhalter 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") & "_" & "G26_TV" & ".pdf"
		'setzte Speicherargumente für pdf-Export
		Dim arg(1) as new com.sun.star.beans.PropertyValue	
		arg(0).Name = "URL"	
		arg(0).Value = converttourl(vntPathAndFile)
		arg(1).Name = "FilterName"
		arg(1).Value = "calc_pdf_Export"
		oDoc.storetoUrl(arg(0).value,arg())	'exportieren als pdf
		
		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
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,
mikeleb hat geschrieben: Di, 08.02.2022 16:14 mal eine Variante mit pdf-Export.
Sehr schön :)

MagnaUser muss aber bewusst sein, dass diese Variante *alle* Tabellenblätter exportiert. Ich kenne die Orginaldatei nicht, wir haben ja nur eine verkürzte Beispieldatei erhalten.

Aber ich glaube man könnte das noch irgendwie auf die aktuelle Seite begrenzen....

VG 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,
jaaa - na klar.
Um nur die aktuelle Tabelle zu exportieren muss der pdf-teil erweitert werden:

Code: Alles auswählen

		Dim arg(2) as new com.sun.star.beans.PropertyValue	
		'setzte Speicherargumente
		arg(0).Name = "URL"	
		arg(0).Value = converttourl(vntPathAndFile)
		arg(1).Name = "FilterName"
		arg(1).Value = "calc_pdf_Export"
		'nur aktuelle Tabelle exportieren
		obereiche = oDoc.createInstance("com.sun.star.sheet.SheetCellRanges")
		obereiche.addRangeAddress(oSheet.getrangeaddress,0)
		Dim aFilterData(0) as new com.sun.star.beans.PropertyValue
		aFilterData(0).Name = "Selection"
		aFilterData(0).Value = obereiche
		arg(2).Name = "FilterData"
		arg(2).Value = aFilterData()
		oDoc.storetoUrl(arg(0).value,arg())	'exportieren als pdf
und ich vergaß noch: In der Schaltfläche muss die Option "Druckbar" auf nein gesetzt werden. Dann ist sie in der pdf verschwunden.
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 »

Guten Abend,

Wauu so viel ist passiert. Mist habe ich nicht mitbekommen.

@ mikeleb

falls die Dateien nicht mehr per Makro oder so ausgewertet werden...

So ein ärger genau das soll passieren da hast du dir lobenswerterweise Mühe gemacht die nicht nötig war.
Aber da bin ich raus. Die Störungen werden von einer anderen Abteilung ausgewertet.

Also so sieht die gespeicherte Datei aus nachdem ich auf den Button geklickt habe.
Es wird das ganze Makro in der Zelle A1 gespeichert.

Screenshot 2022-02-08 192832.JPG
Screenshot 2022-02-08 192832.JPG (87.05 KiB) 3027 mal betrachtet

Irgendetwas habe ich falsch gemacht aber ich kann dir nicht sagen was.
Das Makro läuft, es wird auch eine Datei erstellt mit dem richtigen Dateinamen.

Nur der Inhalt passt nicht.

Ist dein Code für OO oder LO ich nutze LO, weil du gesagt hattest das der VBA Code in LO sicher läuft.
Oder ist das egal bei deinem Code?

Vielen vielen Dank für Eure Hilfe und Mühe.

Grüße MagnaUser
Antworten