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

Textboxen in einem UserForm leeren

Beitrag von qugart » Di 30. Aug 2022, 16:45

Hallo Leute,

ich hab ein kleines Problem mit VBA.
Ausgangslage ist, dass ich ein xlsm mit Makros habe. Einfaches Ding. Ruft nur ein UserForm auf, man trägt Zeug in die Textboxen ein und Klick auf den Button überträgt das dann entsprechend in die Tabelle.
Kann auch Libreoffice ohne irgendwelche größeren Änderungen.

Das einzige, was nicht klappt ist, dass nach dem Übertragen der Werte aus den Textfeldern in die Tabelle ich das UserForm leere und es erneut anzeigen lasse.
Das mache ich in Excel so:

Code: Alles auswählen

    Unload UserForm1
    UserForm1.Show

Libreoffice "leert" da das UserForm zeigt es dann aber nicht mehr an. Es wird quasi geschlossen.
Was muss ich da machen, dass Libreoffice das auch macht?
Denn mit einem anderen Makro rufe ich das UserForm ja erstmal auf und das lautet so:

Code: Alles auswählen

Private Sub CommandButton1_Click()
UserForm1.Show
End Sub
Was muss ich da denn machen, damit nach dem Übertragen der Daten aus dem Userform die Textfelder wieder geleert sind?
Hab da auch ein

Code: Alles auswählen

Dim c As Control
For Each c In UserForm1.Controls
If TypeOf c Is MSForms.TextBox Then
c = ""
End If
Next
versucht, was unter Excel auch funktioniert. In Libreoffice bleiben die Textboxen befüllt.

Ich selber bin da in VBA auch nicht so drin. Aber wie gesagt, in Excel funktioniert das so.
Und muss dann auch so weiterfunktionieren, weil da zwischen Excel und Libreoffice gewechselt wird.

Bin für jede Hilfe dankbar

qugart

tmp
Beiträge: 13
Registriert: Sa 27. Aug 2022, 12:41

Re: Textboxen in einem UserForm leeren

Beitrag von tmp » Di 30. Aug 2022, 21:25

Hallo qugart,

ich weiß nicht, ob es wirklich was hilft, aber du kannst ja mal c.Value = "" probieren.

Code: Alles auswählen

Dim c As Control
For Each c In UserForm1.Controls
If TypeOf c Is MSForms.TextBox Then
   c.Value = ""
End If
Next
Ich hatte nämlich mal das Problem, dass ich eine Zelle in Calc erst befüllen konnte, nachdem ich die Zelle mit .Value angesprochen hatte.

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

Re: Textboxen in einem UserForm leeren

Beitrag von qugart » Mi 31. Aug 2022, 06:29

Ich sag schon mal Danke, aber auch das macht so rein gar nichts.

gogo
Beiträge: 1072
Registriert: Sa 5. Feb 2011, 19:07

Re: Textboxen in einem UserForm leeren

Beitrag von gogo » Mi 31. Aug 2022, 08:48

vielleicht wär's schon mal hilfreich zu wissen was ein/das Userform ist, und was mit "Textbox" gemeint ist.
Der VBA-Support alleine deckt nur wenig ab.
c="" bedeutet nur, dass Du der Variablen c den Wert "" zuweist
c.Value = "" oder auch c.setText("") sind da schon vielversprechender (vorausgesetzt c ist ein Steuerelement).
Lade evtl. eine Beispieldatei hoch
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

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

Re: Textboxen in einem UserForm leeren

Beitrag von qugart » Mi 31. Aug 2022, 14:30

Oke...ich dachte, dass man hier im Forum weiß, was ein UserForm und eine TextBox ist....

Ich hab jetzt einfach mal die .xlsm angehängt.
Testdatei.xlsm
(27.93 KiB) 62-mal heruntergeladen
Nach einem Update von Libreoffice (irgendwas mit 7.0 auf die 7.3.5.2) wird jetzt auch das Userform geleert. Es muss aber neu geöffnet werden. Heißt, das letzte UserForm1.Show wird nicht aufgerufen.

Zur Erklärung was da passiert:
Es werden hier jeweils drei Daten (Nummer, Kennzeichen und Datum)per Handscanner eingescannt.
Das Manko ist, dass das "Kennzeichen" und das "Datum" 9stellig vom Scanner kommt. Heißt, ich entferne da einfach ein Zeichen per VBA.
Zusätzlich braucht das Datum noch die gebräuchlichn Punkte. Die füge ich auch per VBA ein.
Aus 30082022 wird eben ein 30.08.2022

Der Einfachheit halber werden die drei Daten (Nummer, Kennzeichen und Datum) in die Zellen A2, B2 und C2 geschrieben.
Und danach werden diese drei Zellen in die erste freie Zeile kopiert, sodass eine Liste entsteht. Ganz oben steht dann immer der als letztes eingetragene Datensatz.

Das alles funktioniert tatsächlich auch ohne Zutun in Libreoffice. Nur eben öffnet sich das UserForm (heißt wohl in Libreoffice Dialog) nicht, nachdem die Datensätze übertragen wurden.

Und hier mal den Code

Code: Alles auswählen

Rem Attribute VBA_ModuleType=VBAFormModule
Option VBASupport 1
Option Explicit

Private Sub CommandButton1_Click()
    'TextBox1 = Nummer, wird unbearbeitet eingetragen
    Range("A2") = TextBox1.Value
    'TextBox2 = Kennzeichen, letzte Ziffer wird entfernt
    Dim Kennzeichen As String
    Kennzeichen = Left(UserForm1.TextBox2.Text, Len(UserForm1.TextBox2.Text) - 1)
    Range("B2") = Kennzeichen
    'TextBox3 = Datum, als erstes wird die Stellenzahl um 1 gekürzt
    Dim datum As String
    datum = Left(UserForm1.TextBox3.Text, Len(UserForm1.TextBox3.Text) - 1)
    TextBox3 = datum
    'beim Datum wird der erste Punkt nach der zweiten stelle eingefügt
    'xxxxxxxx -> xx.xxxxxx
    Dim DateP1 As String
    If Len(TextBox3.Value) <> 8 Then
    Else
    TextBox3.Value = Left(TextBox3.Value, 2) & "." & Mid(TextBox3.Value, 3)
    End If
    'beim Datum wird der zweite Punkt nach der fünften stelle eingefügt
    'xx.xxxxxx -> xx.xx.xxxx
    Dim DateP2 As String
    If Len(TextBox3.Value) <> 9 Then
    Else
    TextBox3.Value = Left(TextBox3.Value, 5) & "." & Mid(TextBox3.Value, 6)
    End If
    Range("C2") = TextBox3.Value
    'Daten von A2 bis 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
    ' Formular wird geleert und neu gestartet
    Unload UserForm1
    UserForm1.Show
    
End Sub

Private Sub CommandButton2_Click()
    Unload UserForm1
    UserForm1.Hide
End Sub


gogo
Beiträge: 1072
Registriert: Sa 5. Feb 2011, 19:07

Re: Textboxen in einem UserForm leeren

Beitrag von gogo » Mi 31. Aug 2022, 15:16

nur mal so:
Setz' den Cursor in Spalte A und geh' im Menü auf "Daten"/"Formular ..."
das wäre vermutlich die Makro-freie LO-Onboard-Lösung.

ad Userform1:
Das ist in diesem Fall ein Dialog, und wie ein Dialog mit VBA-Support funktioniert, kann ich Dir leider nicht sagen.
Wenn ich die Datei mit LO 6.4 unter Linux öffne, hat der Dialog auch gar keine Schaltflächen oder ähnliches.

Dialoge werden prinzipiell ganz anders gehandhabt als "Formulare" und der VBA-Modus dazu erschwert einiges. Ich glaube bloß, dass ein "Unload UserForm1" nicht durch ein "UserForm1.Show" wiederhergestellt werden kann. Vermutlich musst Du das UserForm1 zuerst wieder laden und dann anzeigen (das geht mit LO-Basic etwa so: UserForm1= foo.bar.LoadDialog("Standard", "UserForm1") und dann UserForm1.Execute()). Show und Hide bewirken übrigens in der Regel keine Löschung von Daten...

Am einfachsten ist es vermutlich, die Textboxen zu leeren à la:

Code: Alles auswählen

...
UserForm1.TextBox1.Value =""
...
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

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

Re: Textboxen in einem UserForm leeren

Beitrag von qugart » Do 1. Sep 2022, 11:56

Das muss ich mal ausprobieren.
Schon mal danke.

Ich werde aber den ganzen Sums mal direkt für LO schreiben. Der Wechsel zwischen LO und Excel ist dann zu gefährlich, dass die Makros verloren gehen.

Bis jetzt hab ich den Dialog und die entsprechenden Buttons zum starten und beenden.
Dazwischen wirds aber mau.
Ich weiß ja noch nicht mal, wie ich die Inhalte der Textfelder aus dem Dialog in die Zellen bekomme.
Geschweige denn von der Geschichte mit den Stellen um 1 verringern und fürs Datum auch noch Punkte einfügen.
Und dann muss ich noch die erste freie Zeile finden lassen und dann die drei Zellen dahin kopieren.

Ich muss mich mal auf die Suche nach irgend einer Doku machen, in der man blättern kann. Leider finde ich da entweder nur komplett oberflächliches, oder nur allgemeines zu Makros.

Mich wurmt es schon, dass ich jetzt nicht mal genau weiß, wie ich den das TextField1 aus meinem Dialog ansprechen muss, damit ich dessen Wert dann in eine Zelle übertragen kann.

Kann mir da jemand einen Schubs bei meinem Versuch geben?
test.ods
(12.86 KiB) 52-mal heruntergeladen

gogo
Beiträge: 1072
Registriert: Sa 5. Feb 2011, 19:07

Re: Textboxen in einem UserForm leeren

Beitrag von gogo » Do 1. Sep 2022, 12:25

da reicht schon ein kleiner Schubs - siehe Anhang
... Datum ist immer "Heute", oder wird's per Hand eingegeben?
... Nummer ist fortlaufend?
Dateianhänge
test.ods
(12.98 KiB) 57-mal heruntergeladen
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

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

Re: Textboxen in einem UserForm leeren

Beitrag von qugart » Do 1. Sep 2022, 12:54

Super, danke.
Schau ich mir gleich an.

Edit:
Ah....das mit dem Wert als Text habe ich auch schon versucht. Ich hab da nur die Klammern nicht gesetzt, weil eben .value da auch ohne geht. Okay....muss also dann .text() heißen.
Und das mit dem "Vorbelegen" der Felder für den Dialog ist auch hilfreich. Danke


Nö, das sind immer völlig unterschiedliche und unabhängige Werte.
Für dann so einfach hätte ich das generell ohne Makro gemacht.

In der tatsächlichen Datei werden dann für die Eingaben eben noch Werte aus anderen Tabellen per Index oder dergleichen ergänzt.

Was ich halt generell brauche sind folgende "Funktionen":
Beim eingelesenen Wert die letzte Stelle entfernen:
xxxxxxxxy wird zu xxxxxxxx
Obwohl ich gerade gesehen hab, dass ich das wohl durch die max. Textlänge in den Eigenschaften des Textfelds abhandeln kann (theoretisch)

Dem Wert zwei Punkte hinzufügen:
xxxxxxxx wird zu xx.xx.xxxx

Und dann noch die erste freie Zeile von oben finden (in die dann die drei Endwerte eben kopiert werden)

Mal schauen, ob ich da irgendwo was Doku-ähnliches finde. Dieses Basic von LO muss ja irgendwo beschrieben sein.
Ich finde da immer nur alte Verweise zu OpenOffice und StarBasic. Ich kann da nie abschätzen inwiefern das noch alles gültig ist.


Blöde Zwischenfrage noch gleich:
Dieses Definieren thisDocument und doc.Sheets(0) muss man das in jedes Makro packen oder kann man das nicht auch "global" definieren? Ich hab das mal gleich am Anfang unter das dim gesetzt, aber da meckert er, weil er ein Sub erwartet.

gogo
Beiträge: 1072
Registriert: Sa 5. Feb 2011, 19:07

Re: Textboxen in einem UserForm leeren

Beitrag von gogo » Do 1. Sep 2022, 13:31

Die Klammern hinter einer Property müssen nicht sein, ob .text oder .text() ist egal, sie erleichtern nur das Lesen des Codes.
thisComponent bezieht sich immer auf das Dokument, aus dem das Makro gestartet wird. Wenn Du anderes Dokument im LO-Workspace suchst, dann etwa so:

Code: Alles auswählen

function get_document_by_title(sTitle)
get_document_by_title = "###FEHLER###"
if ismissing(sTitle) then exit function
sd_enum =  StarDesktop.Components.createEnumeration()
If Not IsNull(sd_enum) Then
	Do While sd_enum.hasMoreElements()
		component = sd_enum.nextElement()
		if component.Title() = sTitle then
			get_document_by_title = component
			exit function
		end if
	loop
end if
end function
Stringbearbeitung findest Du in der LO-Hilfe unter Laufzeitfunktionen/Zeichenketten... also etwa so:

Code: Alles auswählen

d="123456789"
print left(d,2) & "." & mid(d,3,2) & "." & mid(d,5,4) 


Bisserl Literatur (Klassiker) für Dialoge:

Alter aber gut:
https://www.dannenhoefer.de/faqstarbasic/Dialoge.html

Ebenfalls:
Makro Kochbuch (Thomas Krumbein) LibreOffice/OpenOffice Basic
(gab's mal als Download bevor München dachte ... wir haben eh' genug Geld ...)

sowie klarerweise:
OpenOffice.org Macro Information (Andrew Pitonyak)
https://www.pitonyak.org
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

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