🙏 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

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

Beitrag von wega » Mo 29. Aug 2016, 23:37

Hallo,

es sieht alles so weit ganz gut aus, bis eben #NV

Ich lege mal ein Bild bei.
Anzeige.jpg
Anzeige.jpg (44.09 KiB) 2198 mal betrachtet
Mit Gruß
Werner
Zuletzt geändert von wega am Di 30. Aug 2016, 14:47, insgesamt 1-mal geändert.

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

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

Beitrag von mikele » Di 30. Aug 2016, 12:03

Hallo,
das #NV sagt, dass DDE() die Zelle nicht finden kann.
Der erste Slash im Pfad ist wichtig und muss unbedingt eingefügt werden.
Was mich wundert ist, dass der Dateiname ohne Endung daherkommt?!
Gruß,
mikele

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

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

Beitrag von wega » Di 30. Aug 2016, 14:08

hallo mikele,

Danke für Deine Geduld.
Ja, der erste Slash im Pfad ist wichtig, habe ich auch schon gefunden, indem ich ihn
per Hand der Zelleninformation beigefügt habe. Und promt erschien der Inhalt.

Die Endung fehlt auch an den Originaldateien (wie auch immer?). LibreOffice erkennt
aber, dass es eine Calc-Datei ist.

Weshalb das Ganze trotz angefügtem Slash noch nicht funktionierte lag daran, dass sich
ein Schreibfehlerteufel eingeschlichen hatte. Mal aFormeln() , ein andermal aFormel().
Nachdem dieser Lapsus behoben war lief das Makro.

Was mich verwundert: die DDE-Lösung über Array() läuft viel langsamer als ich erwartet
hätte. Sogar langsamer als die erste Lösung.
Gibt es dazu vielleicht eine Erklärung? DDE sollte doch nach den Forumsaussagen wesentlich schneller
sein als andere Lösungen.

Aber hier die letzte Fassung des DDE-Makros ohne Fehlerteufel und mit Slash.

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(), aFormeln(), 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
         surl = "/" & surl
         formelanfang="=DDE(""soffice"";""" & surl & """;"""
         'msgbox Formelanfang
         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
Nochmals vielen Dank
und Gruß
Werner


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