Hallo Olaf,
Olaf hat geschrieben:Vielen Dank für deine Hilfe.
Gern geschehen.
Olaf hat geschrieben:Ich habe ein Problem mit deiner Tabelle Zellbereich_Inhalt_löschen.ods, denn wenn ich auf den Button klicke, passiert nichts.
Gründe:
- Die Makrosicherheit ist auf HOCH eingestellt.
Wenn Du in diesem Modus ein Dokument mit Makros öffnest, werden die Makros automatisch deaktiviert.
Es sei denn, Du hast in den Einstellungen für die hohe Makrosicherheit einen vertrauswürdigen Ordner
definiert und/ oder ein Sicherheitszertifikat festgelegt.
- Menü Extras → Optionen...
- LibreOffice → Sicherheit
- Button "Makrosicherheit"
- Es öffnet sich das Fenster "Makrosicherheit"
- Register "Sicherheitslevel"
Die verschiedenen Level veranlassen LibreOffice zu verschiedenen Aktion.
Ist dort beschrieben.
- Empfohlen wird Sicherheitslevel = HOCH
- In diesem Fall musst Du unbedingt Dein Dokument in einem vertrauenswürdigen Ordner speichern
und LibreOffice unter Register "Vertrauenwürdige Quellen" diesen Speicherort mitteilen.
Du kannst auch Zertifikate verwenden, hiermit habe ich allerdings keinerlei Erfahrung.
Ich weiß nur, dass es kostenpflichtige und freie Sicherheitszertifikate gibt.
Suche im Netz nach:
Libreoffice Makro Zertifikate
- wählst Du die Option Level = MITTEL,
dann wirst Du jedesmal beim Öffnen des Dokuments gefragt, ob "Makros aktiviert" werden sollen.
- Beachte meine HInweise im hochgeladenen Dokument:
Makro Schaltfläche.ods
Dort habe ich beschrieben, dass der Entwurfsmodus ausgeschaltet sein muss, damit ein Button funktioniert.
Olaf hat geschrieben: Das mit dem Button habe ich soweit hinbekommen. Das Problem vor dem ich stehe ist, dass ich diese Tabelle auch für andere bereit stellen möchte. Daher soll es auch eine Version geben, welche Excel kompatibel ist.
- Excel und Calc sind nicht 100%-kompatibel.
Die Foren sind voll von Hilferufen "Mein Dokument ist Schrott, was kann ich tun", usw.
Die Ursache kann ein wechselseitiges Speichern von Excel nach Calc und umgekehrt sein.
Die Dateien (Excel/ Calc) basieren zwar auf dem ODF-Standard, allerdings nicht zu 100% und genau dies führt zu Inkompatibilitäten.
Auf jeden Fall sind hier Sicherungskopien unbedingt erforderlich
Installiere Dir diese Extension:
Timestamp Backup
- Die Arbeitsweise sähe z.B. so aus.
- Du bearbeitest Dein Dokument und speicherst ganz normal über Tastenkombi, das Menü oder Symbol.
- Nach der Installation gibt es zusätzlich eine Option in
Menü Datei → "Speichern, auch als BackUp mit Zeitstempel
Diese Sicherungskopie, inklusive Datum- und Zeitstempel befindet sich dann im Backup-Ordner des Benutzerrprofil.
Siehe auch Beschreibung auf der verlinkten Website.
Auf diese Weise kannst Du eine ganze Serie von Backup's mit unterschiedlichen Bearbeitungszuständen speichern.
Sollte mal ein Datencrash erfolgen, dann hast Du zumindest nur einen kleinen Teil Deiner Arbeit verloren.
- Eine weitere Problematik sind Makros.
- Excel arbeitet mit VBA-Makros
- Calc mit Starbasic-Makros
Beides sind erweiterte Basic-Derivate, die Standards sind aber gänzlich verschieden.
- Ein Starbasic-Makro kannst nicht unter Excel laufen lassen.
- Ein VBA-Makro kannst nur bedingt unter Calc laufen lassen.
Damit die Basic-IDE von LibreOffice angewiesen wird ein VBA-Makro auszuführen muss
in das jeweilige Makromodul in oberster Zeile folgende Anweisung stehen:
Siehe auch hier: https://help.libreoffice.org/latest/de/ ... 03350.html
Problematik:
Der Basic-IDE-Interpreter versteht zwar einige VBA-Anweisungen, ist aber auch nicht zu 100% kompatibel.
Das heißt ein VBA-Code muss so geschrieben werden, dass der Interpreter ihn korrekt ausführt.
Erschwerend kommt hinzu, dass ältere Libreoffice Versionen/ Releases den VBA-Code u.U. nicht richtig umsetzen.
Gleiches gilt für Openoffice.
Ich denke jetzt stehst Du vor einem Dilemma.
Excel oder Calc oder zweigleisig fahren:?:
Olaf hat geschrieben:Makros habe ich erstellt.
Mit dem Makrorekorder oder mittels
Starbasic-Programmierung auf Basis der API.
Olaf hat geschrieben:Hierbei habe ich die Daten immer in 0 geändert. Egal was ich tat, das Makro machte nie was es sollte.
In Deinen Beipsieldateien habe ich gesehen, dass Du Auswahllisten in den Zellen benutzt.
Im ersten Screenshot war dies nicht eindeutig zu sehen.
Bei der Starbasic-Programmierung muss man auf die Objekte zugreifen, um auf deren Eigenschaften, Methoden, Interfaces und Services zuzugreifen.
In Meinem Beispielprogramm greife ich auf einen zusammenhängenden Zellbereich zu.
So kann ich dann im Code auf Eigenschaften, Methoden, Interfaces und Services, usw. ddes Zellbereichs zugreifen.
Damit dies funktioniert verwende ich Zeiger (Objektvariable), welche auf die einzelnen
Objekte verweisen und auf diese Weise Zugriff auf zuvor beschriebenes erlauben.
Code: Alles auswählen
REM Objektvariable deklarieren
DIM oDoc as Object
' Referenz/ Zeiger auf das aktuelle Dokument setzen
oDoc=ThisComponent
Die Objektvariable "oDoc" ist der Zeiger, welcher auf "ThisComponent" zeigt.
Damit "beinhaltet" die Variable "oDoc" alle Eigenschaften, Methoden, Interfaces und Services, usw.
Das Ganze ist hierachisch aufgebaut.
"ThisComponent" steht für das aktuelle Dokument.
Das aktuelle Dokument besteht aus Tabllenblättern:
Code: Alles auswählen
REM Objektvariablen
DIM oDoc as Object
Dim oSheet1 as Object
oDoc=ThisComponent
oSheet1=oDoc.Sheets().getByIndex(0)
bedeutet: Hallo Interpreter ich will Tabellenblätter
Ich will aber nicht alle Tabellenblätter, sondern nur das erste Tabellenblatt (Index = 0)
ODER so:
Ich denke es ist hiermit klar geworden, das man von einer höheren Objektebene
sich per Code in eine tiefer Ebene bewegen kann; Vom Prinzip her eine Pfadangabe
Dokument\Tabellenblätter\"Tabelle1"
Dokument\Tabellenblätter\"Tabelle1"\Zelle
oder
Dokument\Tabellenblätter\"Tabelle1"\Zellbereiche
Warum der Code nicht korrekt funktioniert?
Ich vermute, dass Du nicht auf die Auswahllisten zugreifst.
Eine Auswahlliste ist das untergeordnete Objekt einer Zelle (nicht eines Zellbereichs

)
Zelle("D4").Validation
An dieser Stelle stehe ich vor einem Problem
Mein Problem ist:
Bei einem DropDown-Steuerelement kann man auf die einzelnen Einträge per Index zugreifen.
Damit läßt sich der Cursor steuern, in etwa so:
Damit wird der Cursor an die erste Position aller Einträge gesetzt.
In Deinem Fall wäre es z.B. "00" oder "0"
Eine Auswahlliste ist jedoch kein Dropdown-Menü.
Der Zugriff erfolgt mit:
Das Objekt "
oVal" besitzt
keine Methode um den Cursor zu
steuern, zumindest habe ich keine
unmittelbare Methode gefunden.
Es kann sein, dass man einen Service laden muss, damit man den Cursor in der Auswahlliste steuern kann.
Ich weiß im Augenblick noch nicht wie ich dies bewerkstelligen soll.
FAZIT:
Es nutzt also nichts den Zellinhalt zu löschen oder auf NULL zu setzen,
sondern man muss die Auswahlliste steuern.
Ich werde versuche eine Methode zu finden. Kann Dir aber nichts versprechen.
Ggf. gibt es noch einen interessierten Leser/ Helfer der sich mit der Programmierung von Auswahllisten auskennt.