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

gelöst; variable Zellenzahl ermitteln

Alles zur Programmierung im LibreOffice.
natal
Beiträge: 119
Registriert: So 8. Mär 2020, 20:03

Re: variable Zellenzahl ermitteln

Beitrag von natal » Mi 3. Feb 2021, 18:59

Hallo craig
Es hat funktioniert!!!
Die ersten 3 Spalten meiner Dokuvorlage Unbenannt3-LibreOffice sind gefüllt.
Die Makrosicherheit war auf HOCH gestellt, obwohl ich sie schon auf MITTEL eingestellt hatte (allerdings schon vor längerer Zeit). Ob das auch die Ursache für viele Fehlversuche war?
Jetzt wären noch einpaar Änderungen in meiner Dokuvorlage notwendig.
* der Inhalt der Spalte B ab B4 müßten zur Spalte C ab C4 und der Inhalt der Spalte C ab C4 zur Spalte D ab D4 wandern.
* In der Zelle B4 sollte eine Kopie von Zelle B2 eingefügt werden.
* die Zellen der Spalte B sollten ab B5 den Inhalt =B4+$C$5 ($C$5→ nach Verschieben der Spalte B nach Spalte C)haben.
* Die Erhöhung der Uhrzeit in der Spalte B um jeweils eine Sekunde sollte so lange wiederholt werden, wie es gefüllte Zellen der Spalten C od. D gibt.
Gruß
natal

craig
Beiträge: 1137
Registriert: Do 21. Apr 2016, 11:42

Re: variable Zellenzahl ermitteln

Beitrag von craig » Mi 3. Feb 2021, 19:27

Hallo Natal,
Natal hat geschrieben:Es hat funktioniert!!!
Die ersten 3 Spalten meiner Dokuvorlage Unbenannt3-LibreOffice sind gefüllt.
Das freut mich sehr! :D

Ich war schon fast am verzweifeln ;)
Natal hat geschrieben:Ob das auch die Ursache für viele Fehlversuche war?
Eindeutig JA :!:
Weil Du mir die Screenshots zu den Messageboxen übersandt hast, war ich der festen
Überzeugung das die Sicherheit auf "Mittel" steht, denn das Makro wurde ja abgearbeitet.
Natal hat geschrieben: Jetzt wären noch einpaar Änderungen in meiner Dokuvorlage notwendig.
In der Dokumentvorlage selbst oder im meinem Makro.
Wenn in meinem Makro, dann wäre ich Dir dankbar für eine Musterdatei,
damit ich erkenne wie das Endergebnis ausehen soll.
Musst ja nicht 30.000 Zelle befüllen.
Gruß

Craig

Nie die Sicherungskopie vergessen!

════════════════════════════════════════════════
WIN 10 Pro 64-Bit • LO 7.4.5.1 (x64) • AOO 4.1.8

natal
Beiträge: 119
Registriert: So 8. Mär 2020, 20:03

Re: variable Zellenzahl ermitteln

Beitrag von natal » Do 4. Feb 2021, 15:40

    Hallo craig

    Das wären meine Änderungswünsche die Dokuvorlage_20210131_v6.ots betreffend.
    Ändere bitte den Vorlagennamen von Dokuvorlage_20210131_v6.ots in Vorlage_P.ots und teile mir bitte mit, wo und was dafür geändert werden muß, für den Fall, dass ich zukünftig eine weiteren Namensänderung machen möchte.
    Lösche auch in der IDE die Massageboxen.

    Das sind Änderungen, die du bitte in die Vorlage_P einträgst.

    Angegeben habe ich hier nur die Formel, die nicht schon in der Vorlage gespeichert sind.
    • Zellinhalt von A2 = C2 der CSV-Datei
    • Zellinhalt von B2 = D2 der CSV-Datei
    • Zellinhalt Von C2 = E2 der CSV-Datei
    • Spalte C ab C4 = Spalte B ab B4 der CSV-Datei
    • Spalte D ab D4 = Spalte C ab C4 der CSV-Datei

    Spalte B:
    • ab Zelle B5 bis Bx: =WENN(ODER(B4="";C5="");"";B4+$C$5)
    • Zelle Bx: x ist die Zeilennummer letzten gefüllten Zelle der Spalte C od. D (z.B. C15000), dann ist Bx gleich B15000)
    • oder anders gesagt die Zellen der Spalte B solange um 1 sec erhöhen, wie es gefüllte Zellen in den Spalten C od. D gibt


    Spalte E:
    ab Zelle E6 bis Zelle Ex: =WENN(E5>=$F$2;"";E5+1)
    Zeilennummer der Zelle Ex entspricht dem Inhalt von Zelle F2

    Spalte F:
    ab Zelle F4 bis Fx: =WENN(D4="";"";ZÄHLENWENN(INDIREKT("$D$4:$D$"&MAX(A:A))+3);E4))
    Zeilennummer der Zelle Fx entspricht dem Inhalt von Zelle G2
    Dateianhänge
    Vorlage_P.ods
    (10.33 KiB) 136-mal heruntergeladen

    natal
    Beiträge: 119
    Registriert: So 8. Mär 2020, 20:03

    Re: variable Zellenzahl ermitteln

    Beitrag von natal » Do 4. Feb 2021, 15:49

    Nachtrag
    So sieht eine befüllte Datei aus.
    Dateianhänge
    Bildschirmfoto vom 2021-02-04 15-57-07.png
    Bildschirmfoto vom 2021-02-04 15-57-07.png (64.24 KiB) 1304 mal betrachtet

    craig
    Beiträge: 1137
    Registriert: Do 21. Apr 2016, 11:42

    Re: variable Zellenzahl ermitteln

    Beitrag von craig » Sa 6. Feb 2021, 14:11

    Hallo Natal,

    es ist soweit...
    • Hier die neue Dokuvorlage. Wie immer .zip entfernen NICHT entpacken.
      Vorlage_P.ots.zip
      (10.8 KiB) 88-mal heruntergeladen
    • Dies ist der neue Code.
      • Öffne den Objektkatalog in der Basic-IDE, navigiere zu libPolar.modCSVImport
      • Ersetzte den vorhandenen Code durch folgenden:

      Code: Alles auswählen

      REM  *****  BASIC  *****
      Option Explicit
      
      Dim oDocCSV as Object  
      
      REM modCSVImport
      Sub [CSV_DATEN importieren]
      Dim oDocAusVorlage as Object
      
      Dim oAllComponents as Object
      Dim oElements as Object
      Dim oElement as Object
      
      Dim oSheetAusVorlage as Object
      Dim oRange1AusVorlage as Object
      Dim oRange2AusVorlage as Object
      Dim oRange3AusVorlage as Object
      
      Dim oSheet as Object
      Dim oRange1 as Object
      Dim oRange2 as Object
      Dim oRange3 as Object
      Dim oRange4 as Object
      
      Dim oCellCursor as Object
      
      Dim fSekunde as Double
      Dim fTime as Double
      
      Dim nEndRow1 as Long
      Dim nEndRow2 as Long
      
      Dim nCnt1 as Long
      Dim nCnt2 as Long
      Dim nCnt3 as Long
      
      Dim mData1() as Variant	' Array für die Daten
      Dim mData2() as Variant	' Array für die Daten
      Dim mData3() as Variant	' Array für die Daten
      
      Dim sFileCSV as String
      Dim sPath as String
      Dim sFile as String
      Dim sUrl as String
      
      Dim bFound as Boolean
      
      	oDocAusVorlage=ThisComponent
      
      		oSheetAusVorlage=oDocAusVorlage.CurrentController.ActiveSheet
      			oRange1AusVorlage=oSheetAusVorlage.getCellRangeByName("A2:C2")
      			oRange2AusVorlage=oSheetAusVorlage.getCellRangeByName("A4:C86410")
      REM ---------------------------------------------------------------------------
      REM 				Zellinhalte löschen
      REM
      REM VALUE		Nummerische Werte
      REM DATETIME	Datum/Zeit-Werte
      REM STRING		Text
      REM ANNOTATION	Die Notiz
      REM FORMULA		Formeln
      REM HARDATTR	Die harten Formatierungen
      REM STYLES		Styles
      REM OBJECTS		Grafik
      REM EDITATTR	Textformartierungen ?
      			oRange1AusVorlage.ClearContents(com.sun.star.sheet.CellFlags.VALUE _
                               + com.sun.star.sheet.CellFlags.STRING _
                               + com.sun.star.sheet.CellFlags.DATETIME)
                               
      			oRange2AusVorlage.ClearContents(com.sun.star.sheet.CellFlags.VALUE _
                               + com.sun.star.sheet.CellFlags.STRING _
                               + com.sun.star.sheet.CellFlags.DATETIME)
                               
      
      REM ══════════════════════════════════════════════════════════════════════════════════════════════════════
      REM 				Hier die Pfadangabe, bzw. die URL ändern
      
      	' Unter Linux auch als URL angeben
      '	sUrl="file:///home/servus/Schreibtisch/Ha/" 
      	sUrl="file:///C:/temp%202021/Natal-Neu%20Makro/"
      
      
      		sFile=dir(sUrl & "Hans*.csv")
      			sPath = convertFromUrl(sUrl) & sFile
      
      '			msgbox sPath
      			
      REM ══════════════════════════════════════════════════════════════════════════════════════════════════════
      
      REM 			...................................
      REM Prüfen ob die CSV-Datei bereits geöffnet ist
      	sURL = ConverttoURL(sPath)
      	bFound=False
      		oAllComponents = StarDesktop.getComponents	
      			oElements = oAllComponents.CreateEnumeration
      	Do While oElements.HasMoreElements
      		oElement = oElements.NextElement
      		If oElement.hasLocation Then
      			If oElement.URL = sUrl Then
      					bFound = True
      					 Goto ErrorHandler
      				Exit Do
      			End If	
      		End If
      	Loop
      	
      '	If bFound=False Then
      
      REM -----------------------------------------------------------------------------------------------------
      REM Prüfung ob die Datei existiert.
      REM Dazu wird die "FileExists(sUrl)" aufgerufen;
      REM "FileExists(sUrl)" = TRUE		' Datei existiert
      REM "FileExists(sUrl)" = FALSE		' Datei existiert nicht oder der Dateiname ist falsch, bzw.
      REM der Dateiname entspricht nicht den Vorgaben, welche von diesem Makro gefordert werden
      	If FileExists(sUrl) Then
      		' "FileExists(sUrl)" = TRUE
      '		msgBox surl
      	Else
      		' "FileExists(sUrl)" = FALSE
          	msgBox "Die angegebene Datei:" & chr(10) & _
           			sFileCSV	 & chr(10) & _
           			"exisitiert nicht!"  & chr(10) & _
           		"--------------------------------"  & chr(10) & _
           		"Das Programm wird beendet"	,16, "Datei nicht vorhanden"
           			Exit Sub
        End If 
      
      REM 			...................................
      REM CSV-Datei öffnen
          sFileCSV = convertToUrl(sPath)
          if len(sFileCSV)>0 then
              dim mFileProps(2) as new com.sun.star.beans.PropertyValue
              mFileProps(0).Name = "FilterName" 	: mFileProps(0).Value = "Text - txt - csv (StarCalc)"
      		' der erste Token (59) der Filteroptionen gibt den Datenfeld-Separator an:
      		' Kommata	= 44
      		' Semikola	= 59
              mFileProps(1).Name = "FilterOptions" : mFileProps(1).Value = "44,34,76,1,,0,false,true,true,false"
      		' Datei im Hintergrund öffnen
              mFileProps(2).Name = "Hidden"		: mFileProps(2).Value = True
              oDocCSV = StarDesktop.loadComponentFromURL(sFileCSV, "_blank", 0, mFileProps())        
          end if
      
      REM 			...................................
      REM Daten aus dem CSV-File kopieren
      
      	oSheet=oDocCSV.CurrentController.ActiveSheet
      
      REM ----------------------------------------------------------------------------------------------------------------------------------------------
      			' CSV-Datei:	letzte befüllte Zelle
      			oCellCursor = oSheet.createCursor()
      	   			oCellCursor.GotoEndOfUsedArea(True)
      					nEndRow1 = oCellCursor.getRangeAddress.EndRow+1
      	
      		' CSV-Datei: Zellbereich "C2:E2"
      		oRange1=oSheet.getCellRangeByName("C2:E2")					' CSV-Daten kopieren
      		
      			' CSV-Datei: Zellbereich "B4:C (letzte Zeile)"
      REM getCellRangeByPosition ( nLeft as long, nTop as long, nRight as long, nBottom as long )
      			oRange2=oSheet.getCellRangeByPosition(1,3,2,nEndRow1)
      			' Leeres Array dimensionieren aus Spalte "AX" und "AZ"
      			oRange3=oSheet.getCellRangeByPosition(49,3,50,nEndRow1)
      
      REM ----------------------------------------------------------------------------------------------------------------------------------------------
      			mData1()=oRange1.getDataArray()	' CSV-Datei: Daten aus Zellebereich "C2:E2"
      			mData2()=oRange2.getDataArray()	' CSV-Datei: Daten aus Spalte "B" und "C"
      			mData3()=oRange3.getDataArray()	' CSV-Datei: Daten aus Spalte "AX" und "AZ" (Daten = "")
      
      REM ----------------------------------------------------------------------------------------------------------------------------------------------
      REM				CSV-Daten aus Array in neues Dokument schreiben
      		oSheetAusVorlage.getCellRangeByName("A2:C2").setDataArray(mData1())
      		oSheetAusVorlage.getCellRangeByPosition(2,3,3,nEndRow1).setDataArray(mData2())
      	
      
      REM neues Dokument: Inhalt "B2" kopieren und in  Zelle "B4" schreiben
      		oSheetAusVorlage.getCellRangeByName("B4").Value=	oSheetAusVorlage.getCellRangeByName("B2").Value
      
      REM ----------------------------------------------------------------------------------------------------------------------------------------------
      REM Zähler für Spalte A
      
      			' neues Dokument: letzte befüllte Zelle
      			oCellCursor = oSheetAusVorlage.createCursor()
      	   			oCellCursor.GotoEndOfUsedArea(True)
      					nEndRow2 = oCellCursor.getRangeAddress.EndRow+1 
      
      fSekunde=oSheetAusVorlage.getCellRangeByName("B4").Value
      fTime=oSheetAusVorlage.getCellRangeByName("B4").Value
      nCnt2=1	' Initialisierung: Zähler für Spalte "A"
      nCnt3=0
      Dim nUB as Long
      nUB=uBound(mData3())
      			mData3(0)(1)=oSheetAusVorlage.getCellRangeByName("$B$2").Value
      			For nCnt1=1 To nEndRow1
      						If nCnt3 >nUB Then Exit For
      					If mData2(nCnt3)(0) = ""  OR mData2(nCnt3)(1) = "" Then
      							' DANN Arrayfeld = ""
      							mData3(nCnt3)(0)=""
      							mData3(nCnt3)(1)=""
      							nCnt3=nCnt3+1
      					' WENN nicht LEER, 
      					ElseIf mData2(nCnt3,0) >= 0 AND mData2(nCnt3,1) >= 0 Then
      						' Wen Zähler > uBound(mData3())
      						If nCnt3 >nUB Then Exit For
      							' DANN Spalte "A" inkrementieren
      							mData3(nCnt3)(0) = nCnt2
      							If nCnt1 = 1 Then
      								mData3(nCnt3)(1) = fTime+fSekunde					' Zeit für Zelle B5
      							Else
      								mData3(nCnt3)(1) = fTime+mData2(nCnt3)(0) 		'Zeitberechnung bis letzte Zeile
      							End IF
      								' Zähler inkrementieren
      								nCnt2=nCnt2+1
      								nCnt3=nCnt3+1
      					End If
      				Next nCnt1
      		
      
      			mData3(0)(1)=oSheetAusVorlage.getCellRangeByName("$B$2").Value
      
      '			oSheetAusVorlage.getCellRangeByName("$A$4:$B$23").setDataArray(mData3())
      			oSheetAusVorlage.getCellRangeByPosition(0,3,1,nEndRow1).setDataArray(mData3())
      
      REM ----------------------------------------------------------------------------------------------------------------------------------------------
      REM Zellen formatieren mit Formatcode 41 = HH:MM:SS  → 12:12:10
      REM https://api.libreoffice.org/docs/idl/ref/namespacecom_1_1sun_1_1star_1_1i18n_1_1NumberFormatIndex.html
      		oSheetAusVorlage.getCellRangeByName("B2:C2").NumberFormat=41
      '		oSheetAusVorlage.getCellRangeByName("B4").NumberFormat=41
      		oSheetAusVorlage.getCellRangeByName("B4:C86410").NumberFormat=41
      REM 			...................................
      REM CSV-Datei schließen
      	oDocCSV.Close(True)
      		Msgbox "Programmende:  'Sub [CSV_DATEN importieren]'"  & Chr(10) & _
      				    		"______________________________" & Chr(10)  & Chr(10) & _
      				    		"Es wurden " & nCnt3 & " Datensätze geschrieben.", 64,"Programmende"
      REM End If
      
      Exit Sub
      
      REM 			...................................
      ErrorHandler:
      
          Reset
      
      	    MsgBox "Die CSV-Datei"  & Chr(10) & _
      	    			sPath   & Chr(10) & _
      	    			 "ist bereits geöffnet" & Chr(10) & _
      	    			   "Bitte schließen Sie die Datei und starten das Programm erneut" & Chr(10) & _
      	    		"______________________________" & Chr(10)  & Chr(10) & _
      			   	"Das Programm wird beendet!"	,0,"Fehlermeldung"
      REM CSV-Datei schließen
      XClose
      End Sub
      
      Sub XClose
      dim i As Integer
      dim ncnt1
      dim z
      dim y
      REM CSV-Datei schließen
      'xray 
      nCnt1=Stardesktop.Frames.Count
      		for i = 0 to nCnt1-1
      			z=Stardesktop.Frames.getByIndex (i).Title
      			y=left(z,4)
      		if   y="Hans" then
      '				Stardesktop.Frames.getByIndex (i).isHidden="False"
      				Stardesktop.Frames.getByIndex (i).Controller.Frame.Close(True)
      				print "geschlossen"
      				exit For
      		end if
      		Next i
      'Weiter:
      'xRay Stardesktop.Frames.getByIndex (2).Controller.Frame.Close(True)
      '	oDocCSV.Close(True)
      End Sub
      
    • Hier eine Info:
      Info neue Dokuvorlage Vorlage_P.odt
      (85 KiB) 74-mal heruntergeladen
    Gruß

    Craig

    Nie die Sicherungskopie vergessen!

    ════════════════════════════════════════════════
    WIN 10 Pro 64-Bit • LO 7.4.5.1 (x64) • AOO 4.1.8

    natal
    Beiträge: 119
    Registriert: So 8. Mär 2020, 20:03

    Re: variable Zellenzahl ermitteln

    Beitrag von natal » Sa 6. Feb 2021, 17:15

    Hallo craig
    Zuerst einmal eine Erfolgsmeldung, allerdings mit der alten Dokuvorlage Natal 31.01.2021.
    Diese Vorlage produziert ein fehlerfreies Ergebnis (aber mit 4 Messageboxen).
    Die neuen Vorlage_P ergibt Bild1.
    Liegt es wieder an mir?

    Gruß
    natal
    Dateianhänge
    Bild1.png
    Bild1.png (82.2 KiB) 1276 mal betrachtet

    craig
    Beiträge: 1137
    Registriert: Do 21. Apr 2016, 11:42

    Re: variable Zellenzahl ermitteln

    Beitrag von craig » Sa 6. Feb 2021, 17:17

    Hallo Natal,

    was ist falsch?
    Gruß

    Craig

    Nie die Sicherungskopie vergessen!

    ════════════════════════════════════════════════
    WIN 10 Pro 64-Bit • LO 7.4.5.1 (x64) • AOO 4.1.8

    natal
    Beiträge: 119
    Registriert: So 8. Mär 2020, 20:03

    Re: variable Zellenzahl ermitteln

    Beitrag von natal » Sa 6. Feb 2021, 17:25

    Nachtrag.
    Vielleicht ist das für Dich auch interessant.
    Bild1 mit Meldung "Programmende"
    Ergebnis mit Vorlage_P

    Bild2 zeigt Die das Ergebnis mit Dokuvorlage Natal 31.01.2021
    Dateianhänge
    Bild2.png
    Bild2.png (122.93 KiB) 1274 mal betrachtet
    Bildschirmfoto vom 2021-02-06 17-23-34.png
    Bildschirmfoto vom 2021-02-06 17-23-34.png (96.38 KiB) 1275 mal betrachtet
    Zuletzt geändert von natal am Sa 6. Feb 2021, 17:35, insgesamt 1-mal geändert.

    craig
    Beiträge: 1137
    Registriert: Do 21. Apr 2016, 11:42

    Re: variable Zellenzahl ermitteln

    Beitrag von craig » Sa 6. Feb 2021, 17:34

    Hallo Natal,

    ja, die Meldung besagt, dass das Makrro die Daten aus der
    CSV-Datei erfolgreich in das neue Dokument kopiert hat.
    Auch das alle Formatierungen usw. vorgenommen worden sind.

    Und wo ist nun der Fehler :?:

    Falls Du die Wenn-Formel suchst, diese habe ich im Makro nachgebildet.
    Sie erscheint nicht im Dokument :!:

    Öffne mal die Hans*.csv und lösche mal den Inhalt
    der Zelle B5 und lösche den Inhalt von B10 und C10.

    Jetzt sehe Dir das Ergebnis des Makros an.

    Noch ein Hinweis:
    Die CSV-Datei wird versteckt geöffnet, ist also auch nicht sichtbar!
    Gruß

    Craig

    Nie die Sicherungskopie vergessen!

    ════════════════════════════════════════════════
    WIN 10 Pro 64-Bit • LO 7.4.5.1 (x64) • AOO 4.1.8

    natal
    Beiträge: 119
    Registriert: So 8. Mär 2020, 20:03

    Re: variable Zellenzahl ermitteln

    Beitrag von natal » Sa 6. Feb 2021, 18:09

    Hi craig
    • Die beiden Bilder zeigen gelöschten Zellen der CSV-Datei
    • und das Ergebnis


    Aber wo sehe ich das Gesamtergebnis?
    Ich bin ein wenig überfordert.
    Gruß
    Dateianhänge
    Bild1.png
    Bild1.png (65.64 KiB) 1269 mal betrachtet
    Bild2.png
    Bild2.png (64.36 KiB) 1269 mal betrachtet

    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