🙏 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!🍀

❤️ DANKE >> << DANKE ❤️

>> 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?

Alles zur Programmierung im LibreOffice.
wega
Beiträge: 121
Registriert: Mi 16. Jul 2014, 19:15

[gelöst] =INDIREKT() in BASIC realisieren wie?

Beitrag von wega » Mi 24. Aug 2016, 20:44

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
Zuletzt geändert von wega am Di 30. Aug 2016, 14:10, insgesamt 3-mal geändert.

gerderich
Beiträge: 25
Registriert: Sa 17. Mai 2014, 16:59

Re: =INDIREKT() in BASIC realisieren wie?

Beitrag von gerderich » Do 25. Aug 2016, 11:04

Hallo Werner,
wega hat geschrieben:ich möchte in einem Directory aus mehreren CalcTabellen .....
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?
.... per =INDIREKT(...) Werte auslesen
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.

.... und in einer Zusammenfassungstabelle erfassen.
Das geht von Hand ganz gut; ist aber bei 40 Tabellen recht mühsam.
Okay soweit ...
In meinem BasicProgramm (Makro) kann ich mir die einzelnen CalaTabellen anzeigen lassen.
Und wie sieht das Makro aus? Vielleicht geht es ja auch ohne Makro. Wie gesagt, Muster fehlt ...

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

wega
Beiträge: 121
Registriert: Mi 16. Jul 2014, 19:15

Re: =INDIREKT() in BASIC realisieren wie?

Beitrag von wega » Sa 27. Aug 2016, 14:51

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.

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

gerderich
Beiträge: 25
Registriert: Sa 17. Mai 2014, 16:59

Re: [gelöst] =INDIREKT() in BASIC realisieren wie?

Beitrag von gerderich » Sa 27. Aug 2016, 19:53

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:

..... es dauert etwas länger, bis dass die Lösung auf dem Bildschirm erscheint.
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.
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

mikele
* LO-Experte *
Beiträge: 1930
Registriert: Mo 1. Aug 2011, 20:51

Re: [gelöst] =INDIREKT() in BASIC realisieren wie?

Beitrag von mikele » So 28. Aug 2016, 21:18

Hallo,

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())
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:

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

wega
Beiträge: 121
Registriert: Mi 16. Jul 2014, 19:15

Re: [gelöst] =INDIREKT() in BASIC realisieren wie?

Beitrag von wega » Mo 29. Aug 2016, 15:09

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

wega
Beiträge: 121
Registriert: Mi 16. Jul 2014, 19:15

Re: [gelöst] =INDIREKT() in BASIC realisieren wie?

Beitrag von wega » Mo 29. Aug 2016, 20:55

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.

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
Fehlermeldung.jpg
Fehlermeldung.jpg (13.7 KiB) 5925 mal betrachtet
Mit Gruß
Werner

mikele
* LO-Experte *
Beiträge: 1930
Registriert: Mo 1. Aug 2011, 20:51

Re: [gelöst] =INDIREKT() in BASIC realisieren wie?

Beitrag von mikele » Mo 29. Aug 2016, 22:02

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).

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

wega
Beiträge: 121
Registriert: Mi 16. Jul 2014, 19:15

Re: [gelöst] =INDIREKT() in BASIC realisieren wie?

Beitrag von wega » Mo 29. Aug 2016, 22:40

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

mikele
* LO-Experte *
Beiträge: 1930
Registriert: Mo 1. Aug 2011, 20:51

Re: [gelöst] =INDIREKT() in BASIC realisieren wie?

Beitrag von mikele » Mo 29. Aug 2016, 23:08

Hallo,
Ein klein bischen fehlt noch.
#NV bedeutet, dass die DDE()-Funktion auf eine nichtexistierende Zelle zeigt. Also ist entweder der Dateiname (inkl. Pfad) falsch oder die Bezeichnung des Tabellenblattes.
Ich hege gerade so einen Verdacht, dass ein Slash am Anfang des Pfades fehlt:

Code: Alles auswählen

"/home/gisela/Ferienwohnung/Quittungen/"
Achso: um anstelle des Links den Wert in der Zelle zu haben muss am Ende noch ein Apostroph entfernt werden

Code: Alles auswählen

'oBereich.SetDataArray(aWerte)
Gruß,
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.



Antworten