Wir sind auf Ihre Unterstützung angewiesen!
💚 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. 🤗

Textboxen in einem UserForm leeren

Alles zur Programmierung im LibreOffice.
qugart
Beiträge: 12
Registriert: Do 19. Okt 2017, 13:12

Re: Textboxen in einem UserForm leeren

Beitrag von qugart » Do 1. Sep 2022, 13:38

Vielen Dank, da ist einiges dabei.

qugart
Beiträge: 12
Registriert: Do 19. Okt 2017, 13:12

Re: Textboxen in einem UserForm leeren

Beitrag von qugart » Di 6. Sep 2022, 10:52

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.
test.ods
(14.51 KiB) 45-mal heruntergeladen
Bekomm ich noch einen kleinen Schubs?

mikele
Beiträge: 1659
Registriert: Mo 1. Aug 2011, 20:51

Re: Textboxen in einem UserForm leeren

Beitrag von mikele » Di 6. Sep 2022, 11:04

Hallo,
du kannst doch auch ein Datumsfeld anstelle eines Textfeldes nutzen.
Gruß,
mikele

qugart
Beiträge: 12
Registriert: Do 19. Okt 2017, 13:12

Re: Textboxen in einem UserForm leeren

Beitrag von qugart » Di 6. Sep 2022, 11:39

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?

DavidG
Beiträge: 195
Registriert: Do 22. Mär 2018, 21:41

Re: Textboxen in einem UserForm leeren

Beitrag von DavidG » Di 6. Sep 2022, 22:22

Hallo,

kommt mein angepasster Code Deinem Wunsch näher?
test.ods
(14.97 KiB) 60-mal heruntergeladen
Gruß

David
___________________
WIN 10 PRO
LO 7.4.5.1 (x64)

qugart
Beiträge: 12
Registriert: Do 19. Okt 2017, 13:12

Re: Textboxen in einem UserForm leeren

Beitrag von qugart » Mi 7. Sep 2022, 07:04

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

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
in der Messagebox zu einem 12.12.2022 während in Zelle C2 dann nur ein 12122022 gesetzt wird?

DavidG
Beiträge: 195
Registriert: Do 22. Mär 2018, 21:41

Re: Textboxen in einem UserForm leeren

Beitrag von DavidG » Mi 7. Sep 2022, 12:48

Hallo,
Das mit den Präfixen bei den diversen Variablen werde ich mir wohl angewöhnen müssen.
Nein, dies ist nicht zwingend erforderlich, aber sauber deklarierte Variablen helfen bei der Fehlersuche.
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
Was mir aber immer noch nicht in den Kopf geht, wieso wird in meinem Beispiel ein
Ganz einfach:
  1. 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:

    Code: Alles auswählen

    sheet.GetCellRangeByName("C2").value = Dat
    In der Print-Anweisung übergibst Du aber einen String, damit sind die Punkte sichtbar.

    Umgekehrter Fall für die Print-Anweisung (Print-Anweisung = Value, bzw. Datentyp LONG)

    Code: Alles auswählen

    print cLng(Dat)
  2. Wenn Du einen String übergeben willtst, dann so:

    Code: Alles auswählen

    sheet.GetCellRangeByName("C2").String = Dat
    print Dat
    
    Damit sind dann beide Anweisungen vom Datentyp her gleich, also beide STRING's.
Gruß

David
___________________
WIN 10 PRO
LO 7.4.5.1 (x64)

qugart
Beiträge: 12
Registriert: Do 19. Okt 2017, 13:12

Re: Textboxen in einem UserForm leeren

Beitrag von qugart » Mi 7. Sep 2022, 13:49

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

Code: Alles auswählen

oCursor.goToEndOfUsedArea(False)
nicht mehr. Auch logisch, aber vorher nicht von mir bedacht.

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
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.
test1.ods
(17.38 KiB) 47-mal heruntergeladen
Muss da wohl ein bisschen mit dem Makrorecorder rumüben.

qugart
Beiträge: 12
Registriert: Do 19. Okt 2017, 13:12

Re: Textboxen in einem UserForm leeren

Beitrag von qugart » Mi 7. Sep 2022, 15:25

Ha!
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
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.

DavidG
Beiträge: 195
Registriert: Do 22. Mär 2018, 21:41

Re: Textboxen in einem UserForm leeren

Beitrag von DavidG » Mi 7. Sep 2022, 18:56

Hallo,

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 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
Es muss aber damit gerechnet werden, dass ich da noch weitere Fragen haben werde.
Dann erstelle bitte ein neues Thema :!:
Gruß

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 ❤️

Antworten