Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Anzeige
Inhaltsverzeichnis

Userform funktioniert nicht wie programmiert

Forumthread: Userform funktioniert nicht wie programmiert

Userform funktioniert nicht wie programmiert
13.02.2025 14:06:44
grigri
Hallo,

ich habe mir eine Excel Tabelle gebastelt wo ich meine Ausgabenrechnungen mit Preis, Datum, Garantiezeitraum und Ablageort einpflegen möchte.
Die Tabelle habe ich mit VBA versehen und ich möchte die Werte über eine Userform eingeben die auch schon einige Daten aus dem Sheet abrufen soll.

Beim Aufrufen der Userform mit dem Button "neue Rechnung" soll die Userform1 aufgerufen werden.
Gleichzeitig sollen in der TextBox1 eine laufende Nummer und in der TextBox5 das aktuelle Jahr, sowie in der ComboBox 1 und 2 Werte aus der Exceltabelle eingelesen werden damit ich hier eine Datenbank erstellen kann.

An sich war ich schon fertig und alles hat wie gewollt funktioniert, Danach habe ich nur mehr einige Anpassungen durchgeführt und seitdem funktioniert nichts mehr.
Ich habe schon versucht alles wieder zurückzusetzen soweit ich mich erinnern konnte, auch mit Chat GPT habe ich es versucht. Leider ohne Erfolg.

Vielleicht sieht ja einer von euch was dass ich übersehe weil ich den Wald vor lauter Bäumen nicht erkenne kann

Danke schon mal im Voraus

Nachstehend mein Code:


Option Explicit

Public BoEnter As Boolean

Private Sub Combobox2_Change()



Private Sub UserForm1_Initialize()
Dim ws As Worksheet
Dim rngC As Range, rngD As Range
Dim cell As Range
Dim dictC As Object, dictD As Object
Dim arrC As Variant, arrD As Variant
Dim i As Integer, j As Integer
Dim temp As String
Dim lastNum As Double
Dim currentYear As String

' Arbeitsblatt setzen
Set ws = ThisWorkbook.Sheets("Rechnungen")

' --- ComboBox1 mit Spalte C füllen ---
Set rngC = ws.Range("C2:C" & ws.Cells(ws.Rows.Count, "C").End(xlUp).Row)
Set dictC = CreateObject("Scripting.Dictionary")

For Each cell In rngC
If Not dictC.exists(cell.Value) And cell.Value > "" Then
dictC.Add cell.Value, Nothing
End If
Next cell

arrC = dictC.Keys
Call SortArray(arrC) ' Alphabetisch sortieren
Me.Combobox1.Clear
Me.Combobox1.List = arrC

' --- ComboBox2 mit Spalte D füllen ---
Set rngD = ws.Range("D2:D" & ws.Cells(ws.Rows.Count, "D").End(xlUp).Row)
Set dictD = CreateObject("Scripting.Dictionary")

For Each cell In rngD
If Not dictD.exists(cell.Value) And cell.Value > "" Then
dictD.Add cell.Value, Nothing
End If
Next cell

arrD = dictD.Keys
Call SortArray(arrD) ' Alphabetisch sortieren
Me.Combobox2.Clear
Me.Combobox2.List = arrD

' --- TextBox1: Nächste Nummer in Spalte B finden ---
On Error Resume Next
lastNum = Application.WorksheetFunction.Max(ws.Range("B2:B" & ws.Cells(ws.Rows.Count, "B").End(xlUp).Row))
On Error GoTo 0

If lastNum = 0 Then
lastNum = 1
Else
lastNum = lastNum + 1
End If

Me.Textbox1.Value = lastNum

' --- TextBox5: Aktuelles Jahr setzen ---
currentYear = Year(Date)
Me.TextBox5.Value = currentYear

End Sub

' --- Hilfsfunktion zum Sortieren eines Arrays ---
Private Sub SortArray(arr As Variant)
Dim i As Integer, j As Integer
Dim temp As String

For i = LBound(arr) To UBound(arr) - 1
For j = i + 1 To UBound(arr)
If arr(i) > arr(j) Then
temp = arr(i)
arr(i) = arr(j)
arr(j) = temp
End If
Next j
Next i
End Sub

Private Sub TextBox4_Change()

If BoEnter = False Then
Dim strValue As String
strValue = Trim(Me.Textbox4.Text)

' Wenn genau 2 Zeichen eingegeben wurden und kein Punkt vorhanden ist,
' wird der Wert aus "Geplant" mit einem nachfolgenden Punkt in TextBox4 eingetragen.
If Len(strValue) = 2 Then
If InStr(strValue, ".") = 0 Then
Me.Textbox4.Text = Textbox4 & "."
End If
' Wenn genau 5 Zeichen vorliegen, wird geprüft, ob bereits zwei Punkte vorhanden sind.
ElseIf Len(strValue) = 5 Then
Dim dotCount As Long
dotCount = Len(strValue) - Len(Replace(strValue, ".", ""))

If dotCount 2 Then
Me.Textbox4.Text = strValue & "." & Format(Now(), "yyyy")
End If
End If
End If
End Sub


Private Sub speichern_Click()
Dim z As Long
Dim ws As Worksheet

Set ws = ThisWorkbook.Sheets("Rechnungen")

z = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row + 1

ws.Cells(z, 2).Value = Textbox1.Value
ws.Cells(z, 3).Value = Combobox1.Value
ws.Cells(z, 4).Value = Combobox2.Value
ws.Cells(z, 5).Value = Textbox2.Value
ws.Cells(z, 8).Value = TextBox8.Value
If IsDate(TextBox7.Value) Then
ws.Cells(z, 9).Value = CDate(TextBox7.Value)
ws.Cells(z, 9).NumberFormat = "dd.mm.yyyy"
Else
ws.Cells(z, 9).Value = ""
End If

ws.Cells(z, 6).Value = Textbox3.Value

If IsDate(Textbox4.Value) Then
ws.Cells(z, 7).Value = CDate(Textbox4.Value)
ws.Cells(z, 7).NumberFormat = "dd.mm.yyyy"
Else
ws.Cells(z, 7).Value = ""
End If

ws.Cells(z, 10).Value = Combobox4.Value
ws.Cells(z, 11).Value = TextBox5.Value

Unload Me
End Sub


Private Sub Textbox3_Keypress(ByVal KeyAscii As MSForms.ReturnInteger)

If KeyAscii >= Asc("a") And KeyAscii = Asc("z") Then KeyAscii = KeyAscii + Asc("A") - Asc("a")

End Sub



Private Sub TextBox8_Change()
Dim dtStart As Date
Dim Jahre As Long
Dim dtErgebnis As Date

If Not IsDate(Textbox4.Value) Then
TextBox7.Value = ""
Exit Sub
End If
dtStart = CDate(Textbox4.Value)

If IsNumeric(TextBox8.Value) And Trim(TextBox8.Value) > "" Then
Jahre = CLng(TextBox8.Value)
Else
TextBox7.Value = ""
Exit Sub
End If

dtErgebnis = DateAdd("yyyy", Jahre, dtStart)

TextBox7.Value = Format(dtErgebnis, "dd.mm.yyyy")
End Sub

Anzeige

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Userform funktioniert nicht wie programmiert
13.02.2025 14:10:54
Uduuh
Hallo,
da fehlt ein End Sub
Private Sub Combobox2_Change()


Gruß aus'm Pott
Udo
AW: Userform funktioniert nicht wie programmiert
13.02.2025 18:23:04
Onur
"Userform funktioniert nicht wie programmiert" ?
Wohl kaum, sie funktioniert exakt so, wie von dir programmiert. Du hast aber nicht so programmiert, wie sie funktionieren soll.....
Anzeige
unterlasse doch bitte ...
13.02.2025 21:58:15
Uduuh
Hallo,
... diese
a) sehr späten
b) nicht zielführenden
Kommentare.

Gruß aus'm Pott
Udo
AW: Userform funktioniert nicht wie programmiert
13.02.2025 15:17:30
grigri
Servus,

stimmt, das hatte ich vergessen zu löschen. In meiner original Datei ist das aber ohnehin aus kommentiert.
Der Fehler besteht trotzdem.
AW: Userform funktioniert nicht wie programmiert
13.02.2025 15:19:59
Uduuh
Hallo,
sollen wir die Mappe nachbauen?
Und was heißt 'funktioniert nicht'?

Gruß aus'm Pott
Udo
Anzeige
AW: Userform funktioniert nicht wie programmiert
13.02.2025 15:29:58
grigri
Hallo,

natürlich nicht, die Beispieldatei habe ich bereits hochgeladen. Hoffe das war so korrekt.

Wie schon beschrieben, die Userform wird aufgerufen... aber wie ich beim ersten Tread schon geschrieben habe werden die eigentlich wichtigen Sachen dabei nicht ausgeführt

" Beim Aufrufen der Userform mit dem Button "neue Rechnung" soll die Userform1 aufgerufen werden.
Gleichzeitig sollen in der TextBox1 eine laufende Nummer und in der TextBox5 das aktuelle Jahr, sowie in der ComboBox 1 und 2 Werte aus der Exceltabelle eingelesen werden damit ich hier eine Datenbank erstellen kann. "
Anzeige
AW: Userform funktioniert nicht wie programmiert
13.02.2025 16:21:57
Uduuh
Hallo,
lösche aus allen Comboboxen die RowSource.
Wenn du RowSource angegeben hast, verursacht .Clear und .List=... einen Fehler.

Gruß aus'm Pott
Udo
AW: Userform funktioniert nicht wie programmiert
13.02.2025 16:56:23
Ulf
Hi,
habe mal eine Tabelle eingebaut, so wird die Nr ohne HickHack eindeutig und der Code gut lesbar
https://www.herber.de/bbs/user/175658.xlsm
hth
Ulf
Anzeige
AW: Userform funktioniert nicht wie programmiert
14.02.2025 09:45:27
grigri
Hallo Udo,

danke für deine Hilfe. Habe mir den Code angesehen und du löst es elegant und sehr kurz. Da habe ich wohl etwas komplizierter gedacht.
Leider sind meine VBA Kenntnisse begrenzt.

Was ich dabei aber nicht verstehe, so wie ich das programmiert habe hat es anfangs ja auch funktioniert wie ich wollte. Erst als ich dann meine finalen Änderungen eingefügt habe, habe ich meinen Code "zerschossen"

Ähnliches passiert mir mit deinem Code. Solange ich die Beispielmappe verwende funktioniert es perfekt.
Erst wenn ich meine bereits gesammelten Daten per copy/paste in das Excelsheet einfüge und speichere bekomme ich einen Fehler beim aufrufen der Userform.
Im Debugger wird mir diese Zeile markiert.

Den Code von dir habe ich nicht geändert. Ich habe lediglich 1.478 Zeilen eingefügt.
Warum beeinflusst das die Prozedur?
 Sub neue_Rechnung_Klicken()


UserForm1.Show False

End Sub

Anzeige
AW: Userform funktioniert nicht wie programmiert
14.02.2025 10:13:47
grigri
Sorry,
da war ich jetzt vorschnell. Habe meinen Fehler gefunden :-)
Danke dir für deine Hilfe
AW: Userform funktioniert nicht wie programmiert
14.02.2025 11:14:05
Alwin Weisangler
Hallo,

ich habe dir mal das initialize der Userform1 mal umgebaut und das Laden der Combos auf .List umgestellt. Da braucht es nur ein paar Zeilen.
Man kann auch das Schreiben in eine Neue Zeile kompakter bauen(siehe Umbau).
https://www.herber.de/bbs/user/175670.xlsm

Gruß Uwe

Anzeige
AW: Userform funktioniert nicht wie programmiert
14.02.2025 17:58:19
Ulf
Hi,
noch eine Ergänzung zu deiner urspr Datei: keine Duplikate in den Comboboxen.
Vlt hast du ja ergänzt, dann übersehen
https://www.herber.de/bbs/user/175679.xlsm
hth
Ulf
AW: Userform funktioniert nicht wie programmiert
14.02.2025 18:43:35
Alwin Weisangler
@Ulf,
ist es nicht besser die Comboboxen mit .List zu laden?
Dann reicht nebst Ausgabe von Unikaten das Intitialize so:


Private Sub UserForm_Initialize()
Dim zelle As Range, tmp&, iMax&
With Tabelle1
Combobox1.List = ListeUnikate(.Range("Tbl_Rechnungen[Artikel]"))
Combobox2.List = ListeUnikate(.Range("Tbl_Rechnungen[Verkäufer]"))
Textbox1 = Application.Max(.Range("Tbl_Rechnungen[NR]")) + 1
For Each zelle In .Range("Tbl_Rechnungen[Rechnungsnummer]")
tmp = Replace(zelle, "RE", "")
If iMax tmp Then iMax = tmp
Next
Textbox3 = "RE" & iMax + 1
Textbox4.Value = Date
TextBox5.Value = Year(Date)
End With
Combobox4.List = Tabelle2.Range("Tbl_Setting[Ordner Originalrechnung]").Value
End Sub

Private Function ListeUnikate(rng As Range)
Dim zelle As Range, objDic As Object
Set objDic = CreateObject("Scripting.Dictionary")
For Each zelle In rng
objDic(zelle.Value) = 0
Next
ListeUnikate = objDic.keys
End Function


Gruß Uwe
Anzeige
AW: Userform funktioniert nicht wie programmiert
16.02.2025 12:16:45
grigri
Hallo,

habe gestern und heute die beiden Varianten getestet. An sich funktionieren die sehr gut.
DANKE schon mal dafür.

Allerdings kommt es, egal bei welcher Variante ich es mache, zu einem Fehler sobald ich die Daten aus meiner Ursprungs-DB per copy/paste oder sogar past spezial einfüge.
Ich dachte schon dass es zu viele Zeilen sind, deswegen habe ich zum Testen nur eine einzige Zeile eingefügt ohne die Userform zu nutzen.
Das Ergebnis war jedes Mal das selbe.
Danach kann die Userform entweder nicht mehr aufgerufen werden, oder die beiden Textboxen bzw. die Comboboxen werden nicht befüllt.

Ich bin jedenfalls mit meinem Latein komplett am Ende und denke schon ans aufgeben.
Vielleicht kann ja einer von euch mit der Fehlerbeschreibung was anfangen.

schönes Wochenende
lg
Cris
Anzeige
AW: Userform funktioniert nicht wie programmiert
17.02.2025 13:24:18
Alwin Weisangler
Hallo Cris,

zuviele Zeilen sind nicht die Ursache.
Wo passiert der Fehler und unter welcher Bedingung.
Zeige einfach mal eine genaue Fehlerbeschreibung.
Da die Userform1 ausscheidet, weil diese nur einen neuen Datensatz schreibt wird der Fehler wohl in der Rechnungssuche passieren.
Ich habe das mal umgebaut.

https://www.herber.de/bbs/user/175723.xlsm

Beachte das ich den formatierten Tabellen Namen verpasst habe.
Tabelle auf Blatt "Rechnungen": Tbl_Rechnungen
Tabelle auf Blatt "settings": Tbl_Setting
Damit arbeitet der von mir geschriebene Code in beiden Userforms.

Wenn du Datensätze aus anderer Quelle in ein Listobjekt schreibst, achte auf die korrekte Anzahl Spalten. Sollte was nicht zusammenpassen muss dies entsprechend vor dem Einfügen aufbereitet werden.

Dazu kann man den Quellbereich in ein Array laden und mittels beispielhaft:


arrliste = Application.Index(arrliste, Evaluate("row(1:" & UBound(arrliste, 1) & ")"), Array(1, 10, 5, 3, 8))

die Spalten nach Bedarf entfernen/zuordnen usw. Danach kann man via Tabelle1.ListObjects(1).ListRows.Add.Range.Resize(Anzahl Zeilen, Anzahl Spalten)=arrlist diese Werte in die Zieltabelle einfügen.

Gruß Uwe

Anzeige
und es muss ...
13.02.2025 22:00:30
Uduuh
... natürlich
Private Sub Userform_Initialize()
und nicht
Private Sub Userform1_Initialize()
heißen.

Forumthreads zu verwandten Themen