Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1852to1856
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

UserForm mit Zahlen und sortiert

UserForm mit Zahlen und sortiert
25.10.2021 17:16:07
Beni
Hallo allerseits
Ich habe eine UserForm gebastelt, dabei mich SEHR stark an Online-Lösungen orientiert. Nun müsste ich diese noch etwas anpassen, komme allerdings mit der Umsetzung nicht mehr voran.
Code liegt bei, folgende Dinge bräuchte ich noch:
- Alle TextBox (ausser Spalte 1,2) sind Zahlen, werden aber noch als Text ins Excelsheet eingefügt. Diese müssen alle als Zahlen eingefügt resp. umgewandelt werden, da danach Formeln diese weiterverarbeiten. Habe zwar Scripts gefunden, brings aber nicht zum laufen..
- Ausserdem würde ich gerne die ListBox resp. meine Tabelle im Excel jeweils bei 'neuem Eintrag' oder 'Öffnen der Datei' alphabetisch sortieren (zuerste nach Gruppe in Spalte 1, danach nach Städtename in Spalte 2) resp. diese Sortierung überprüfen. Hier gibts zwar auch jede Menge Scripts zu finden, bringe diese aber nicht zum laufen.. da ich im Excel selbst mit Index/Vergleich arbeite, ist die Sortierung der Tabelle ja kein Problem, wäre einfach einiges angenehmer, wenns jeweils automatisch passieren würde.
Herzlichen Dank für jede Hilfe :)

Option Explicit
Option Compare Text
Private Const iCONST_ANZAHL_EINGABEFELDER As Integer = 23
Private Const lCONST_STARTZEILENNUMMER_DER_TABELLE As Long = 2
' EREIGNISROUTINEN DER USERFORM
Private Sub CommandButton1_Click()
Call EINTRAG_ANLEGEN
End Sub
Private Sub CommandButton2_Click()
Call EINTRAG_LOESCHEN
End Sub
Private Sub CommandButton3_Click()
Call EINTRAG_SPEICHERN
End Sub
Private Sub CommandButton4_Click()
Unload Me
End Sub
Private Sub ListBox1_Click()
Call EINTRAG_LADEN_UND_ANZEIGEN
End Sub
Private Sub UserForm_Activate()
If ListBox1.ListCount > 0 Then ListBox1.ListIndex = 0
End Sub
Private Sub UserForm_Initialize()
Call LISTE_LADEN_UND_INITIALISIEREN
End Sub
' VERARBEITUNGSROUTINEN
Private Sub LISTE_LADEN_UND_INITIALISIEREN()
Dim lZeile As Long
Dim lZeileMaximum As Long
Dim i As Integer
For i = 1 To iCONST_ANZAHL_EINGABEFELDER
Me.Controls("TextBox" & i) = ""
Next i
ListBox1.Clear
ListBox1.ColumnCount = 3
ListBox1.ColumnWidths = "0;75;;"
lZeileMaximum = Tabelle5.UsedRange.Rows.Count
For lZeile = lCONST_STARTZEILENNUMMER_DER_TABELLE To lZeileMaximum
If IST_ZEILE_LEER(lZeile) = False Then
ListBox1.AddItem lZeile
ListBox1.List(ListBox1.ListCount - 1, 1) = CStr(Tabelle5.Cells(lZeile, 1).Text)
ListBox1.List(ListBox1.ListCount - 1, 2) = CStr(Tabelle5.Cells(lZeile, 2).Text)
ListBox1.List(ListBox1.ListCount - 1, 3) = CStr(Tabelle5.Cells(lZeile, 3).Text)
End If
Next lZeile
End Sub
Private Sub EINTRAG_LADEN_UND_ANZEIGEN()
Dim lZeile As Long
Dim i As Integer
For i = 1 To iCONST_ANZAHL_EINGABEFELDER
Me.Controls("TextBox" & i) = ""
Next i
If ListBox1.ListIndex >= 0 Then
lZeile = ListBox1.List(ListBox1.ListIndex, 0)
For i = 1 To iCONST_ANZAHL_EINGABEFELDER
Me.Controls("TextBox" & i) = CStr(Tabelle5.Cells(lZeile, i).Text)
Next i
End If
End Sub
Private Sub EINTRAG_SPEICHERN()
Dim lZeile As Long
Dim i As Integer
If ListBox1.ListIndex = -1 Then Exit Sub
lZeile = ListBox1.List(ListBox1.ListIndex, 0)
For i = 1 To iCONST_ANZAHL_EINGABEFELDER
Tabelle5.Cells(lZeile, i) = Me.Controls("TextBox" & i)
Next i
ListBox1.List(ListBox1.ListIndex, 1) = TextBox1
ListBox1.List(ListBox1.ListIndex, 2) = TextBox2
ListBox1.List(ListBox1.ListIndex, 3) = TextBox3
End Sub
Private Sub EINTRAG_LOESCHEN()
Dim lZeile As Long
If ListBox1.ListIndex = -1 Then Exit Sub
If MsgBox("Sie möchten den markierten Datensatz wirklich löschen?", _
vbQuestion + vbYesNo, "Sicherheitsabfrage!") = vbYes Then
lZeile = ListBox1.List(ListBox1.ListIndex, 0)
Tabelle5.Rows(CStr(lZeile & ":" & lZeile)).Delete
ListBox1.RemoveItem ListBox1.ListIndex
End If
End Sub
Private Sub EINTRAG_ANLEGEN()
Dim lZeile As Long
lZeile = lCONST_STARTZEILENNUMMER_DER_TABELLE
Do While IST_ZEILE_LEER(lZeile) = False
lZeile = lZeile + 1
Loop
Tabelle5.Cells(lZeile, 1) = CStr("Neuer Eintrag Zeile " & lZeile)
ListBox1.AddItem lZeile
ListBox1.List(ListBox1.ListCount - 1, 1) = CStr("Neuer Eintrag Zeile " & lZeile)
ListBox1.List(ListBox1.ListCount - 1, 2) = ""
ListBox1.List(ListBox1.ListCount - 1, 3) = ""
ListBox1.ListIndex = ListBox1.ListCount - 1
TextBox1.SetFocus
TextBox1.SelStart = 0
TextBox1.SelLength = Len(TextBox1)
End Sub
' HILFSFUNKTIONEN
Private Function IST_ZEILE_LEER(ByVal lZeile As Long) As Boolean
Dim i As Long
Dim sTemp As String
sTemp = ""
For i = 1 To iCONST_ANZAHL_EINGABEFELDER
sTemp = sTemp & Trim(CStr(Tabelle5.Cells(lZeile, i).Text))
Next i
If Trim(sTemp) = "" Then
'Die Zeile ist leer
IST_ZEILE_LEER = True
Else
IST_ZEILE_LEER = False
End If
End Function

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: UserForm mit Zahlen und sortiert
25.10.2021 17:27:55
onur
Der Code ohne die Datei ist wertlos.
AW: UserForm mit Zahlen und sortiert
25.10.2021 18:24:26
Beni
Sorry, die Beispieldatei ist nun angefügt.
Hat noch ein zweites kurzes Script, dass per Button die Werte in Zahlen umwandelt, allerdings läufts nicht wenn Buchstaben in der TextBox vorkommen (also wenn die UserForm falsch ausgefüllt wurde.
Mir ist klar, dass alles in TextBox NUR Text als Text ausgegeben wird, ich meinte bloß das es keine Zahlen in dem Sinne sind ;)
AW: UserForm mit Zahlen und sortiert
25.10.2021 17:34:52
Luschi
Hallo Beni,

Alle TextBox (ausser Spalte 1,2) sind Zahlen,
Wie kommst Du darauf? In 1 Textbox kann immer NUR Text stehen, egal wie die Werte drin aussehen.
Um die TB-Inhalte in Excelzelle zu schreiben nutze die Vba-Umwandlungsfunktionen CInt, CDbl usw.
Gruß von Luschi
aus klein-Paris
Anzeige
AW: UserForm mit Zahlen und sortiert
25.10.2021 18:26:56
Alwin
Hallo Beni,
ändere in der Speicherprozedur die Textboxenschleife so:
For i = 1 To iCONST_ANZAHL_EINGABEFELDER
If IsNumeric(Me.Controls("TextBox" & i)) Then
Tabelle1.Cells(lZeile, i) = CDbl(Me.Controls("TextBox" & i))
Else
Tabelle1.Cells(lZeile, i) = Me.Controls("TextBox" & i)
End If
Next i
Sortieren kannst du im Tabellenblatt. Sollen weitere Manipulationen in der Userform eingebaut, werden reicht dieser Code wahrscheinlich nicht mehr. Da braucht es was deutlich aufwendigeres.
Gruß Uwe
AW: UserForm mit Zahlen und sortiert
26.10.2021 10:37:47
Beni
Hallo Uwe
Danke, der Code funktioniert für die Umwandlung tiptop.
Beim Ausfüllen der UserForm gibts ja vermutlich keine Möglichkeit einer Eingabeprüfung (analog zur Datenüberprüfung mit Gültigkeitskriterien im Excel) ? Muss man halt aufpassen, keinen Text oder Punkt anstelle von Komma zu tippen :)
Sortieren versuche ich im Excel, siehe dazu meinen neusten Post. Danke nochmals.
Anzeige
AW: UserForm mit Zahlen und sortiert
26.10.2021 11:07:09
Pierre
Hallo Beni,
geht schon... als Beispiel:

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
' Das Makro verhindert die Eingabe von Buchstaben
' in einer TextBox, indem die Tastatur
' dauernd abgefragt wird. Nur Komma und Punkt sind erlaubt.
Select Case KeyAscii
' 0 - 9
Case 48 To 57
' Komma
Case 44
' Punkt                'wenn Punkt gar nicht erlaubt, dann Case 46 löschen
Case 46
Case Else
Beep
KeyAscii = 0
WordBasic.MsgBox String(5, 32) & "Hier dürfen nur Zahlen eingegeben werden. " _
& "Bei Zahlen mit Nachkomma-Stellen ist das Komma und der Punkt erlaubt!", -8
End Select
End Sub
Gefunden hier:

http://www.office-loesung.de/ftopic343665_0_0_asc.php

Gruß Pierre
Anzeige
AW: UserForm mit Zahlen und sortiert
26.10.2021 12:23:33
Alwin
Hallo Beni,
ich würde an deiner Stelle die Schleifen einfach nach Bedarf so auflösen:
Es zwingt dazu, dass immer eine Zahl drinsteht und wenn es nur eine Null ist. Die erste und die letzte Zeile der Prozedur nicht mit kopieren, dient nur der besseren Lesbarkeit.

Sub test
For i = 1 To 2
Tabelle5.Cells(lZeile, i) = Me.Controls("TextBox" & i)
Next i
For i = 3 To iCONST_ANZAHL_EINGABEFELDER
If IsNumeric(Me.Controls("TextBox" & i)) Then
Tabelle5.Cells(lZeile, i) = CDbl(Me.Controls("TextBox" & i))
Else
MsgBox "Kein numerischer Wert in Textbox " & i & " eingegeben", vbCritical, "Problem Eingabe in Textbox " & i
Me.Controls("TextBox" & i).SetFocus
Me.Controls("TextBox" & i) = "0"
Exit Sub
End If
Next i
End Sub
Gruß Uwe
Anzeige
AW: UserForm mit Zahlen und sortiert
26.10.2021 23:47:27
Beni
Hallo Uwe
Danke dir, der Code funktioniert beinahe wie gewünscht. Ich musste noch ein wenig daran basteln, damit das Ergebnis wie gewünscht rauskam:

For i = 1 To iCONST_ANZAHL_EINGABEFELDER
If IsNumeric(Me.Controls("TextBox" & i)) Then
Tabelle5.Cells(lZeile, i) = CDbl(Me.Controls("TextBox" & i))
Else
If IsEmpty(Me.Controls("TextBox" & i)) = True Then
Tabelle5.Cells(lZeile, i) = CDbl(Me.Controls("TextBox" & i))
End If
End If
Next i

Ist definitiv nicht ganz korrekt ausformuliert, aber somit kann ich nun auch Zellen ganz leer lassen ohne Msgbox (gewünscht), und wenn Text eingefügt wird, wird dieser sogleich wieder gelöscht (ist ok so).
Schade nur, dass die Punkte bei Zahlenwerten weiterhin nicht erkannt werden (nur Kommas)..

Anzeige
AW: UserForm mit Zahlen und sortiert
27.10.2021 20:17:29
Yal
Hallo Beni,
Du hast den Beitrag von Pierre entweder übersehen oder nicht richtig eingeschätzt: nur bestimme Eingabe zulassen.
Ich bin nur der Meinung, dass anstatt "beep" und Fehlermeldung, einfach die Konversion permanent testen und bei Bedarf der letzen, nicht richtigen Zeichen rauschmeissen:

Private Sub TextBox1_Change()
Dim a
On Error GoTo Catch
With TextBox1
a = CDbl("0" & .Value)
If Right(.Value, 1) = "." Then .Value = Left(.Value, Len(.Value) - 1) 'wenn Punkt, letzte Zeichen rausschmeissen
Exit Sub
Catch:
Application.EnableEvents = False
.Value = Left(.Value, Len(.Value) - 1) 'bei Fehler auch
Application.EnableEvents = True
End With
End Sub
Punkte werden bei der Konversion nicht richtig behandelt, daher grundsätzlich rausgeschmiessen.
Bei mehreren TextBoxen empfiehlt es sich die Behandlung auszulagern:

Private Sub TextBox1_Change()
Zahlen_prüfen "TextBox1"
End Sub
Private Sub TextBox2_Change()
Zahlen_prüfen "TextBox2"
End Sub
Private Sub Zahlen_prüfen(TextBox As String)
Dim a
On Error GoTo Catch
With Me.Controls(TextBox)
a = CDbl("0" & .Value)
If Right(.Value, 1) = "." Then .Value = Left(.Value, Len(.Value) - 1) 'wenn Punkt, letzte Zeichen rausschmeissen
Exit Sub
Catch:
Application.EnableEvents = False
.Value = Left(.Value, Len(.Value) - 1) 'bei Fehler auch
Application.EnableEvents = True
End With
End Sub
VG
Yal
Anzeige
AW: UserForm mit Zahlen und sortiert
27.10.2021 21:19:06
Beni
Hallo Yal
Du hast recht, dass hab ich übersehen. Dein Script funktioniert soweit, habe es auf die gewünschten TextBoxen angewendet. Kann ich dort nicht auch sagen, dass . (punkt) = , (Komma) wird?
Und irgendwie eine Zeile dazu, dass diese TextBox nicht leer sein darf (nur für einige der TextBoxen)?
Danke dir!!
AW: UserForm mit Zahlen und sortiert
27.10.2021 23:49:02
Yal
Hallo Beni,
Komma statt punkt, Replace benutzen. Prüfen muss man dann nicht mehr: keine Punkt, passiert nichts.
Ich habe gerade festgestellt, dass das Coding ein Problem mit negativen Zahlen hatte. Diese Version liefert eventuell ein Ergebnis, das mit eine Komma anfängt. Wird trotzdem von Excel als Zahl erkannt.

Private Sub TextBox1_Change()
Dim a
On Error GoTo Catch
With TextBox1
If Right(.Value, 1) = "-" Then .Value = "-" & Left(.Value, Len(.Value) - 1)
a = CDbl(.Value & "0")
.Value = Replace(Trim(.Value), ".", ",") 'wenn Punkt, in Komma wandeln
Exit Sub
Catch:
Application.EnableEvents = False
If .Value  "" Then .Value = Left(.Value, Len(.Value) - 1) 'bei Fehler auch
Application.EnableEvents = True
End With
End Sub
Der Code prüft nur während die Eingabe in TextBox_xx. Für das Abfangen des Verlassens des TextBox, benutze das Ereignis LostFocus:

Private Sub TextBox1_LostFocus()
If TextBox1.Value = "" Then MsgBox "TextBox1 wurde leer verlassen!" & vbCritical
End Sub
VG
Yal
Anzeige
AW: UserForm mit Zahlen und sortiert
29.10.2021 11:32:43
Beni
Hallo Yal
Danke, dies funktioniert nun.
Einziger Nachteil ist, dass ein bereits korrekt ausgefülltes TextFeld nicht mehr einfach gelöscht (geleert) werden kann. Die Zahl muss durch 0 ersetzt werden, sollte ich dieses Textfeld neu leer haben wollen.
AW: UserForm mit Zahlen und sortiert
29.10.2021 12:08:02
Yal
Korrigieren beim Verlassen. Es ist sogar besser als eine Meldung.

Private Sub TextBox1_LostFocus()
If TextBox1.Value = "" Then TextBox1.Value = 0
End Sub
VG
Yal

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige