BITTE helfen Sie uns HEUTE mit einer SPENDE
Helfen Sie das LibreOffice Forum zu erhalten!

❤️ DANKE >><< DANKE ❤️

> KEINE WERBUNG FÜR REGISTRIERTE BENUTZER!<
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

VBA-Makro unter "Meine Makros" speichern [GELÖST]

Alles zur Programmierung im LibreOffice.
mikele
Beiträge: 1642
Registriert: Mo 1. Aug 2011, 20:51

Re: VBA-Makro unter "Meine Makros" speichern

Beitrag von mikele » Mo 6. Aug 2018, 11:51

Hallo,
mein Fehler: es muss .clearcontents(1023) heißen, damit aller Zellinhalt gelöscht wird.
Auch deine .csv wird bei mir (LO 5.4.6.2) ohne Fehler durch das Makro bearbeitet. Mit welcher Programmversion arbeitest du?
Gruß,
mikele

Ich Bins
Beiträge: 236
Registriert: Do 2. Aug 2018, 12:30

Re: VBA-Makro unter "Meine Makros" speichern

Beitrag von Ich Bins » Mo 6. Aug 2018, 12:27

Hallo mikele,
es muss .clearcontents(1023) heißen, damit aller Zellinhalt gelöscht wird.
Damit kann man Textinhalte und nummerische Inhalte entfernen. Wo finde ich dazu eine Beschreibung ?

Nachdem jetzt die Struktur der Tabelle meinen Vorstellungen entspricht, muss die Tabelle "NUR" noch absteigend sortiert werden.
Es fehlt jedoch eine eindeutige Spalte. Dazu benötige ich eine weitere Spalte mit Namen ID in die ich aufsteigend 1- Nummer der letzten belegten Zeile einfügen möchte. Die letzte belegte Zeile kann ich inzw. dank Dannenhoefers Beispiel
http://www.starbasicfaq.de/Wiekannmandi ... palte.html ermitteln.

Code: Alles auswählen

    oCellCursor = oSheet.createCursor
    oCellCursor.GotoEndOfUsedArea(False)
    nRow = oCellCursor.getRangeAddress().endRow
Jedoch habe ich noch keinen Plan wie ich in die Spalte ID 1 - nRow eintragen und danach die gesamte Tabelle nach ID absteigend sortieren kann.

Viele Grüße
Ich Bins

mikele
Beiträge: 1642
Registriert: Mo 1. Aug 2011, 20:51

Re: VBA-Makro unter "Meine Makros" speichern

Beitrag von mikele » Mo 6. Aug 2018, 12:44

Hallo,
da du "nur" die Reihenfolge vertauschen möchtest, würde ich folgendes machen:

Code: Alles auswählen

	oCellCursor = oSheet.createCursor
    oCellCursor.GotoEndOfUsedArea(False)
    oBereich=oSheet.getCellRangeByPosition(0,1,oCellCursor.getRangeAddress().endColumn,oCellCursor.getRangeAddress().endRow)
    'Zellinhalt in Array lesen
    aDaten()=oBereich.getDataArray
    'Zeilen vertauschen
    zeilen=ubound(aDaten())
    for i=0 to zeilen/2
		tmp=aDaten(zeilen-i)
		aDaten(zeilen)=aDaten(i)
		aDaten(i)=tmp
    next
    'Daten in Zellen zurückschreiben
	oBereich.setDataArray(aDaten)
Wo finde ich dazu eine Beschreibung ?
Hier: https://api.libreoffice.org/docs/idl/re ... Flags.html
Alle Flags addiert (also alles löschen) ergibt dann 1023.
Gruß,
mikele

mikele
Beiträge: 1642
Registriert: Mo 1. Aug 2011, 20:51

Re: VBA-Makro unter "Meine Makros" speichern

Beitrag von mikele » Mo 6. Aug 2018, 12:47

Hallo,

... zu schnell eingefügt :oops: grober Fehler im Makro
Korrektur:

Code: Alles auswählen

oCellCursor = oSheet.createCursor
    oCellCursor.GotoEndOfUsedArea(False)
    oBereich=oSheet.getCellRangeByPosition(0,1,oCellCursor.getRangeAddress().endColumn,oCellCursor.getRangeAddress().endRow)
    'Zellinhalt in Array lesen
    aDaten()=oBereich.getDataArray
    'Zeilen vertauschen
    zeilen=ubound(aDaten())
    for i=0 to zeilen/2
		tmp=aDaten(zeilen-i)
		aDaten(zeilen-i)=aDaten(i)
		aDaten(i)=tmp
    next
    'Daten in Zellen zurückschreiben
oBereich.setDataArray(aDaten)
Gruß,
mikele

Ich Bins
Beiträge: 236
Registriert: Do 2. Aug 2018, 12:30

Re: VBA-Makro unter "Meine Makros" speichern

Beitrag von Ich Bins » Mo 6. Aug 2018, 13:44

Hallo mikele,

Du bist der Zweitgrößte, der Erste ist mir noch nicht begegnet. ;)
Das funzt astrein. Nochmals vielen herzlichen Dank! :D

Mittlerweile musste ich leider feststellen, dass bei mir bereits der Kalk rieselt. :(
Bei der csv-Datei lief das Makro nur nicht, weil ich es wie die auch die ods-Datei aus meinem Dateimanager FreeCommander XE heraus mit einem Doppelklick öffnete. Die csv wird dabei jedoch mit Excel geöffnet. Weil nach dem Schließen einer ods noch der Basic Editor von LO geöffnet bleibt bemerkte ich nicht, dass die csv von Excel geöffnet wurde. :oops:

Übrigens, ich habe die LO Version 6.0.5.2 (x64) unter Win7 64 Bit installiert.

Viele Grüße
Ich Bins
Zuletzt geändert von Ich Bins am Mo 6. Aug 2018, 16:17, insgesamt 1-mal geändert.

Ich Bins
Beiträge: 236
Registriert: Do 2. Aug 2018, 12:30

Re: VBA-Makro unter "Meine Makros" speichern

Beitrag von Ich Bins » Mo 6. Aug 2018, 16:16

Hallo zusammen,

zwei kleine Schönheitsfehler sind mir beim Einfügen einer neuen csv-Umsatzdatei in meine Kontoauszugsdatei aufgefallen.

Erstens:
Die Felder Buchungstag und Valutadatum sind als Textfeld (@) formatiert.
Ursächlich liegt es daran, dass ich beim Öffnen der csv-Datei im Textimport-Fenster nur Ok geklickt habe.
Wähle ich im Textimport-Fenster bei den Datumfeldern Datum (TMJ) werden diese Feldeinhalte nach der Makro-Bearbeitung korrekt in die Konoauszugsdatei integriert.

Was den Umgang mit den Kontoauszugsdateien betrifft erhielt ich vor Jahren von einem EDV-Mitarbeiter meiner Bank den Tipp diese Dateien per drag and drop einem Excel-Fenser zu übergeben. Excel öffnet dabei die csv-Datei ohne Textimport-Fenster und die beiden Felder Buchungstag und Valutadatum haben das Format Datum *14.03.2001. Die gleiche Vorgehensweise öffnet in Calc das Textimport-Fenster und wenn ich dann nur Ok klicke werden die beiden Felder als Textfeld (@) formatiert.

Falls man in Calc das Textimport-Fenster nicht umgehen kann würde ich das Format der Felder Buchungstag und Valutadatum gerne im Makro ins Format Datum TT.MM.JJJJ ändern. Da es auch von Hand nicht einfach ist nachträglich aus dem Textformat ein Datumformat zu machen geling mir dies in Basic schon gar nicht.

Zweitens:
Das Feld Verwendungszweck kann sehr viele Zeichen enthalten, wenn es z.B. 182 Zeichen enthält wird es beim Öffnen mit Calc mit einer Breite von 35,54 cm angezeigt. Excel dagegen zeigt nach dem Öffnen eine csv alle Felder in einer Breite von 10,71 (80 Pixel) an.
Zum Einstellen der Feldbreite konnte ich bisher nur

Code: Alles auswählen

	oSheet.Columns(8).OptimalWidth = True
finden.

In Excel verwende ich

Code: Alles auswählen

    Columns("B:B").ColumnWidth = 28.00
um die Feldbreite zu bestimmen.

Gibt es in StarBasic einen vergleichbaren Befehl ?

Viele Grüße
Ich Bins

mikele
Beiträge: 1642
Registriert: Mo 1. Aug 2011, 20:51

Re: VBA-Makro unter "Meine Makros" speichern

Beitrag von mikele » Mo 6. Aug 2018, 18:51

Hallo,
Spalten haben die Eigenschaft .width, die die Spaltenbreite in 1/100 mm enthält.
Um das Textimportfenster zu umgehen, könnte man das Öffnen der Datei (inkl. Importregeln) in das Makro integrieren:

Code: Alles auswählen

Sub cvs_bereinigen
	'Dateiauswahl-Dialog erzeugen
	filepicker = createUnoService("com.sun.star.ui.dialogs.FilePicker")
	filepicker.setMultiSelectionMode(False)
	'Filter für die Dateiauswahl initialisieren
	filepicker.appendFilter("Alle Dateien", "*.*") 	
	filepicker.appendFilter("csv - Dateien", "*.csv")
	'Filter für cvs-Dateien aktivieren
	filepicker.setCurrentFilter("csv - Dateien")
	'Dialog aufrufen und auswerten
	if filepicker.execute()=1 then 'wenn nicht abgebrochen
		'Auslesen der gewählten Datei
		files= filepicker.getFiles() 'url der datei
		'Setzen der Importoptionen
		'siehe auch https://wiki.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Filter_Options
		sURL=files(0)
		Dim Args(2) as New com.sun.star.beans.PropertyValue
		args(1).Name = "FilterName"
		args(1).Value = "Text - txt - csv (StarCalc)"
		args(2).Name = "FilterOptions"
		args(2).Value = "59,34,0,1,2/4/3/4,0,false,true,true"
		'Öffnen des Dokuments
		oDocument = StarDesktop.loadComponentFromURL(sURL,"_blank", 0, Args())
		'weiter mit der Dateibehandlung
		... 
		
	end if
End Sub

Danach könntest du das Teil dann natürlich auch gleich noch automatisiert abspeichern ...
Gruß,
mikele

Ich Bins
Beiträge: 236
Registriert: Do 2. Aug 2018, 12:30

Re: VBA-Makro unter "Meine Makros" speichern

Beitrag von Ich Bins » Di 7. Aug 2018, 02:03

Hallo mikele,

Du bist Schuld, wenn ich MS-Office deinstalliere und auf LO umsteige.
Dein Dateiöffnen-Beispiel incl. Importfilter kann ich gut gebrauchen, aber bei den Importregeln blicke ich nicht durch.
Es müsste da ja auch möglich sein die unerwünschte Felder nicht zu importieren.

Die Spalte "Verwendungszweck" verkleinere ich nun mit

Code: Alles auswählen

    oSheet.Columns(8).Width = 4000
Die csv-Dateien speichere ich nach der Bearbeitung nicht.
Die fertig formatierten Daten der csv-Datei kopiere ich von Hand an das Ende meiner Kontoauszugsdatei, wobei ich eine Leerzeile zwischen dem Altbestand und den neu hinzugefügten Daten stehen lasse. Die Leerzeile hilft mir dopplete Transaktionen zu erkennen und somit zu vermeiden.

Deine Hilfe weckt Begehrlichkeiten.
Ich habe jetzt auch schon an ein automatisches Anfügen der neuen Transaktionen gedacht.

Calc starten durch einen Dopplklick auf die Datei Kontoauszug.ods.
Makro starten, csv-Datei auswählen.
Bereinigte Daten kopieren.
In einer Listbox die Kontonummer (Name des Arbeitsblattes) auswählen.
Gewältes Arbeitsblatt öffnen
Kopierte Daten unten nach einer Leerzeile einfügen.

Viele Grüße
Ich Bins

mikele
Beiträge: 1642
Registriert: Mo 1. Aug 2011, 20:51

Re: VBA-Makro unter "Meine Makros" speichern

Beitrag von mikele » Di 7. Aug 2018, 12:02

Hallo,
Du bist Schuld, wenn ich MS-Office deinstalliere und auf LO umsteige.
Das geht mit Excel natürlich auch ... ;) , aber mit Calc eben auch (wenn auch manchmal etwas anders) 8-) 8-) 8-)
Eine csv-Datei wird stets als ganzes importiert (ich wüsste nichts anderes). Es gibt auch die Möglichkeit, die Datei zeilenweise auszulesen (ohne sie direkt zu öffnen), aber das ist auch nicht ohne Hindernisse.
Ich habe jetzt auch schon an ein automatisches Anfügen der neuen Transaktionen gedacht.
Das wird sinnvoll.

Ein großer Teil ist ja schon fertig.
Zwei Anmerkungen:
1) Die Kontonummer ist doch in der (Original-)csv vorhanden. Die Auswahl des Tabellenblattes sollte entfallen können.
2) Das Kopieren der Daten ist mit dem Einlesen/Sortieren (.getDataArray) schon geschehen. Dieses Array muss jetzt nur noch an die richtige Stelle gesetzt werden.
Gruß,
mikele

Ich Bins
Beiträge: 236
Registriert: Do 2. Aug 2018, 12:30

Re: VBA-Makro unter "Meine Makros" speichern

Beitrag von Ich Bins » Di 7. Aug 2018, 23:30

Hallo mikele,
Eine csv-Datei wird stets als ganzes importiert (ich wüsste nichts anderes).
Habs getestet - Du hast recht. Schade, denn bei Excel ist es möglich. Wäre schon gewesen, macht aber nichts, das Bereinigen ist ja bereits erledigt.

Zu 1. Auch die csv-Dateien enthalten im Dateinamen die Kontonummer.
Beispiele: 20180806-1234567-umsatz.CSV, 20180806-12345678-umsatz.CSV. Da die Kontonummer unterschiedlich lang ist müsste man nach dem Öffnen der Importdatei Beispielsweise mit

Code: Alles auswählen

	Select Case len(thiscomponent.title)
	Case 27
		varArbeitsblatt = mid(thiscomponent.title,10,7)
	Case 28
		varArbeitsblatt = mid(thiscomponent.title,10,8)	
	End Select
	msgbox varArbeitsblatt
die Kontonummer auslesen.

Zu 2. Ja stimmt, bevor ich Umsatzdaten anfüge öffne ich die Datei Kontoauszüge_2018.ods. Innerhalb dieser Datei starte ich das Makro. Im Makro wird zunächst der Name der Datei Kontoauszüge_2018.ods in Variable "varDateiname" geschrieben. Danach wird die csv-Datei bereinigt und sortiert. Jetzt wieder zum Fenster "varDateiname" wechseln, Arbeitsblatt "varArbeitsblatt" öffnen und zwei Zeilen unter dem letzten Datensatz die neuen Transaktionen eintragen. Csv-Datei schließen. Makro Ende.

Habe erfolglos versucht mit Hilfe
http://www.dannenhoefer.de/faqstarbasic ... ehlen.html
den Fensterwechsel auf die Reihe zu bekommen musste aber passen.

Viele Grüße
Ich Bins

An alle, die das LibreOffice-Forum nutzen:


Bitte beteiligen Sie sich mit 7 Euro pro Monat und helfen uns bei unserem Budget für das Jahr 2024.
Einfach per Kreditkarte oder PayPal.
Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet.

❤️ Vielen lieben Dank für Ihre Unterstützung ❤️

Antworten