Wir sind auf Ihre Unterstützung angewiesen!
💚 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. 🤗
Textboxen in einem UserForm leeren
Re: Textboxen in einem UserForm leeren
Vielen Dank, da ist einiges dabei.
Re: Textboxen in einem UserForm leeren
Oke....
Ich hab da jetzt ein bissl rumgebastelt und hab mir da auch was gesucht, wie man die erste freie Zeile findet. Das klappt gut.
Nur das mit den Punkten in das Datum bringen haut nicht so hin.
Wenn ich die Vriable Dat anzeigen lasse, dann passt das.
Wenn ich die Variable aber in die Zelle schreibe, dann fehlen die Punkte.
Ich bin da jetzt überfragt. Bekomm ich noch einen kleinen Schubs?
Ich hab da jetzt ein bissl rumgebastelt und hab mir da auch was gesucht, wie man die erste freie Zeile findet. Das klappt gut.
Nur das mit den Punkten in das Datum bringen haut nicht so hin.
Wenn ich die Vriable Dat anzeigen lasse, dann passt das.
Wenn ich die Variable aber in die Zelle schreibe, dann fehlen die Punkte.
Ich bin da jetzt überfragt. Bekomm ich noch einen kleinen Schubs?
Re: Textboxen in einem UserForm leeren
Hallo,
du kannst doch auch ein Datumsfeld anstelle eines Textfeldes nutzen.
du kannst doch auch ein Datumsfeld anstelle eines Textfeldes nutzen.
Gruß,
mikele
mikele
Re: Textboxen in einem UserForm leeren
So traurig das ist, nein kann ich nicht.
Also, rein aufgrund meines Unvermögens.
Das mit Datum anstelle von Text wäre aber wohl der Lösung zuträglich.
Meint: wie mach ich das?
Also, rein aufgrund meines Unvermögens.
Das mit Datum anstelle von Text wäre aber wohl der Lösung zuträglich.
Meint: wie mach ich das?
Re: Textboxen in einem UserForm leeren
Hallo,
kommt mein angepasster Code Deinem Wunsch näher?
kommt mein angepasster Code Deinem Wunsch näher?
Gruß
David
___________________
WIN 10 PRO
LO 7.4.5.1 (x64)
David
___________________
WIN 10 PRO
LO 7.4.5.1 (x64)
Re: Textboxen in einem UserForm leeren
Hallo David,
Danke dafür.
Das sollte tatsächlich funktionieren. Ich war mir da anfänglich nicht sicher, ob ich damit arbeiten kann, denn die Datei wird anschließend als CSV gespeichert. Aber tatsächlich bleibt da das Datums-Format erhalten.
Aufgrund des "merkwürdigen" Datum-Verhaltens in sämtlichen Tabellenkalkulationen versuche ich da immer mit Strings zu arbeiten. Zumindest wenns halt nur um Daten für diverse Schnittstellen geht. Meistens wirds eh nur kurz und dreckig.
Ich hab mal kurz den Code angesehen. Danke für die Erläuterungen. Das mit den Präfixen bei den diversen Variablen werde ich mir wohl angewöhnen müssen.
Was mir aber immer noch nicht in den Kopf geht, wieso wird in meinem Beispiel ein
in der Messagebox zu einem 12.12.2022 während in Zelle C2 dann nur ein 12122022 gesetzt wird?
Danke dafür.
Das sollte tatsächlich funktionieren. Ich war mir da anfänglich nicht sicher, ob ich damit arbeiten kann, denn die Datei wird anschließend als CSV gespeichert. Aber tatsächlich bleibt da das Datums-Format erhalten.
Aufgrund des "merkwürdigen" Datum-Verhaltens in sämtlichen Tabellenkalkulationen versuche ich da immer mit Strings zu arbeiten. Zumindest wenns halt nur um Daten für diverse Schnittstellen geht. Meistens wirds eh nur kurz und dreckig.
Ich hab mal kurz den Code angesehen. Danke für die Erläuterungen. Das mit den Präfixen bei den diversen Variablen werde ich mir wohl angewöhnen müssen.
Was mir aber immer noch nicht in den Kopf geht, wieso wird in meinem Beispiel ein
Code: Alles auswählen
Datum = "12122022"
Dat = left(Datum,2) & "." & mid(Datum,3,2) & "." & mid(Datum,5,4)
sheet.GetCellRangeByName("C2").value = Dat
print Dat
Re: Textboxen in einem UserForm leeren
Hallo,
Ausserdem wird in Andrew's OOME empfohlen Option Explicit
zu verwenden, damit man zur sauberen Deklaration gezwungen wird.
Beispiel zu Option Explicit
Nein, dies ist nicht zwingend erforderlich, aber sauber deklarierte Variablen helfen bei der Fehlersuche.Das mit den Präfixen bei den diversen Variablen werde ich mir wohl angewöhnen müssen.
Ausserdem wird in Andrew's OOME empfohlen Option Explicit
zu verwenden, damit man zur sauberen Deklaration gezwungen wird.
Beispiel zu Option Explicit
Code: Alles auswählen
REM ***** BASIC *****
Option Explicit
REM Sauber deklariert
Sub Main_OK
Dim sText as String
sText = "Banane"
print sText
End Sub
REM Laufzeitfehler wegen fehlender Deklaration
Sub Main_Laufzeitfehler
sText = "Banane"
print sText
End Sub
REM !!! → TRICKY ← !!!
REM Hier wird kein Laufzeitfehler ausgelöst,
REM weil eine Deklaration vorhanden ist.
REM Das Print-Ergebnis ist aber FALSCH!!!
Sub Main_falscheDeklaration
Dim sText as Long
sText = "Banane"
print sText
End Sub
Ganz einfach:Was mir aber immer noch nicht in den Kopf geht, wieso wird in meinem Beispiel ein
- Du übergibst ein VALUE an die Zelle. Der Interpreter eliminiert offensichtlich alle
Strings, in Deinem Fall alle Punkte und über gibt nur die erkannten Zahlen:In der Print-Anweisung übergibst Du aber einen String, damit sind die Punkte sichtbar.Code: Alles auswählen
sheet.GetCellRangeByName("C2").value = Dat
Umgekehrter Fall für die Print-Anweisung (Print-Anweisung = Value, bzw. Datentyp LONG)Code: Alles auswählen
print cLng(Dat)
- Wenn Du einen String übergeben willtst, dann so:
Damit sind dann beide Anweisungen vom Datentyp her gleich, also beide STRING's.
Code: Alles auswählen
sheet.GetCellRangeByName("C2").String = Dat print Dat
Gruß
David
___________________
WIN 10 PRO
LO 7.4.5.1 (x64)
David
___________________
WIN 10 PRO
LO 7.4.5.1 (x64)
Re: Textboxen in einem UserForm leeren
Jo, eigentlich logisch.
Dachte bisher, das .value meint hier schlicht den Inhalt der Zelle und macht da einen String draus.
Ebenso dachte ih Print gibt schlicht den Inhalt aus, egal, wie es deklariert wird.
Habs schon gesehen, man muss hier wirklich sauber deklarieren. Ich bastel da mehr über Python für schnelle Ausgaben, da geht das ziemlich ungenau her.
Das mit den Präfixen für die Variablen hat aber schon den Vorteil, dass man sich nicht ständig lustige Namen ausdenken muss. Ich muss ja die Textfeldinhalte noch kürzen und arbeite da z.B. mit Left(Nummer, Len(Nummer) - 1). Erleichtert dann die Geschichte (für mich zumindest) wenn ich da vorher die Variablen sNummer und nNummer deklariere. Wird dann ein Left(sNummer, sNummer - 1).
Will sagen: gar nicht mal so dumm die Idee.
Es hat sich jetzt aber noch ein kleines (oder größeres) Problem ergeben.
Die Tabelle wird vorformatiert auf über 250 Zeilen. Rahmen und so. User braucht das unbedingt, sonst flippt die mir aus.
Dementsprechend klappt natürlich das mit dem
nicht mehr. Auch logisch, aber vorher nicht von mir bedacht.
In Excel hab ich das so gelöst:
Es wird also explizit die erste leere Zeile ermittelt. Also genau anders rum wie bei LO. Er fängt unten an und arbeitet sich nach oben.
Da bin ich völlig ideenlos, wie das mit LO Basic funktioniert.
Ich hätte hier dann noch eine Beispieldatei, in der man ein bisschen Formatierung sieht.
Gewünscht ist halt dass da ab Zeile 4 reinkopiert wird, wenn da die Spalte A leer ist. Muss da wohl ein bisschen mit dem Makrorecorder rumüben.
Dachte bisher, das .value meint hier schlicht den Inhalt der Zelle und macht da einen String draus.
Ebenso dachte ih Print gibt schlicht den Inhalt aus, egal, wie es deklariert wird.
Habs schon gesehen, man muss hier wirklich sauber deklarieren. Ich bastel da mehr über Python für schnelle Ausgaben, da geht das ziemlich ungenau her.
Das mit den Präfixen für die Variablen hat aber schon den Vorteil, dass man sich nicht ständig lustige Namen ausdenken muss. Ich muss ja die Textfeldinhalte noch kürzen und arbeite da z.B. mit Left(Nummer, Len(Nummer) - 1). Erleichtert dann die Geschichte (für mich zumindest) wenn ich da vorher die Variablen sNummer und nNummer deklariere. Wird dann ein Left(sNummer, sNummer - 1).
Will sagen: gar nicht mal so dumm die Idee.
Es hat sich jetzt aber noch ein kleines (oder größeres) Problem ergeben.
Die Tabelle wird vorformatiert auf über 250 Zeilen. Rahmen und so. User braucht das unbedingt, sonst flippt die mir aus.
Dementsprechend klappt natürlich das mit dem
Code: Alles auswählen
oCursor.goToEndOfUsedArea(False)
In Excel hab ich das so gelöst:
Code: Alles auswählen
'Daten von A2-C2 werden selektiert und in die nächste freie Zeile eingefügt
Range("A2:C2").Select
Selection.Copy
'nächste freie Zeile wird ermittelt
Cells(65000, 1).End(xlUp).Offset(1, 0).Select
ActiveSheet.Paste
Application.CutCopyMode = False
Da bin ich völlig ideenlos, wie das mit LO Basic funktioniert.
Ich hätte hier dann noch eine Beispieldatei, in der man ein bisschen Formatierung sieht.
Gewünscht ist halt dass da ab Zeile 4 reinkopiert wird, wenn da die Spalte A leer ist. Muss da wohl ein bisschen mit dem Makrorecorder rumüben.
Re: Textboxen in einem UserForm leeren
Ha!
Makrorekorder hat mir nicht viel geholfen.
Aber ich hab das hier gefunden:
Ist zwar eine eher unschöne while-Schleife aber ich habs mit nicht viel Daten zu tun und es tut seinen Zweck.
Ich sage nochmal allen Danke, die mir hier weitergeholfen haben.
Es muss aber damit gerechnet werden, dass ich da noch weitere Fragen haben werde.
Makrorekorder hat mir nicht viel geholfen.
Aber ich hab das hier gefunden:
Code: Alles auswählen
nEndZeile = 0
while oSheet.getcellbyPosition(0,nEndZeile).string <> ""
nEndZeile = nEndZeile+1
wend
Ich sage nochmal allen Danke, die mir hier weitergeholfen haben.
Es muss aber damit gerechnet werden, dass ich da noch weitere Fragen haben werde.
Re: Textboxen in einem UserForm leeren
Hallo,
hier zum Thema "leere Zelle" ein Sammelsorium von mir:
hier zum Thema "leere Zelle" ein Sammelsorium von mir:
Code: Alles auswählen
Option Explicit
REM gehört zur zweiten Sub (LeereZelle)
Dim bCheckRange as Boolean
REM ══════════════════════════════════════════════════════════════════════════════════════════════════════════════
Sub letzte_nichtleere_Spalte_und_Zeile
Dim oSheet as Object
Dim oCursor as Object
Dim nLetzteSpalte as Long
Dim nLetzteZeile as Long
oSheet = thisComponent.sheets(0) '1.Blatt
oCursor = oSheet.createCursor()
oCursor.gotoStart()
oCursor.gotoEndofUsedArea(false) 'letzte Zelle des Bereiches
' xray oCursor
nLetzteSpalte = oCursor.getRangeAddress.endColumn 'index letzte Spalte des Bereichs
nLetzteZeile = oCursor.getRangeAddress.endRow 'index letzte Zeile des Bereichs
End Sub
REM ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
REM ══════════════════════════════════════════════════════════════════════════════════════════════════════════════
Sub LeereZelle
Dim oDoc as Object
Dim oSheet as Object
Dim oCRange1 as Object
Dim oCRange2 as Object
Dim oCAddress1 as Object
Dim oCAddress2 as Object
Dim oEmptyCells as Object
Dim oFirstEmptyCell
Dim nRow1 as Long, nRow2 as Long
Dim sColumn as String
Dim bCheckRange as Boolean
oDoc = thiscomponent
oSheet = oDoc.Sheets(0)
oCRange1 = oSheet.getCellRangeByName("A4:A51")
oCRange2 = oSheet.getCellRangeByName("B4:B51")
bCheckRange=False
'xray oSheet
oEmptyCells = oCRange1.queryEmptyCells
'xray oEmptyCells(0)
oFirstEmptyCell = oEmptyCells(0).getCellByPosition(0,0)
sColumn = oFirstEmptyCell.Columns(0).Name
oCAddress1 = oFirstEmptyCell.Celladdress
'xray oCAddress1
msgbox ("Ergebnis:" & CHR$(10) & "Spalte " & oFirstEmptyCell.Columns(0).Name & _
" (Nr. " & oCAddress1.Column + 1 &")" & CHR$(10) & "Zeile " & oCAddress1.Row + 1,64,"Erste leere Zelle")
oEmptyCells = oCRange2.queryEmptyCells
'xray oEmptyCells(0)
oFirstEmptyCell = oEmptyCells(0).getCellByPosition(0,0)
sColumn = oFirstEmptyCell.Columns(0).Name
oCAddress2 = oFirstEmptyCell.Celladdress
msgbox ("Ergebnis:" & CHR$(10) & "Spalte " & oFirstEmptyCell.Columns(0).Name & _
" (Nr. " & oCAddress2.Column + 1 &")" & CHR$(10) & "Zeile " & oCAddress2.Row + 1,64,"Erste leere Zelle")
nRow1=oCAddress1.Row
nRow2=oCAddress2.Row
If nRow1=nRow2 then
bCheckRange=True
Print bCheckRange
Else
bCheckRange=False
Print bCheckRange
end if
End Sub
REM ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
REM ══════════════════════════════════════════════════════════════════════════════════════════════════════════════
REM Inhalt von F28 in nächst freie Zelle von Spalte H schreiben
Sub Copy_F28
Dim oSheet as Object
Dim oSourceCell as Object
Dim oColumnH as Object
Dim oQEC as Object
Dim oFECR as Object
Dim oFirstEmptyCell as Object
oSheet = ThisComponent.Sheets.getbyName("Tabelle1")
oSourceCell = oSheet.getcellrangebyname("F28")
oColumnH = oSheet.Columns.getbyName("H")
oQEC = oColumnH.queryEmptyCells
'xray oQEC
oFECR= oQEC.RangeAddresses(0)
'xray oFECR
oFirstEmptyCell = oSheet.getcellbyposition(oFECR.StartColumn,oFECR.StartRow)
oFirstEmptyCell.Value = oSourceCell.Value
End Sub
REM ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
REM ══════════════════════════════════════════════════════════════════════════════════════════════════════════════
Sub letzte_Zeile
Dim oSheet as Object
Dim oCellCursor as Object
REM Variablen deklarieren mittels Kürzel
REM https://help.libreoffice.org/7.2/de/text/sbasic/shared/01020100.html?DbPAR=BASIC#bm_id3149346
Dim nEndRow& ' & = LONG
oSheet = ThisComponent.CurrentController.getActiveSheet()
oCellCursor = oSheet.createCursor()
oCellCursor.GotoEndOfUsedArea(True)
nEndRow = oCellCursor.getRangeAddress.EndRow
' ACHTUNG: Die Zeilenzählung beginnt bei 0!
msgbox nEndRow
End Sub
REM ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
REM ══════════════════════════════════════════════════════════════════════════════════════════════════════════════
REM Quelle: Volker Lenhardt AOO und LO OOME_3_0_deutsch.pdf
REM Seite: 484
REM Listing 434. Enumeriert Zeilen in einem Bereich und sucht nicht-leere Zellen.
REM ══════════════════════════════════════════════════════════════════════════════════════════════════════════════
Sub TraverseRows
Dim oRange 'Der primäre Bereich
Dim oSheet 'Das erste Tabellenblatt
Dim oRows 'Das Zeilen-Objekt
Dim oRow 'Eine einzelne Zeile
Dim oRowEnum 'Enumerator für die Zeilen
Dim s As String 'Ausgabestring
oSheet = ThisComponent.Sheets(0)
oRange = oSheet.getCellRangeByName("A1:A5000")
REM Ich will nun ALLE nicht-leeren Zellen in den Zeilen finden,
REM die den Bereich durchlaufen. Beachten Sie, dass ich die Suche
REM nicht auf den Bereich begrenzen will, aber ich interessiere mich für die Zeilen.
oRows = oRange.getRows()
REM Sicher, ich könnte über den Index zugreifen,
REM aber das haben Sie sicher auch erwartet!
oRowEnum = oRows.createEnumeration()
Do While oRowEnum.hasMoreElements()
oRow = oRowEnum.nextElement()
s = s & NonEmptyCellsInRange(oRow, " ") & Chr$(10)
Loop
MsgBox s, 0, "Nicht-leere Zellen in Zeilen"
End Sub
REM Seite: 478
REM Listing 430. Suche in einem Bereich nach Zellen, die nicht leer sind.
Function NonEmptyCellsInRange(oRange, sep$) As String
Dim oCell 'Die zu verwendende Zelle
Dim oRanges 'Die nach der Zellabfrage zurückgegebenen Bereiche
Dim oAddrs() 'CellRangeAddress-Array der Adressen der Zellbereiche
Dim oAddr 'Eine einzelne Bereichsadresse
Dim oSheet 'Tabellenblatt, das den Zellbereich enthält
Dim i As Long 'Indexvariable
Dim nRow As Long 'Zeilennummer
Dim nCol As Long 'Spaltennummer
Dim s As String
REM Zuerst werden die Zellen im Bereich gesucht, die nicht leer sind.
REM Dabei wird eine Zelle als nicht leer betrachtet, die entweder
REM einen Wert, einen String, eine Formel oder Datum/Uhrzeit enthält.
oRanges = oRange.queryContentCells(_
com.sun.star.sheet.CellFlags.VALUE Or _
com.sun.star.sheet.CellFlags.DATETIME Or _
com.sun.star.sheet.CellFlags.STRING Or _
com.sun.star.sheet.CellFlags.FORMULA)
oAddrs() = oRanges.getRangeAddresses()
For i = 0 To UBound(oAddrs())
REM Eine spezifische Bereichsadresse.
oAddr = oAddrs(i)
For nRow = oAddr.StartRow To oAddr.EndRow
For nCol = oAddr.StartColumn To oAddr.EndColumn
REM Die CellRange-Methode getSpreadsheet() gibt das
REM Tabellenblattobjekt zurück.
REM oRange.getCellByPosition(nCol, nRow) wäre ein relativer
REM Bezug innerhalb des Zellbereichs.
oCell = oRange.Spreadsheet.getCellByPosition(nCol, nRow)
s = s & oCell.AbsoluteName & sep$
Next
Next
Next
NonEmptyCellsInRange = s
End Function
REM ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
REM ══════════════════════════════════════════════════════════════════════════════════════════════════════════════
REM Ermittlung der letzen befüllten Zeile in Spalte A per Array-Inhalt
REM ══════════════════════════════════════════════════════════════════════════════════════════════════════════════
Sub CalcLastRowPerArray
Dim oDoc as Object
Dim oSheet1 as Object
Dim oRange1 as Object
Dim mArr1() as Variant
Dim nStartRow as long
Dim nStartCol as long
Dim nEndRow as long
Dim nEndCol as long
oDoc=ThisComponent
oSheet1=oDoc.getSheets.getbyIndex(0)
oRange1=oSheet1.getCellRangeByName("A2:A10")
mArr1()=oRange1.getDataArray()
nEndRow=1
For i = lBound(mArr1()) to uBound(mArr1())
if mArr1(i)(0) <> "" then
nEndRow=nEndRow+1
End if
Next i
print nEndRow 'mArr1(0)(0)
print mArr1(nEndRow-2)(0)
End Sub
REM ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
Dann erstelle bitte ein neues ThemaEs muss aber damit gerechnet werden, dass ich da noch weitere Fragen haben werde.
Gruß
David
___________________
WIN 10 PRO
LO 7.4.5.1 (x64)
David
___________________
WIN 10 PRO
LO 7.4.5.1 (x64)
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 ❤️