Seite 1 von 3
Textboxen in einem UserForm leeren
Verfasst: Di 30. Aug 2022, 16:45
von qugart
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:
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
Re: Textboxen in einem UserForm leeren
Verfasst: Di 30. Aug 2022, 21:25
von tmp
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.
Re: Textboxen in einem UserForm leeren
Verfasst: Mi 31. Aug 2022, 06:29
von qugart
Ich sag schon mal Danke, aber auch das macht so rein gar nichts.
Re: Textboxen in einem UserForm leeren
Verfasst: Mi 31. Aug 2022, 08:48
von gogo
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
Re: Textboxen in einem UserForm leeren
Verfasst: Mi 31. Aug 2022, 14:30
von qugart
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.
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
Re: Textboxen in einem UserForm leeren
Verfasst: Mi 31. Aug 2022, 15:16
von gogo
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:
Re: Textboxen in einem UserForm leeren
Verfasst: Do 1. Sep 2022, 11:56
von qugart
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) 210-mal heruntergeladen
Re: Textboxen in einem UserForm leeren
Verfasst: Do 1. Sep 2022, 12:25
von gogo
da reicht schon ein kleiner Schubs - siehe Anhang
... Datum ist immer "Heute", oder wird's per Hand eingegeben?
... Nummer ist fortlaufend?
Re: Textboxen in einem UserForm leeren
Verfasst: Do 1. Sep 2022, 12:54
von qugart
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.
Re: Textboxen in einem UserForm leeren
Verfasst: Do 1. Sep 2022, 13:31
von gogo
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