🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱
🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀
>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗
[gelöst] =INDIREKT() in BASIC realisieren wie?
[gelöst] =INDIREKT() in BASIC realisieren wie?
Hallo zusammen,
ich möchte in einem Directory aus mehreren CalcTabellen per =INDIREKT(...) Werte auslesen
und in einer Zusammenfassungstabelle erfassen.
Das geht von Hand ganz gut; ist aber bei 40 Tabellen recht mühsam.
In meinem BasicProgramm (Makro) kann ich mir die einzelnen CalaTabellen anzeigen lassen.
So weit, so gut.
Muß ich jetzt jede Tabelle per Programm öffnen um dann die Werte der Zellen auzulesen
oder gibt es die Möglichkeit den =INDIREKT() Befehl/Anweisung in Basic umzusetzen?
Für Hilfe wäre ich sehr dankbar.
Mit Gruß
Werner
ich möchte in einem Directory aus mehreren CalcTabellen per =INDIREKT(...) Werte auslesen
und in einer Zusammenfassungstabelle erfassen.
Das geht von Hand ganz gut; ist aber bei 40 Tabellen recht mühsam.
In meinem BasicProgramm (Makro) kann ich mir die einzelnen CalaTabellen anzeigen lassen.
So weit, so gut.
Muß ich jetzt jede Tabelle per Programm öffnen um dann die Werte der Zellen auzulesen
oder gibt es die Möglichkeit den =INDIREKT() Befehl/Anweisung in Basic umzusetzen?
Für Hilfe wäre ich sehr dankbar.
Mit Gruß
Werner
Zuletzt geändert von wega am Di 30. Aug 2016, 14:10, insgesamt 3-mal geändert.
Re: =INDIREKT() in BASIC realisieren wie?
Hallo Werner,
Das Beste wird sein, du lädst hier mal ein Beispiel hoch. Dann bräuchte ich (oder ein anderer Mitleser) nicht zu raten, um was es eigentlich genau geht.
Mit freundlichem Gruß
Gerd
Was bedeutet das genau? Hast Du in einem Directory(Verzeichniss auf Deinem Rechner) mehrere .ods Dateien oder hast Du mehrere Tabellen in einer .ods Datei?wega hat geschrieben:ich möchte in einem Directory aus mehreren CalcTabellen .....
Meine Persönliche Meinung zu INDIREKT: Möglichst nicht benutzen. Meist gibt es einfachere, übersichtlichere Lösungen. Kann ich aber in diesem Fall noch nicht beurteieln, weil die Muster Daten fehlen..... per =INDIREKT(...) Werte auslesen
Okay soweit ...
.... und in einer Zusammenfassungstabelle erfassen.
Das geht von Hand ganz gut; ist aber bei 40 Tabellen recht mühsam.
Und wie sieht das Makro aus? Vielleicht geht es ja auch ohne Makro. Wie gesagt, Muster fehlt ...In meinem BasicProgramm (Makro) kann ich mir die einzelnen CalaTabellen anzeigen lassen.
Das Beste wird sein, du lädst hier mal ein Beispiel hoch. Dann bräuchte ich (oder ein anderer Mitleser) nicht zu raten, um was es eigentlich genau geht.
Mit freundlichem Gruß
Gerd
Re: =INDIREKT() in BASIC realisieren wie?
Hallo zusammen,
es hatte etwas länger gedauert, bis dass ich eine Lösung gefunden habe.
Nun jetzt ist sie da und funktioniert einwandfrei.
Ich weiß nicht, ob es an meinem Rechner liegt oder an den im Makro verwandte
Funktionen; es dauert etwas länger, bis dass die Lösung auf dem Bildschirm
erscheint.
Aber nun hier: die Verknüpfung mehrer Calc-Dateien.
Über eine Rückantwort, Verbesserungsvorschläge
würde ich mich sehr freuen.
Mit Gruß Werner
es hatte etwas länger gedauert, bis dass ich eine Lösung gefunden habe.
Nun jetzt ist sie da und funktioniert einwandfrei.
Ich weiß nicht, ob es an meinem Rechner liegt oder an den im Makro verwandte
Funktionen; es dauert etwas länger, bis dass die Lösung auf dem Bildschirm
erscheint.
Aber nun hier: die Verknüpfung mehrer Calc-Dateien.
Code: Alles auswählen
'*************************************************************
'Zusammenfassung von Quittungen
'Einen Zellbereich aus einem anderen ods-Dokument importieren.
'
'Von der nachfolgenden Adresse habe ich dieses Makro, das ich auf
'meine Bedürfnisse angepaßt habe.
'https://sites.google.com/site/starbasicmakros/makros-1/calc/verknuepfungen-zu-externen-datenquellen-einfuegen
'
'wesentliche Impulse kommen auch von dieser Seite:
'http://www.dannenhoefer.de/faqstarbasic/contents.htm
'
'Werner Gatzweiler im August 2016
'realisiert mit LibreOffice 5.1.4.2
'unter Lubuntu (Ubuntu)
'
Sub Zusammenfassung
dim oDoc As object
Dim oSheet As Object
Dim oCellAddress As Object
dim n AS Integer
Dim sSource$,sFilterName$ ,sFilterOptions$ '$ steht für String.
Dim sFileURL$, sDir$, sURL$
Dim dummy()
'Die Bibliothek "Tools" laden. Wird für "DirectoryNameoutofPath()" benötigt.
GlobalScope.BasicLibraries.LoadLibrary("Tools")
'***************************
'welcher Jahrgang?
'
sAns = InputBox("welcher Jahrgang soll bearbeitet werden?" & Chr(13) & Chr(13) & "Beispiel: 2011"
if sAns <> "" and len(sAns)=4 then
sPath = ("home/gisela/Ferienwohnung/Quittungen/" & sAns)
else
exit sub
endif
erzeuge_Tabelle
sFileName = "/Zusammenfassung-" & sAns 'Generieren des Dateinamens
sSaveToURL = ConvertToURL(sPath & sFileName) 'Speicherort und Dateinamen zusammenfügen
dateiurl=converttourl(sSaveToURL)
odoc=thisComponent
odoc.storeasurl(dateiurl,dummy())
oDoc=ThisComponent
oSheet = oDoc.Sheets.GetByName("Tabelle1")
'Geschwindigkeit erhöhen.
oDoc.LockControllers
oDoc.AddActionLock
'Die URL des aktuellen Dokuments, also der Zieldatei
sFileURL= oDoc.getURL
'msgbox sFileURL
'Den Ordner herausbekommen, in dem das aktuelle Dokument liegt.
sDir = DirectoryNameoutofPath(sFileURL, "/")
'************************************
' Kopfzeile der Tabelle beschreiben
'
oSheet.getCellbyPosition(0,0).string = sPath 'Der Hauptpfad
oSheet.getCellbyPosition(0,2).string = "Lfd.Nr."
oSheet.getCellbyPosition(1,2).string = "#Nr"
oSheet.getCellbyPosition(2,2).string = "Mieter"
oSheet.getCellbyPosition(3,2).string = "Anzahl Überna./Text"
oSheet.getCellbyPosition(4,2).string = "EURO"
oSheet.getCellbyPosition(5,2).string = "CENT"
oSheet.getCellbyPosition(6,2).string = "Gesamt"
'Die Kopfzeile wird formatiert
oSheet.getCellRangeByName("A1:G3").CharFontName="Comic Sans MS"
oSheet.getCellRangeByName("A1:G3").CharHeight="12"
oSheet.getCellRangeByName("A3:G3").CharWeight=com.sun.star.awt.FontWeight.BOLD
oSheet.getCellRangeByName("A3:G3").horijustify=2 'Kopfzellen zentrieren
NextFile = Dir(sPath & "/", 0) 'hier wird die erste Datei im Verzeichnis aufgezeigt
Anzahl = 0 'ist der Zähler für die Anzahl der ausgewählten Dateien
While NextFile <> ""
if left(NextFile,4)="Quit" then 'hier wird das auswahlkriterium für die Dateien gesetzt
Anzahl = Anzahl + 1
sURL = sDir & "/" & NextFile 'hier wird das Verzeichnis mit der Datei verbunden
'*****************************************************************
'Überprüfen, ob das Dokument unter dem angegebenen Pfad existiert.
If Not FileExists(sURL) Then
MsgBox "Die angegebene Datei existiert nich:" & Chr(10) & _
Chr(10) & _
convertFromUrl (sURL)& Chr(10) & _
Chr(10) & _
"Bitte überptüfen sie den Dateinahmen und das Verzeichnis." ,16, "Fehler"
oDoc.UnlockControllers
oDoc.removeActionLock
exit Sub
End If
sFilterName = "Calc8" ' Normale ods-Datei.
sFilterOptions ="" ' Hat keine Optionen.
'**************************
'Eintrag in die Zieltabelle
oSheet = oDoc.Sheets.GetByName("Tabelle1")
'**************************
'Ziel-Zelle des AreaLinks.
oCellAddress = oSheet.getCellRangeByName("B" & Anzahl+4).CellAddress
'Anzah + 4 beschreibt die Zeile in die kopiert werden soll.
'*****************************
'Der zu importierende Bereich.
sSource = "Quittung.B5"
oLinks = oDoc.AreaLinks
oLinks.insertAtPosition (oCellAddress, sUrl, sSource, sFilterName, sFilterOptions)
oCellAddress = oSheet.getCellRangeByName("C" & Anzahl+4).CellAddress
sSource = "Quittung.A12"
oLinks = oDoc.AreaLinks
oLinks.insertAtPosition (oCellAddress, sUrl, sSource, sFilterName, sFilterOptions)
oCellAddress = oSheet.getCellRangeByName("D" & Anzahl+4).CellAddress
sSource = "Quittung.A14"
oLinks = oDoc.AreaLinks
oLinks.insertAtPosition (oCellAddress, sUrl, sSource, sFilterName, sFilterOptions)
oCellAddress = oSheet.getCellRangeByName("E" & Anzahl+4).CellAddress
sSource = "Quittung.F3"
oLinks = oDoc.AreaLinks
oLinks.insertAtPosition (oCellAddress, sUrl, sSource, sFilterName, sFilterOptions)
oCellAddress = oSheet.getCellRangeByName("F" & Anzahl+4).CellAddress
sSource = "Quittung.H3"
oLinks = oDoc.AreaLinks
oLinks.insertAtPosition (oCellAddress, sUrl, sSource, sFilterName, sFilterOptions)
'Wenn der Bereich ein benannter Bereich ist, kann er auch über seinen Namen angesprochen werden.
'sSource = "Bereich1"
'***************************
'Filter und Filter-Optionen.
'Weitere verfügbare Filter und Filter-Optionen findet man hier:
'http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Filter_Options
sFilterName = "Calc8" ' Normale ods-Datei.
sFilterOptions ="" ' Hat keine Optionen.
'Zugriff auf alle AreaLinks.
oLinks = oDoc.AreaLinks
'Xray oLinks.getByIndex(0).refresh
On Error Goto ErrorHandler 'Bei Fehler zur Zeile "ErrorHandler:" gehen.
'Den neuen AreaLink einfügen.
oLinks.insertAtPosition (oCellAddress, sUrl, sSource, sFilterName, sFilterOptions)
end if
NextFile = Dir
Wend
'Optional: Die Verknüpfung zu dem Lik wieder entfernen.
'Der Inhalt bleibt bestehen, wird aber nicht mehr automatisch beim Neuladen aktualisiert.
'Da der AreaLink zuletzt eingefügt wurde, hat es den höchsten Index "oLinks.getcount-1"
'(Höchster Index ist immer (Anzahl -1), da die Indices immer bei 0 anfangen.)
oLinks.removeByIndex(oLinks.getcount-1)
'Entfernen des ControllerLocks, und des ActionLocks,
'damit man das Dokument wieder bearbeiten kann.
oDoc.UnlockControllers
oDoc.removeActionLock
Exit Sub
ErrorHandler: ' Fehler Behandlung
MsgBox "Der Link konnte nicht eingefügt werden" ,16, "Fehler"
oDoc.UnlockControllers
oDoc.removeActionLock
end sub
'***************************
'eine Tabelle erzeugen
'
Sub erzeuge_Tabelle
Dim Desktop as object
Dim Mappe as object
Dim Tabelle as object
Dim dummy()
Desktop = CreateUnoService ("com.sun.star.frame.Desktop")
Mappe = Desktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, dummy())
'Tabelle = Mappe.getSheets().getbyIndex(0)
end sub
Über eine Rückantwort, Verbesserungsvorschläge
würde ich mich sehr freuen.
Mit Gruß Werner
Re: [gelöst] =INDIREKT() in BASIC realisieren wie?
Hallo Werner,
schön zu sehen, das Dir eine Makrolösung eingefallen ist. Schön auch, das es so funktioniert, wie Du es Dir vorgestellt hast. Du schreibst:
Meiner Meinung nach wäre es besser organisiert, wenn alle diese Daten sich in einem File(Tabellen Dokument), meinethalben für jedes Jahr eines, in welchem sich die Kunden Daten in einer Tabelle befinden. Die Zusammenfassung fände dann auf einem oder zwei weiteren Tabellenblättern statt.
Trotzdem: Viel Spaß mit Deiner Lösung. Sie funktioniert so wie Du es möchtest, und das ist wichtig.
mit freundlichem Gruß
Gerd
schön zu sehen, das Dir eine Makrolösung eingefallen ist. Schön auch, das es so funktioniert, wie Du es Dir vorgestellt hast. Du schreibst:
Ich denke, das liegt u.A. an der Organisation Deiner Daten. Wenn ich das Makro und Deine Frage jetzt richtig verstehe, dann hast Du für jedes Jahr ein Verzeichniss eingerichtet. In diesem gibt es für jeden Kunden ein ods File. Dein Betriebssystem muss jetzt also jedes File öffnen und bearbeiten. Das dauert.
..... es dauert etwas länger, bis dass die Lösung auf dem Bildschirm erscheint.
Meiner Meinung nach wäre es besser organisiert, wenn alle diese Daten sich in einem File(Tabellen Dokument), meinethalben für jedes Jahr eines, in welchem sich die Kunden Daten in einer Tabelle befinden. Die Zusammenfassung fände dann auf einem oder zwei weiteren Tabellenblättern statt.
Trotzdem: Viel Spaß mit Deiner Lösung. Sie funktioniert so wie Du es möchtest, und das ist wichtig.
mit freundlichem Gruß
Gerd
Re: [gelöst] =INDIREKT() in BASIC realisieren wie?
Hallo,
den Anfang verstehe ich nicht so richtig:
Du erzeugst zunächst eine neue Datei um dann aber anschließend nicht mehr mit ihr zu arbeiten, denn im weiteren arbeitest du mit odoc=thiscomponent (also der Datei in der sich das Makro befindet).
Danach speicherst du diese Datei unter einem neuen Namen (odoc.storeasurl(dateiurl,dummy())) und bestimmst anschließend das Verzeichnis in der sie liegt, obwohl du den Pfad beim Speichern gerade benutzt hast.
Die Verzeichnisstruktur kann ich nicht so richtig nachvollziehen.
Für das weitere könnte es sein, dass die DDE()-Funktion schneller funktioniert, als die Dateiverknüpfung.
Der letzte Teil des Makros könnte dann so aussehen:
den Anfang verstehe ich nicht so richtig:
Code: Alles auswählen
erzeuge_Tabelle
sFileName = "/Zusammenfassung-" & sAns 'Generieren des Dateinamens
sSaveToURL = ConvertToURL(sPath & sFileName) 'Speicherort und Dateinamen zusammenfügen
dateiurl=converttourl(sSaveToURL)
odoc=thisComponent
odoc.storeasurl(dateiurl,dummy())
Danach speicherst du diese Datei unter einem neuen Namen (odoc.storeasurl(dateiurl,dummy())) und bestimmst anschließend das Verzeichnis in der sie liegt, obwohl du den Pfad beim Speichern gerade benutzt hast.
Die Verzeichnisstruktur kann ich nicht so richtig nachvollziehen.
Für das weitere könnte es sein, dass die DDE()-Funktion schneller funktioniert, als die Dateiverknüpfung.
Der letzte Teil des Makros könnte dann so aussehen:
Code: Alles auswählen
Anzahl = 0 'ist der Zähler für die Anzahl der ausgewählten Dateien
'ab jetzt ist der Code neu
Dim aFormeln()
While NextFile <> ""
if left(NextFile,4)="Quit" then 'hier wird das auswahlkriterium für die Dateien gesetzt
Anzahl = Anzahl + 1
Redim Preserve aFormeln(i-1)
sURL = sDir & "/" & NextFile 'hier wird das Verzeichnis mit der Datei verbunden
'*****************************************************************
formelanfang="=DDE(""soffice"";""" & surl & """;"""
aFormel(i-1)=array(formelanfang & "Quittung.B5" & """)",formelanfang & "Quittung.A12" & """)",formelanfang & "Quittung.A14" & """)",formelanfang & "Quittung.F3" & """)",formelanfang & "Quittung.H3" & """)")
end if
NextFile = Dir
Wend
'Eintrag in die Zieltabelle
if anzahl>0 then
oBereich = oDoc.Sheets.GetByName("Tabelle1").getcellrangebyposition(1,4,5,3+anzahl)
oBereich.SetFormulaArray(aformeln)
'Optional: Die Verknüpfung zu dem Lik wieder entfernen.
'Der Inhalt bleibt bestehen, wird aber nicht mehr automatisch beim Neuladen aktualisiert.
aWerte=oBereich.GetDataArray
oBereich.SetDataArray(aWerte)
end if
end sub
Gruß,
mikele
mikele
Re: [gelöst] =INDIREKT() in BASIC realisieren wie?
Hallo mikele,
Danke für Deine Antwort.
Da ich den Code zum Teil aus anderen Anregungen entnommen habe, ihn zu
meinem Bedürfnissen umgebogen habe, kann ich Dir zu Deinen Fragen bestimmt
keine befriedigende Antwort geben. So gut bin ich im Programieren mit Starbasic
nicht.
Aber Deine Anmerkungen leuchten mir ein und die werde ich austesten.
Die DDE-Anregung finde ich besonders interessant, denn anderorts wird im Forum
auch darüber geschrieben, daß diese schneller und effektiver ist.
Mit Gruß
Werner
Danke für Deine Antwort.
Da ich den Code zum Teil aus anderen Anregungen entnommen habe, ihn zu
meinem Bedürfnissen umgebogen habe, kann ich Dir zu Deinen Fragen bestimmt
keine befriedigende Antwort geben. So gut bin ich im Programieren mit Starbasic
nicht.
Aber Deine Anmerkungen leuchten mir ein und die werde ich austesten.
Die DDE-Anregung finde ich besonders interessant, denn anderorts wird im Forum
auch darüber geschrieben, daß diese schneller und effektiver ist.
Mit Gruß
Werner
Re: [gelöst] =INDIREKT() in BASIC realisieren wie?
Hallo mikele,
ich habe das Makro Deiner anregung nach noch einmal überarbeit.
a) Ich erzeuge eine Tabelle, gebe der einen Namen und lege sie im
definierten Directory ab. - Somit sehe ich in der Kopfzeile von Calc
auch den gewählten Namen -> Zusammenstellung-Jahreszahl <-.
Diese Datei ist dann meine oDoc.
Wenn ich da im Programmanfang etwas nicht richtig verstanden habe,
dann würde ich mich um eine Aufklärung freuen. - Eine Bestätigung
freut mich auch!
b) die DDE-Funktion erschließt sich mir noch nicht so richtig. Ich lese
zwar immer wieder von deren Vozügen, aber ich verstehe die Syntax
nicht so richtig.
Somit habe ich Deinen 2. Teil der Anregung komplett übernommen
und komme dann zu einem Fehler, den ich nicht verstehe und auch nicht
korrigieren kann - fehlende Kenntnis!!
Ich lege mal ein Bild der Fehlermeldung und den Programmcode bei.
Mit Gruß
Werner
ich habe das Makro Deiner anregung nach noch einmal überarbeit.
a) Ich erzeuge eine Tabelle, gebe der einen Namen und lege sie im
definierten Directory ab. - Somit sehe ich in der Kopfzeile von Calc
auch den gewählten Namen -> Zusammenstellung-Jahreszahl <-.
Diese Datei ist dann meine oDoc.
Wenn ich da im Programmanfang etwas nicht richtig verstanden habe,
dann würde ich mich um eine Aufklärung freuen. - Eine Bestätigung
freut mich auch!
b) die DDE-Funktion erschließt sich mir noch nicht so richtig. Ich lese
zwar immer wieder von deren Vozügen, aber ich verstehe die Syntax
nicht so richtig.
Somit habe ich Deinen 2. Teil der Anregung komplett übernommen
und komme dann zu einem Fehler, den ich nicht verstehe und auch nicht
korrigieren kann - fehlende Kenntnis!!
Ich lege mal ein Bild der Fehlermeldung und den Programmcode bei.
Code: Alles auswählen
'Zusammenfassung Version 2
'
'Zusammenfassung von Quittungen
'Einen Zellbereich aus einem anderen ods-Dokument importieren.
'
'Von der nachfolgenden Adresse habe ich dieses Makro, das ich auf
'meine Bedürfnisse angepaßt habe.
'https://sites.google.com/site/starbasicmakros/makros-1/calc/verknuepfungen-zu-externen-datenquellen-einfuegen
'
'wesentliche Impulse kommen auch von dieser Seite:
'http://www.dannenhoefer.de/faqstarbasic/contents.htm
'
'Werner Gatzweiler im August 2016
'realisiert mit LibreOffice 5.1.4.2
'unter Lubuntu (Ubuntu)
'
'nachgebessert auf Anregung von
' mikele am 28. August 2016
'
Sub Zusammenfassung_V2
dim oDoc As object
Dim oSheet As Object
Dim oCellAddress As Object
dim n AS Integer
Dim sSource$,sFilterName$ ,sFilterOptions$ '$ steht für String.
Dim sFileURL$, sDir$, sURL$
Dim dummy()
'Die Bibliothek "Tools" laden. Wird für "DirectoryNameoutofPath()" benötigt.
GlobalScope.BasicLibraries.LoadLibrary("Tools")
'***************************
'welcher Jahrgang?
'
sAns = InputBox("welcher Jahrgang soll bearbeitet werden?" & Chr(13) & Chr(13) & "Beispiel: 2011"
if sAns <> "" and len(sAns)=4 then
sPath = ("home/gisela/Ferienwohnung/Quittungen/" & sAns)
else
exit sub
endif
erzeuge_Tabelle
sFileName = "/Zusammenfassung-" & sAns 'Generieren des Dateinamens
sSaveToURL = ConvertToURL(sPath & sFileName) 'Speicherort und Dateinamen zusammenfügen
dateiurl=converttourl(sSaveToURL)
odoc=thisComponent 'das ist die Zieldatei, die nachfolgend mit Pfad und Namen im Directory abgelegt wird
odoc.storeasurl(dateiurl,dummy()) 'Die Datei ist jetzt mit ihrem Namen = Zusammenfassung- & sAns im Directory abgelegt
oSheet = oDoc.Sheets.GetByName("Tabelle1") 'das Tabellenblatt der Zieldatei definieren
'Geschwindigkeit erhöhen.
oDoc.LockControllers
oDoc.AddActionLock
'************************************
' Kopfzeile der Tabelle beschreiben
'
oSheet.getCellbyPosition(0,0).string = sPath 'Der Hauptpfad
oSheet.getCellbyPosition(0,2).string = "Lfd.Nr."
oSheet.getCellbyPosition(1,2).string = "#Nr"
oSheet.getCellbyPosition(2,2).string = "Mieter"
oSheet.getCellbyPosition(3,2).string = "Anzahl Überna./Text"
oSheet.getCellbyPosition(4,2).string = "EURO"
oSheet.getCellbyPosition(5,2).string = "CENT"
oSheet.getCellbyPosition(6,2).string = "Gesamt"
'Die Kopfzeile wird formatiert
oSheet.getCellRangeByName("A1:G3").CharFontName="Comic Sans MS"
oSheet.getCellRangeByName("A1:G3").CharHeight="12"
oSheet.getCellRangeByName("A3:G3").CharWeight=com.sun.star.awt.FontWeight.BOLD
oSheet.getCellRangeByName("A3:G3").horijustify=2 'Kopfzellen zentrieren
NextFile = Dir(sPath & "/",0) 'hier wird die erste Datei im Verzeichnis aufgezeigt
Anzahl = 0 'ist der Zähler für die Anzahl der ausgewählten Dateien
'ab jetzt ist der Code neu
Dim aFormel()
i=5
While NextFile <> ""
if left(NextFile,4)="Quit" then 'hier wird das Auswahlkriterium für die Dateien gesetzt
Anzahl = Anzahl + 1
Redim Preserve aFormeln(i-1)
sURL = sDir & "/" & NextFile 'hier wird das Verzeichnis mit der Datei verbunden
'*****************************************************************
formelanfang="=DDE(""soffice"";""" & surl & """;"""
msgbox formelanfang
aFormel(i-1)=array(formelanfang & "Quittung.B5" & """)",formelanfang & "Quittung.A12" & """)",formelanfang & "Quittung.A14" & """)",formelanfang & "Quittung.F3" & """)",formelanfang & "Quittung.H3" & """)")
end if
NextFile = Dir
Wend
'Eintrag in die Zieltabelle
if anzahl>0 then
oBereich = oDoc.Sheets.GetByName("Tabelle1").getcellrangebyposition(1,4,5,3+anzahl)
oBereich.SetFormulaArray(aformeln)
'Optional: Die Verknüpfung zu dem Lik wieder entfernen.
'Der Inhalt bleibt bestehen, wird aber nicht mehr automatisch beim Neuladen aktualisiert.
aWerte=oBereich.GetDataArray
oBereich.SetDataArray(aWerte)
end if
End Sub
'***************************
'eine Tabelle erzeugen
'
Sub erzeuge_Tabelle
Dim Desktop as object
Dim Mappe as object
Dim Tabelle as object
Dim dummy()
Desktop = CreateUnoService ("com.sun.star.frame.Desktop")
Mappe = Desktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, dummy())
end sub
Werner
Re: [gelöst] =INDIREKT() in BASIC realisieren wie?
Hallo,
sorry - mein Fehler. Ich habe die falsche Indexvariable benutzt.
Mit odoc=Thiscomponent greifst du auf die Datei zu, in der das Makro steht. Du möchtest aber eine neuen Datei erzeugen und dort die Daten schreiben (richtig?). Dahingehend habe ich das Makro mal umgeschrieben und hoffe das es tut was es soll (aufgrund der fehlenden Datei konnte ich es nicht testen).
sorry - mein Fehler. Ich habe die falsche Indexvariable benutzt.
Mit odoc=Thiscomponent greifst du auf die Datei zu, in der das Makro steht. Du möchtest aber eine neuen Datei erzeugen und dort die Daten schreiben (richtig?). Dahingehend habe ich das Makro mal umgeschrieben und hoffe das es tut was es soll (aufgrund der fehlenden Datei konnte ich es nicht testen).
Code: Alles auswählen
'Zusammenfassung Version 3
'
'Zusammenfassung von Quittungen
'Einen Zellbereich aus einem anderen ods-Dokument importieren.
'
'Von der nachfolgenden Adresse habe ich dieses Makro, das ich auf
'meine Bedürfnisse angepaßt habe.
'https://sites.google.com/site/starbasicmakros/makros-1/calc/verknuepfungen-zu-externen-datenquellen-einfuegen
'
'wesentliche Impulse kommen auch von dieser Seite:
'http://www.dannenhoefer.de/faqstarbasic/contents.htm
'
'Werner Gatzweiler im August 2016
'realisiert mit LibreOffice 5.1.4.2
'unter Lubuntu (Ubuntu)
'
'nachgebessert auf Anregung von
' mikele am 28. August 2016
'
Sub Zusammenfassung_V3
dim neuDoc As Object, oBereich As Object
Dim oSheet As Object
dim Anzahl AS Integer
Dim sAns as String, sPath as String, sFileURL as String, sFileName as String, sSaveToURL as String
Dim NextFile
Dim dummy(), aFormel(), aWerte()
'***************************
'welcher Jahrgang?
'
sAns = InputBox("welcher Jahrgang soll bearbeitet werden?" & Chr(13) & Chr(13) & "Beispiel: 2011"
if sAns <> "" and len(sAns)=4 then
sPath = ("home/gisela/Ferienwohnung/Quittungen/" & sAns & "/")
else
exit sub
endif
'***************************
'neue Datei erstellen und unter dem Jahrgangsnamen abspeichern
'
neuDoc=StarDesktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, dummy())
sFileName = "Zusammenfassung-" & sAns 'Generieren des Dateinamens
sSaveToURL = ConvertToURL(sPath & sFileName) 'Speicherort und Dateinamen zusammenfügen
neudoc.storeasurl(sSaveToURL,dummy()) 'Die Datei ist jetzt mit ihrem Namen = Zusammenfassung- & sAns im Directory abgelegt
oSheet = neuDoc.Sheets.GetByName("Tabelle1") 'das Tabellenblatt der Zieldatei definieren
'************************************
' Kopfzeile der Tabelle beschreiben
'
oSheet.getCellbyPosition(0,0).string = sPath 'Der Hauptpfad
oSheet.getCellbyPosition(0,2).string = "Lfd.Nr."
oSheet.getCellbyPosition(1,2).string = "#Nr"
oSheet.getCellbyPosition(2,2).string = "Mieter"
oSheet.getCellbyPosition(3,2).string = "Anzahl Überna./Text"
oSheet.getCellbyPosition(4,2).string = "EURO"
oSheet.getCellbyPosition(5,2).string = "CENT"
oSheet.getCellbyPosition(6,2).string = "Gesamt"
'Die Kopfzeile wird formatiert
oSheet.getCellRangeByName("A1:G3").CharFontName="Comic Sans MS"
oSheet.getCellRangeByName("A1:G3").CharHeight="12"
oSheet.getCellRangeByName("A3:G3").CharWeight=com.sun.star.awt.FontWeight.BOLD
oSheet.getCellRangeByName("A3:G3").horijustify=2 'Kopfzellen zentrieren
'***************************
'Jahrgangsverzeichnis nach Quittungen durchforsten
'
NextFile = Dir(sPath ,0) 'hier wird die erste Datei im Verzeichnis aufgezeigt
Anzahl = 0 'ist der Zähler für die Anzahl der ausgewählten Dateien
While NextFile <> ""
if left(NextFile,4)="Quit" then 'hier wird das Auswahlkriterium für die Dateien gesetzt
Anzahl = Anzahl + 1
Redim Preserve aFormeln(Anzahl-1)
sURL = sPath & NextFile 'hier wird das Verzeichnis mit der Datei verbunden
'Formel in Array schreiben
formelanfang="=DDE(""soffice"";""" & surl & """;"""
aFormeln(Anzahl-1)=array(formelanfang & "Quittung.B5" & """)",formelanfang & "Quittung.A12" & """)",formelanfang & "Quittung.A14" & """)",formelanfang & "Quittung.F3" & """)",formelanfang & "Quittung.H3" & """)")
end if
NextFile = Dir
Wend
'Eintrag in die Zieltabelle, wenn Quittungen gefunden
if anzahl>0 then
'Array in Tabelle schreiben
oBereich = oSheet.getcellrangebyposition(1,4,5,3+anzahl)
oBereich.SetFormulaArray(aformeln)
'Optional: Die Verknüpfung zu dem Link wieder entfernen.
'Der Inhalt bleibt bestehen, wird aber nicht mehr automatisch beim Neuladen aktualisiert.
aWerte=oBereich.GetDataArray
'oBereich.SetDataArray(aWerte)
end if
End Sub
Gruß,
mikele
mikele
Re: [gelöst] =INDIREKT() in BASIC realisieren wie?
Hallo mikele,
Super, genau das wollte ich erreichen.
Ein klein bischen fehlt noch.
In den Zellen steht -> #NV <- .
Jedoch das Programm zeigt, daß es genau auf die Quellzelle zeigt.
Wie bekommt man den Inhalt angezeigt? Ob Zahl oder Text ist erst mal egal.
Hochachtung vor Deiner Arbeit.
Mit Gruß
Werner
Super, genau das wollte ich erreichen.
Ein klein bischen fehlt noch.
In den Zellen steht -> #NV <- .
Jedoch das Programm zeigt, daß es genau auf die Quellzelle zeigt.
Wie bekommt man den Inhalt angezeigt? Ob Zahl oder Text ist erst mal egal.
Hochachtung vor Deiner Arbeit.
Mit Gruß
Werner
Re: [gelöst] =INDIREKT() in BASIC realisieren wie?
Hallo,
Ich hege gerade so einen Verdacht, dass ein Slash am Anfang des Pfades fehlt:
Achso: um anstelle des Links den Wert in der Zelle zu haben muss am Ende noch ein Apostroph entfernt werden
#NV bedeutet, dass die DDE()-Funktion auf eine nichtexistierende Zelle zeigt. Also ist entweder der Dateiname (inkl. Pfad) falsch oder die Bezeichnung des Tabellenblattes.Ein klein bischen fehlt noch.
Ich hege gerade so einen Verdacht, dass ein Slash am Anfang des Pfades fehlt:
Code: Alles auswählen
"/home/gisela/Ferienwohnung/Quittungen/"
Code: Alles auswählen
'oBereich.SetDataArray(aWerte)
Gruß,
mikele
mikele
An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:
Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.