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

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

Re: VBA-Makro unter "Meine Makros" speichern

Beitrag von mikele » Do 9. Aug 2018, 12:32

Hallo,
wenn die Dateinamen die Struktur haben (20180806-1234567-umsatz.CSV, 20180806-12345678-umsatz.CSV), dann sollte auch folgendes reichen:

Code: Alles auswählen

varArbeitsblatt = split(thiscomponent.title,"-")(1)
Wenn du die aus der Datei Kontoauszüge_2018.ods heraus das Makro startest, dann ist ThisDocument diese Datei.
Mit

Code: Alles auswählen

oKontoDoc=ThisDocument
legst die dieses Objekt auf die Variable oKontoDoc (es ist üblich vor den eigentlichen Variablennamen einen kleinen Buchstaben zu setzen, der die Art der Variable charakterisiiert: o ... Objekt, s ... String, a ... Array etc.)
Wen du die cvs öffnest, legst du sie auf eine andere Variable

Code: Alles auswählen

oImportDoc=StarDesktop.loadComponentFromURL(...)
Nun kannst du auf die Tabellen sowohl des einen als auch des anderen Dokuments zugreifen.

Code: Alles auswählen

oKontoDoc.sheets.getByName(varArbeitsblatt)

Code: Alles auswählen

oImportDoc.close(false)
Du musst die Fenster selbst gar nicht wechseln, du willst ja nur auf die Daten zugreifen (und das ist unabhängig davon, was du am Bildschirm siehst).
Gruß,
mikele



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

Re: VBA-Makro unter "Meine Makros" speichern

Beitrag von Ich Bins » Fr 10. Aug 2018, 14:18

Hallo mikele,
Wenn du die aus der Datei Kontoauszüge_2018.ods heraus das Makro startest, dann ist ThisDocument diese Datei.

Code: Alles auswählen

oKontoDoc = ThisDocument
msgbox oKontoDoc
Liefert bei mir eine leere msgbox ?

Code: Alles auswählen

oKontoDoc = ThisComponent.Title
msgbox oKontoDoc
Liefert dagegen Kontoauszüge_2018.ods.
Wen du die cvs öffnest, legst du sie auf eine andere Variable

Code: Alles auswählen

oImportDoc=StarDesktop.loadComponentFromURL(...)
Falls ich die ... durch

Code: Alles auswählen

sFileURL,"_blank", 0, Args() 
ergänzen soll könnte ich auch nur den Variablennamen auswechseln, denn dieses Kommando hattes Du mir bereits einmal mit einem anderen Variablennamen gegeben.

Code: Alles auswählen

[b]oDocument[/b] = StarDesktop.loadComponentFromURL(sFileURL,"_blank", 0, Args())
Verstehe ich das richtg ?
Nun kannst du auf die Tabellen sowohl des einen als auch des anderen Dokuments zugreifen.
Wenn ich nach

Code: Alles auswählen

    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

Code: Alles auswählen

oKontoDoc.sheets.getByName(varArbeitsblatt)
eintrage erhalte ich den
BASIC-Laufzeitfehler.
Objektvariable nicht belegt.

Viele Grüße
Ich Bins

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

Re: VBA-Makro unter "Meine Makros" speichern

Beitrag von mikele » Sa 11. Aug 2018, 12:13

Hallo,
deine Nachfrage hat mir nochmal ein paar grundsätzliche Unterschiede in den Makrosprachen Excel-Calc vergegenwärtigt. Im folgenden ein paar Hintergründe:
Mit der Zeile

Code: Alles auswählen

oKontoDoc = ThisDocument
Wird (kurz gesagt) das aktuelle Dokument als Objekt (also als ganzes, mit allen EIgenschaften etc.) in der Variablen oKontoDoc abgelegt.
Die Zeile

Code: Alles auswählen

msgbox oKontoDoc
ist insofern sinnlos, weil per msgbox nur Text oder Zahlen ausgegeben werden können, aber kein ganzes Objekt.
Möchtest du den Titel (des Dokumentenfensters):

Code: Alles auswählen

msgbox oKontoDoc.Title
Möchtest du den Speicherort:

Code: Alles auswählen

msgbox oKontoDoc.URL
Wenn ich mich so richtig an die Excel-Programmierung erinnere (man mag mich gern korrigieren), dann beziehen sich dort die Bereichsangaben (Range, Columns, ...) immer auf die aktuell aktivierte Datei und das aktivierte Tabellenblatt. Das macht den Zugriff (syntaktisch) recht kurz.
Unter Calc läuft es etwas anders: Man geht immer die Objekthierarchie durch. Im einfachsten Fall: Dokument->Tabelle->Zelle. Wichtig für das Verständnis an der stelle halte ich, dass es dabei vollkommen egal ist, welches Dokument gerade aktiv ist und welches Tabellenblatt gewählt ist. Man muss also nicht erst ein anderes Tabellenblatt aktivieren, um auf dessen Elemente zuzugreifen.
Mit

Code: Alles auswählen

oDoc=ThisComponent
oTab=oDoc.Sheets.getByName("Tabelle2")
oCell=oTab.getCellRangeByName("A1")
greifst du auf die Zelle A1 in der Tabelle namens "Tabelle2" in dem Dokument zu in dem dieses Makro steht. Man kann es natürlich auch als Einzeiler schreiben:

Code: Alles auswählen

oCell=ThisComponent.Sheets.getByName("Tabelle2").getCellRangeByName("A1")
aber es ist häufig sinnvoll, die einzelnen Objekte auf einzelne Variablen zu legen, um dann an anderer Stelle einfacher darauf zuzugreifen.
Soweit ein kurzer Ausflug in die Theorie. Weitere Methoden und Eigenschaften findest du auf der bereits bekannten Seite www.dannenhoefer.de/faqstarbasic/index.html.
Noch mehr Details und Hintergründe hier: https://de.openoffice.info/viewtopic.php?f=18&t=1553
------------------------
Nun konkret:
Bei

Code: Alles auswählen

oKontoDoc.sheets.getByName(varArbeitsblatt)
BASIC-Laufzeitfehler.
Objektvariable nicht belegt.
Ist die Variable oKontoDoc belegt? Gibt es in der Datei, auf die oKontoDoc zielt, ein Tabelle, deren Name in varArbeitsblatt abgelegt ist?
Im Zweifelsfall poste bitte den gesamten Code oder hänge ihn (noch besser) in einer Datei eingebunden an.
Gruß,
mikele

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

Re: VBA-Makro unter "Meine Makros" speichern

Beitrag von Ich Bins » Sa 11. Aug 2018, 19:55

Hallo mikele,

vielen Dank für die Beschreibung der Unterschiede zw. VBA und StarBasic.
Inzw. ist mir auch klar geworden, dass ich mit meiner Vorgehesweise den Import aus der Kontodatei.ods zu starten "heavy on the woodway" war.
Ich öffnete zwar zuerst die Kontodatei.ods aber startete das Makro unter Meine Makros & Dialoge/Standard/Module.
Als ich nun das Makro in die Kontodatei.ods unter Standard/Module/Module1 speicherte und an dieser Stelle.
Zum Testen reduziere ich das Makro auf

Code: Alles auswählen

Sub Probe
oKontoDoc = ThisComponent.Title
msgbox oKontoDoc

oKontoDoc = ThisDocument
msgbox oKontoDoc.Title
End Sub
Un die wieder erhalte ich einen BASIC-Laufzeitfehler. '91' Objektvariable nicht belegt.

Viele Grüße
Ich Bins

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

Re: VBA-Makro unter "Meine Makros" speichern

Beitrag von mikele » Sa 11. Aug 2018, 20:56

Hallo,
gaaaanz grober Schnitzer von mir :oops: :oops: :oops:
Es muss natürlich

Code: Alles auswählen

oKontoDoc=ThisComponent
heißen (auch wenn damit auf das Document zugegriffen wird)
Gruß,
mikele

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

Re: VBA-Makro unter "Meine Makros" speichern

Beitrag von Ich Bins » So 12. Aug 2018, 00:36

Hallo mikele,

ja, jetzt erhalte ich keinen Fehler mehr.
Allerdings habe ich noch keinen Plan wie ich die neuen beeinigten, formatierten und gedrehten Transaktionsdaten am Ende der Kontoauszugsdatei anfügen kann. Die Zelle ab der die neuen Daten eingefügt werden sollen ist bereis festgelegt.

Es folgt das komplette Makro bei dem am Ende die aufbereiteten Daten jedoch noch in die csv-Datei kopiert werden.

Code: Alles auswählen

Sub cvs_imp()

	'Kontodatei.ods als Objekt in Variable schreiben
	oKontoDoc = ThisComponent
	'Dateiauswahl-Dialog erzeugen
	oFilePicker = createUnoService("com.sun.star.ui.dialogs.FilePicker")
	oFilePicker.setMultiSelectionMode(False)
	'Filter für die Dateiauswahl initialisieren
	oFilePicker.appendFilter("Alle Dateien", "*.*") 	
	oFilePicker.appendFilter("csv - Dateien", "*.csv")
	'Filter für cvs-Dateien aktivieren
	oFilePicker.setCurrentFilter("csv - Dateien")
	'Dialog aufrufen und auswerten
	if oFilePicker.execute()=1 then 'wenn nicht abgebrochen
		'Auslesen der gewählten Datei
		oFiles= oFilePicker.getFiles() 'url der datei
		'Setzen der Importoptionen
		sFileURL=oFiles(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
	    oImportDoc = StarDesktop.loadComponentFromURL(sFileURL,"_blank", 0, Args())
	end if
	varArbeitsblatt = split(oImportDoc.Title,"-")(1)
'	Zugriff auf das 1. Tabellenblatt
	oSheet = oImportDoc.Sheets(0)
	myColumn=oSheet.getColumns
	'Quell- und Zielspalten für Verschiebung
	aQuelle=array("D","C","F","I","E","H")
    aZiel=array("A","L","C","D","K","F")
	'Kopieren
	for i=0 to ubound(aQuelle)
		oQuelleRange=oSheet.Columns.getByName(aQuelle(i))
		oQuellRangeAddresse = oQuelleRange.getRangeAddress
		oZiel = oSheet.Columns.getByName(aZiel(i)).getCellByPosition(0,0)
		oZielCellAdresse=oZiel.getCellAddress
		oSheet.copyRange(oZielCellAdresse,oQuellRangeAddresse)
	next
	'Spalten leeren
	oSheet.Columns.getByName("E").ClearContents(1023)
	oSheet.Columns.getByName("I").ClearContents(1023)
'   Spalte BLZ und Währung löschen
    myColumn.removeByIndex(7,1)
    myColumn.removeByIndex(8,1)
	'neue Spaltenüberschriften
	oSheet.getCellByPosition(2,0).string="Kontoinhaber"
	oSheet.getCellByPosition(4,0).string="S-H"
	oSheet.getCellByPosition(7,0).string="Saldo"
'   Spaltenüberschrift fett formatieren
	oRange = oImportDoc.Sheets.getByIndex(0).getCellRangeByName("A1:J1")
  	oRange.CharWeight = com.sun.star.awt.FontWeight.BOLD
'   Spaltenbreite optimieren
	oSheet.Columns(0).OptimalWidth = True
	oSheet.Columns(1).OptimalWidth = True	
	oSheet.Columns(2).OptimalWidth = True	
	oSheet.Columns(3).OptimalWidth = True	
	oSheet.Columns(4).OptimalWidth = True	
	oSheet.Columns(5).OptimalWidth = True	
	oSheet.Columns(6).OptimalWidth = True
	oSheet.Columns(7).OptimalWidth = True	
    oSheet.Columns(8).Width = 4000
	oSheet.Columns(9).OptimalWidth = True	
'   Reihenfolge vertauschen
	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
'   ab hier stehen die aufbereiteten Daten zur Verfügung
'   letzte nicht leere Zeile in der Kontodatei ermitteln
	oSheet = oKontoDoc.Sheets().getByName(varArbeitsblatt)
	ocursor = oSheet.createCursor()
	ocursor.gotoStart()	
'   letzte Zelle des Bereiches
	ocursor.gotoEndofUsedArea(false)
'   letzte Zeile des Bereichs	
	varEinfuegezeile = ocursor.getRangeAddress.endRow + 3
'   Zelle zum Einfügen festlegen
    varBereich = "$E$" & varEinfuegezeile
    mycell = oSheet.getCellRangeByName(varBereich)
'   Test ob das Auswählen der Zelle korrekt war
	mycell.string = "Probe"
'   wie bekomme ich die neuen Daten hier angefügt ?

'   die nächste Zeile fügt die gedrehten Daten in die csv-Datei ein   
	oBereich.setDataArray(aDaten)
'   csv-Datei schließen
	oImportDoc.close(false)
End Sub
Viele Grüße
Ich Bins

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

Re: VBA-Makro unter "Meine Makros" speichern

Beitrag von mikele » So 12. Aug 2018, 12:17

Hallo,
das Ganze sieht schon gut aus.
Ein Hinweis: Achte auf den Umgang mit den Variablen. Nimm für verschiedene Tabellen verschiedene Variablen.
Das Schreiben der Daten am Ende ist ein bisschen knifflig, da man das .getDataArray vertsehen. Diese Methode liefert ein (eindimensionales) Array. Jedes Element repräsentiert eine Zeile des Bereiches. Jedes Element ist wiederum ein (eindimensionales) Array, bestehend aus den einzelnen Zellen der Zeile.
Mit

Code: Alles auswählen

    zeilen=ubound(aDaten())
ermittle ich die Dimension des Arrays aDaten() und somit die Zeilenanzahl (bei 0 beginnend zu zählen!).
Mit

Code: Alles auswählen

    zeilen=ubound(aDaten(0))
ermittle ich die Dimension des Arrays, das im Element aDaten(0) steckt, also die Spaltenanzahl.
Mit

Code: Alles auswählen

oZielBereich.setDataArray(aDaten())
werden die Werte des Arrays aDaten() in den Bereich oZielBereich geschrieben. Dazu muss der Bereich mit den Dimensionen des Arrays übereinstimmen.

Code: Alles auswählen

Sub cvs_imp()

	'Kontodatei.ods als Objekt in Variable schreiben
	oKontoDoc = ThisComponent
	'Dateiauswahl-Dialog erzeugen
	oFilePicker = createUnoService("com.sun.star.ui.dialogs.FilePicker")
	oFilePicker.setMultiSelectionMode(False)
	'Filter für die Dateiauswahl initialisieren
	oFilePicker.appendFilter("Alle Dateien", "*.*") 	
	oFilePicker.appendFilter("csv - Dateien", "*.csv")
	'Filter für cvs-Dateien aktivieren
	oFilePicker.setCurrentFilter("csv - Dateien")
	'Dialog aufrufen und auswerten
	if oFilePicker.execute()=1 then 'wenn nicht abgebrochen
		'Auslesen der gewählten Datei
		oFiles= oFilePicker.getFiles() 'url der datei
		'Setzen der Importoptionen
		sFileURL=oFiles(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
	    oImportDoc = StarDesktop.loadComponentFromURL(sFileURL,"_blank", 0, Args())
	end if
	varArbeitsblatt = split(oImportDoc.Title,"-")(1)
'	Zugriff auf das 1. Tabellenblatt
	oSheet = oImportDoc.Sheets(0)
	myColumn=oSheet.getColumns
	'Quell- und Zielspalten für Verschiebung
	aQuelle=array("D","C","F","I","E","H")
    aZiel=array("A","L","C","D","K","F")
	'Kopieren
	for i=0 to ubound(aQuelle)
		oQuelleRange=mycolumn.getByName(aQuelle(i))
		oQuellRangeAddresse = oQuelleRange.getRangeAddress
		oZiel = mycolumn.getByName(aZiel(i)).getCellByPosition(0,0)
		oZielCellAdresse=oZiel.getCellAddress
		oSheet.copyRange(oZielCellAdresse,oQuellRangeAddresse)
	next
	'Spalten leeren
	mycolumn.getByName("E").ClearContents(1023)
	mycolumn.getByName("I").ClearContents(1023)
'   Spalte BLZ und Währung löschen
    myColumn.removeByIndex(7,1)
    myColumn.removeByIndex(8,1)
	'neue Spaltenüberschriften
	oSheet.getCellByPosition(2,0).string="Kontoinhaber"
	oSheet.getCellByPosition(4,0).string="S-H"
	oSheet.getCellByPosition(7,0).string="Saldo"
'   Spaltenüberschrift fett formatieren
	oRange = oSheet.getCellRangeByName("A1:J1")
  	oRange.CharWeight = com.sun.star.awt.FontWeight.BOLD
'   Spaltenbreite optimieren
	oSheet.Columns(0).OptimalWidth = True
	oSheet.Columns(1).OptimalWidth = True	
	oSheet.Columns(2).OptimalWidth = True	
	oSheet.Columns(3).OptimalWidth = True	
	oSheet.Columns(4).OptimalWidth = True	
	oSheet.Columns(5).OptimalWidth = True	
	oSheet.Columns(6).OptimalWidth = True
	oSheet.Columns(7).OptimalWidth = True	
    oSheet.Columns(8).Width = 4000
	oSheet.Columns(9).OptimalWidth = True	
'   Reihenfolge vertauschen
	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- und Spaltenanzahl merken
    zeilen=ubound(aDaten())
    spalten=ubound(aDaten(0))
    'Zeilen vertauschen
    for i=0 to zeilen/2
		tmp=aDaten(zeilen-i)
		aDaten(zeilen-i)=aDaten(i)
		aDaten(i)=tmp
    next
'   ab hier stehen die aufbereiteten Daten zur Verfügung
'   letzte nicht leere Zeile in der Kontodatei ermitteln

'------andere Variablenbezeichnung wählen, oSheet bleibt für die csv
	oZiel = oKontoDoc.Sheets().getByName(varArbeitsblatt)
	ocursor = oZiel.createCursor()
'------Die folgende Zeile ist unnötig------
	ocursor.gotoStart()	
'------------------------------------------	
'   letzte Zelle des Bereiches
	ocursor.gotoEndofUsedArea(false)
'   letzte Zeile des Bereichs	
	varEinfuegezeile = ocursor.getRangeAddress.endRow + 3
'   Bereich zum Einfügen festlegen
'	Der Bereich muss dieselbe Größe haben, wie der Ursprungsbereich!
    oZielBereich = oZiel.getCellRangeByPosition(4,varEinfuegezeile,4+spalten,varEinfuegezeile+zeilen)
'   Test ob das Auswählen der Zelle korrekt war
'	mycell.string = "Probe"
'   wie bekomme ich die neuen Daten hier angefügt ?

'   die nächste Zeile fügt die gedrehten Daten in die csv-Datei ein   
	oZielBereich.setDataArray(aDaten)
'   csv-Datei schließen
	oImportDoc.close(false)
End Sub
Gruß,
mikele

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

Re: VBA-Makro unter "Meine Makros" speichern

Beitrag von Ich Bins » So 12. Aug 2018, 13:59

Hallo mikele,

jetzt ist es fast geschafft. :) Das Einfügen funzt nun fast perfekt, lediglich die Datumfelder werden als Zahlenwert eingefügt, ist aber egal, weil ich sowieso mit dem Pinsel (Format übertragen) das Zeilenformat des Altbestandes auf die neuen Daten übertrage. Seltsam ist, dass die letzte belegte Zeile

Code: Alles auswählen

'letzte Zeile des Bereichs	
varEinfuegezeile = ocursor.getRangeAddress.endRow + 3
nicht korrekt erkannt wird. Ich hätte erwartet, dass ich eine Zeile hinzuaddieren muss, aber ich musste 3 hinzuaddieren. Nachdem ich das Makro aus Deinem letzten Beitrag nutze muss ich 2 hinzuaddieren ?

Zu meiner Überaschung und Freude funzt das Makro auch aus "Meinen Makros & Module" heraus. :D

Viele Grüße
Ich Bins

balu
Beiträge: 304
Registriert: Mi 1. Jun 2011, 16:21

Re: VBA-Makro unter "Meine Makros" speichern

Beitrag von balu » So 12. Aug 2018, 14:32

Hallo ihr beiden,

ich konnte längere Zeit nicht mitmachen.
Da ich aber sehe, das ihr doch schon sehr weit gekommen seid, wollt ich noch ein par winzige kleinigkeiten los werden.

Code: Alles auswählen

mycolumn.getByName("E").ClearContents(1023)
Wo hast Du, mikele, die 1023 her?
Hab keine Ahnung ob sich LibreBasic sich in dieser hinsicht von StarBasic weiter entfernt (entwickelt) hat. Aber in StarBasic ist der maximale Wert 255, damit wird dann alles gelöscht.
Ferner weiss ich auch nicht ob das eventuell unter gewissen Umständen zu Problemen führen kann.

Ein Hinweis: Achte auf den Umgang mit den Variablen.
Korrekt.
Aber das fängt schon bei der Deklaration an. Und das vermisse ich ein wenig. Die Defenition ist ja so weit vorhanden. Um Probleme zu vermeiden würde ich noch zumindest die wichtigsten Elemente deklarieren.

Code: Alles auswählen

Sub cvs_imp()
Dim oKontoDoc as Object, oImportDoc as Object 

	'Kontodatei.ods als Objekt in Variable schreiben
	oKontoDoc = ThisComponent
	'Dateiauswahl-Dialog erzeugen
Gleich noch mehr dazu.

Nimm für verschiedene Tabellen verschiedene Variablen.
Nicht nur für die, sondern auch für Dateien. Was mikele jetzt ja schon gemacht hat.

Code: Alles auswählen

oSheet = oImportDoc.Sheets(0)
An dieser Stelle würde ich persönlich das Konsequent weiter durchziehen, und diesem Blatt einen anderen, sprechenderen Namen vergeben.
Wie wäre es denn beispielsweise hiermit?

Code: Alles auswählen

oExtCSVBlatt = oImportDoc.Sheets(0)
eigentlich einfach zu merken.
Ext = Abkürzung für Externe
CSV = spricht ja für sich selbst.
Blatt = auch selbstredend

Daraus folgt dann im nächsten Schritt.

Code: Alles auswählen

	oExtCSVSpalte = oExtCSVBlatt.getColumns
Und folglich sieht das dann im weiteren Verlauf, Auszugsweise, wie folgt aus.

Code: Alles auswählen

	oExtCSVSpalte.getByName("E").ClearContents(255)
	oExtCSVSpalte.getByName("I").ClearContents(255)
Hier habe ich jetzt mal den Wert für das löschen schon auf 255 gesetzt.
Nun kann man auch besser nachvollziehen welche Code-Zeile in einem längeren Makro sich auf was bezieht.

Jetzt noch mal zurück zu der Deklaration.
Ich finde das das Externe Blatt eine wichtige Rolle spielt, und deshalb sollte dies auch dementsprechend deklariert werden. Wodurch sich der vorherige Vorschlag auf das hier ändert.

Code: Alles auswählen

Sub cvs_imp()
Dim oKontoDoc as Object, oImportDoc as Object, oExtCSVBlatt as Object 

	'Kontodatei.ods als Objekt in Variable schreiben
	oKontoDoc = ThisComponent
	'Dateiauswahl-Dialog erzeugen
Nun noch eine kleinigkeit.
Das hier (noch mit dem alten Variablennamen)

Code: Alles auswählen

	oSheet.Columns(0).OptimalWidth = True
	oSheet.Columns(1).OptimalWidth = True	
	oSheet.Columns(2).OptimalWidth = True	
	oSheet.Columns(3).OptimalWidth = True	
	oSheet.Columns(4).OptimalWidth = True	
	oSheet.Columns(5).OptimalWidth = True	
	oSheet.Columns(6).OptimalWidth = True
	oSheet.Columns(7).OptimalWidth = True	
würde ich auf das hier ändern, jetzt mit meinem Ändrungsvorschlag für das Externe Blatt.

Code: Alles auswählen

	For iSl = 0 to 7
		oExtCSVBlatt.Columns(iSl).OptimalWidth = True
	next iSl
Anstatt 7 Zeilen jetzt nur noch 3.
iSl = freie Variablenbezeichnung für den Zähler, bedeutet: integerSpalteLöschen.

Damit keine Missverständnisse entstehen.
Ich will auf keinen Fall Eure bisherige geleistete Arbeit schmälern, oder runter machen. Sondern lediglich noch ein paar Tipps geben, die besonders für 'Ich Bins', von nutzen sind. Zumal ich ja selber aus leidvoller Erfahrung weiss wie die Hitze der vergangen Tage einem zu schaffen machte. Und deshalb geht mein voller RESPEKT an mikele für die geleistete Arbeit. *Hut-ab*

Denn beispielsweise die Variablen deklaration ist, so weit ich mich recht erinnere, in LibreBasic (StarBasic) anders als in VBA.
Wenn in LibreBasic mehrere Variablen in ein und der gleichen Zeile geschrieben werden, dann MÜSSEN alle dortigen Variablen mit ihrem Typ zugeordnet werden, wie mein Vorschlag es ja zeigt.
Das heißt aber auch, man kann auf diese Art und Weise verschiedene Variablentypen in der gleichen Zeile unterbringen.
Ein kleines Beispiel.

Code: Alles auswählen

Dim oHaus as Object, iZahlen as Integer, sSchrifttext as String.
oHaus, iZahlen und sSchrifttext sind jetzt nur fantasienamen, der Rest aber entspricht realen Variablentypen.


@Ich Bins
Schade, habe deinen letzten Beitrag zu spät gesehen (bin im Texte schreiben nicht der schnellst :? ). Ich muss gleich wech. Aber Du bist ja bei mikele sehr gut aufgehoben ;) .


Viel Spaß noch



Gruß
balu

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

Re: VBA-Makro unter "Meine Makros" speichern

Beitrag von mikele » So 12. Aug 2018, 15:20

Hallo balu,
danke für die Blumen ;)
Die CellFlags für .clearcontents kommen von hier: https://www.openoffice.org/api/docs/com ... Flags.html
Je nachdem, was man alles löschen will, muss man die entsprechenden Konstanten addieren. Die maximale Summe (1+2+4+...+512=1023) löscht dann alles.
Ja, ich weiß, mit der Variablendeklaration bin ich "etwas" schludrig ... :oops:
Danke für die, wie immer, schöne Darlegung der Problematik. Missverständnisse kommen da keine auf!
Gruß,
mikele



Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste