πŸ™ 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. πŸ€—

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) 194-mal heruntergeladen
Bekomm ich noch einen kleinen Schubs?

mikele
* LO-Experte *
BeitrΓ€ge: 1930
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) 259-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) 209-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 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