BITTE helfen Sie uns HEUTE mit einer SPENDE
Helfen Sie das LibreOffice Forum zu erhalten!
> 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
Re: variable Zellenzahl ermitteln
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
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
Re: variable Zellenzahl ermitteln
Hallo Natal,
Ich war schon fast am verzweifeln
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.
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.
Das freut mich sehr!Natal hat geschrieben:Es hat funktioniert!!!
Die ersten 3 Spalten meiner Dokuvorlage Unbenannt3-LibreOffice sind gefüllt.
Ich war schon fast am verzweifeln
Eindeutig JANatal hat geschrieben:Ob das auch die Ursache für viele Fehlversuche war?
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.
In der Dokumentvorlage selbst oder im meinem Makro.Natal hat geschrieben: Jetzt wären noch einpaar Änderungen in meiner Dokuvorlage notwendig.
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
Craig
Nie die Sicherungskopie vergessen!
════════════════════════════════════════════════
WIN 10 Pro 64-Bit • LO 7.4.5.1 (x64) • AOO 4.1.8
Re: variable Zellenzahl ermitteln
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
Re: variable Zellenzahl ermitteln
Nachtrag
So sieht eine befüllte Datei aus.
So sieht eine befüllte Datei aus.
- Dateianhänge
-
- Bildschirmfoto vom 2021-02-04 15-57-07.png (64.24 KiB) 1304 mal betrachtet
Re: variable Zellenzahl ermitteln
Hallo Natal,
es ist soweit...
es ist soweit...
- Hier die neue Dokuvorlage. Wie immer .zip entfernen NICHT entpacken.
- 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:
Gruß
Craig
Nie die Sicherungskopie vergessen!
════════════════════════════════════════════════
WIN 10 Pro 64-Bit • LO 7.4.5.1 (x64) • AOO 4.1.8
Craig
Nie die Sicherungskopie vergessen!
════════════════════════════════════════════════
WIN 10 Pro 64-Bit • LO 7.4.5.1 (x64) • AOO 4.1.8
Re: variable Zellenzahl ermitteln
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
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 (82.2 KiB) 1276 mal betrachtet
Re: variable Zellenzahl ermitteln
Hallo Natal,
was ist falsch?
was ist falsch?
Gruß
Craig
Nie die Sicherungskopie vergessen!
════════════════════════════════════════════════
WIN 10 Pro 64-Bit • LO 7.4.5.1 (x64) • AOO 4.1.8
Craig
Nie die Sicherungskopie vergessen!
════════════════════════════════════════════════
WIN 10 Pro 64-Bit • LO 7.4.5.1 (x64) • AOO 4.1.8
Re: variable Zellenzahl ermitteln
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
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 (122.93 KiB) 1274 mal betrachtet
-
- 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.
Re: variable Zellenzahl ermitteln
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!
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
Craig
Nie die Sicherungskopie vergessen!
════════════════════════════════════════════════
WIN 10 Pro 64-Bit • LO 7.4.5.1 (x64) • AOO 4.1.8
Re: variable Zellenzahl ermitteln
Hi craig
Aber wo sehe ich das Gesamtergebnis?
Ich bin ein wenig überfordert.
Gruß
- 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 (65.64 KiB) 1269 mal betrachtet
-
- 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 ❤️