VBA UserForm in zelle übertragen, weitere Zeile, wenn combobox etwas ausgewählt ist
#1
Hallo,

Ich habe in meiner UserFrom 5 ComboBoxen.
Wenn in Combobox 1 etwas ausgewählt wurde, soll er die erste leere Zeile beschriften
wenn in ComboBox 2 etwas ausgewählt wurde, soll er die erste und zweite leere Zeile, jeweils mit den werten der entsprechenden Comboboxen, beschriften
wenn in ComboBox 3 etwas ausgewählt wurde, soll er die erste, zweite und dritte leere Zeile, jeweils mit den werten der entsprechenden Comboboxen, beschriften
...

Bsp.: Combobox1 = Nr 1 ausgewählt
         Combobox2 = Nr 2 ausgewählt
         Combobox3 = nichts ausgewählt
Ergebnis:
1 freie Zeile = Combobox 1
2 freie Zeile = Combobox 2
3 freie Zeile = bleibt frei


Mein Code funktioniert nur, wenn ich in allen 5 Comboboxen etwas auswähle, dann beschiftet er mir auch 5 Zeilen.
Aber sobald ich nur eine Combobox auswähle, funktioniert es nicht.




Code:
If ComboBox1 Then

X = Sheets("Lieferscheine").Range("A65536").End(xlUp).Row

Sheets("Lieferscheine").Cells(X + 1, 1) = Format(TextBox1.Text, "dd.mm.yyyy")
Sheets("Lieferscheine").Cells(X + 1, 2) = TextBox2.Text
Sheets("Lieferscheine").Cells(X + 1, 3) = ListBox1.Text
Sheets("Lieferscheine").Cells(X + 1, 4) = ComboBox1.Text
Sheets("Lieferscheine").Cells(X + 1, 5) = TextBox3.Text
Sheets("Lieferscheine").Cells(X + 1, 6) = TextBox4.Text
End If

If ComboBox2 Then

Sheets("Lieferscheine").Cells(X + 2, 1) = Format(TextBox1.Text, "dd.mm.yyyy")
Sheets("Lieferscheine").Cells(X + 2, 2) = TextBox2.Text
Sheets("Lieferscheine").Cells(X + 2, 3) = ListBox1.Text
Sheets("Lieferscheine").Cells(X + 2, 4) = ComboBox2.Text
Sheets("Lieferscheine").Cells(X + 2, 5) = TextBox5.Text
Sheets("Lieferscheine").Cells(X + 2, 6) = TextBox6.Text
End If

If ComboBox3 Then

Sheets("Lieferscheine").Cells(X + 3, 1) = Format(TextBox1.Text, "dd.mm.yyyy")
Sheets("Lieferscheine").Cells(X + 3, 2) = TextBox2.Text
Sheets("Lieferscheine").Cells(X + 3, 3) = ListBox1.Text
Sheets("Lieferscheine").Cells(X + 3, 4) = ComboBox3.Text
Sheets("Lieferscheine").Cells(X + 3, 5) = TextBox7.Text
Sheets("Lieferscheine").Cells(X + 3, 6) = TextBox8.Text
End If

If ComboBox4 Then

Sheets("Lieferscheine").Cells(X + 4, 1) = Format(TextBox1.Text, "dd.mm.yyyy")
Sheets("Lieferscheine").Cells(X + 4, 2) = TextBox2.Text
Sheets("Lieferscheine").Cells(X + 4, 3) = ListBox1.Text
Sheets("Lieferscheine").Cells(X + 4, 4) = ComboBox4.Text
Sheets("Lieferscheine").Cells(X + 4, 5) = TextBox9.Text
Sheets("Lieferscheine").Cells(X + 4, 6) = TextBox10.Text
End If

If ComboBox5 Then

Sheets("Lieferscheine").Cells(X + 5, 1) = Format(TextBox1.Text, "dd.mm.yyyy")
Sheets("Lieferscheine").Cells(X + 5, 2) = TextBox2.Text
Sheets("Lieferscheine").Cells(X + 5, 3) = ListBox1.Text
Sheets("Lieferscheine").Cells(X + 5, 4) = ComboBox5.Text
Sheets("Lieferscheine").Cells(X + 5, 5) = TextBox11.Text
Sheets("Lieferscheine").Cells(X + 5, 6) = TextBox12.Text
End If


Das einzige was mir einfallen würde, wäre eine "verschachtelet" if funktion,
Wenn Combobox 5 = "ausgewählt" dann beschrifte Zeile 1-5 sonst wenn (ElseIf) Combobox 4 = "Ausgewählt" dann beschrifte Zeile 1-4........ etc

Aber da gibt es doch bestimmt eine bessere Lösung
Top
#2
Hallöchen,

Wenn Dein Code bei Combo5 was schreibt, schreibt er doch bestimmt auch was wenn nur jeweils eine andere was hat. Du prüfst jede einzeln und entsprechend wird auch jede einzeln bewertet und eingetragen. Hast Du nur die 3 ausgewählt, wird eben was in die 3 geschrieben und nichts in die anderen.

Korrekt?

Wenn Du das anders haben willst, dann verschachtel die Ifs ab der 1 und nicht ab der 5.

Code:
If 1 then
   ...
   If 2 Then
      ...
      If 3 Then
        ...
        If 4 Then
           ...
           If 5 Then
              ...
           End if
        End if
     End if
   End if
End if
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#3
Wie angehängt, sieht es bei meinem Code dann aus, wenn ich nur einen Artikel auswähle.
Also sobald ich weniger als 5 Comboboxen ausfülle, kommt das.
Komischerweise funktioniert es aber, wenn ich in allen 5 Comboboxen etwas ausgewählt habe.

Sorry ich bin Blutige VBA Anfängerin.
Ich hätte es einfach wie eine verschachtelte wenn funktion aufgebaut.
Bei Excel Formeln hört Excel ja auf, sobald die Bedingung zutrift.
Also wenn ich bei Combobox1 Anfange, würde Excel (bei Funktionen) ja direkt da aufhören, weil Combobox1 immer was ausgewählt werden muss.


Wenn ich dich richtig verstehe, kann ich den code so wie er jetzt ist nehmen, einfach nur alle End If ans Ende packen und nicht nach jeder Abfrage?


Angehängte Dateien Thumbnail(s)
   
Top
#4
Hallöchen,

Im Code von Dir wird erst mal nicht aufgehört, weil es ja bisher 5 einzelne Prüfungen sind. Das ist, wie wenn Du in einer Funktion 5 WENN nacheinander und nicht verschachtelt schreibst, z.B.
WENN(...;TRUE1;FALSE1) & WENN(...;TRUE2;FALSE2) & ....

Mein Vorschlag wäre bisschen verschachtelt und bisschen nacheinander Smile Combo2 soll ja nur genommen werden, wenn auch in Combo1 was ist.
In der Formelschreibweise wäre das so etwas, mal nur für 3:
WENN(...;TRUE1 & WENN(...;TRUE2 & WENN(...;TRUE3;FALSE3);FALSE2);FALSE1)

Für eine Fehleranalyse müsste man zumindest noch die Codezeile wissen, also die "Gelbe" Smile wo es hängt, eventuell auch mehr.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#5
Code:
Private Sub CommandButton1_Click()
Dim X As Long

If Trim(CStr(TextBox1.Text)) = "" Then
    MsgBox "Lieferschein Nummer fehlt", vbCritical + vbOKOnly, "FEHLER!"
    Exit Sub
    End If
If Trim(CStr(TextBox2.Text)) = "" Then
   MsgBox "Datum fehlt", vbCritical + vbOKOnly, "FEHLER!"
   Exit Sub
   End If
If Trim(CStr(TextBox3.Text)) = "" Then
   MsgBox "Artikel fehlt", vbCritical + vbOKOnly, "FEHLER!"
   Exit Sub
   End If
If Trim(CStr(TextBox4.Text)) = "" Then
   MsgBox "Menge fehlt", vbCritical + vbOKOnly, "FEHLER!"
   Exit Sub
   End If
If Trim(CStr(ListBox1.Text)) = "" Then
    MsgBox "Kühlhaus auswählen", vbCritical + vbOKOnly, "FEHLER!"
    Exit Sub
    End If

If ComboBox1 Then

X = Sheets("Lieferscheine").Range("A1048576").End(xlUp).Row

Sheets("Lieferscheine").Cells(X + 1, 1) = Format(TextBox1.Text, "dd.mm.yyyy")
Sheets("Lieferscheine").Cells(X + 1, 2) = TextBox2.Text
Sheets("Lieferscheine").Cells(X + 1, 3) = ListBox1.Text
Sheets("Lieferscheine").Cells(X + 1, 4) = ComboBox1.Text
Sheets("Lieferscheine").Cells(X + 1, 5) = TextBox3.Text
Sheets("Lieferscheine").Cells(X + 1, 6) = TextBox4.Text

If ComboBox2 Then

Sheets("Lieferscheine").Cells(X + 2, 1) = Format(TextBox1.Text, "dd.mm.yyyy")
Sheets("Lieferscheine").Cells(X + 2, 2) = TextBox2.Text
Sheets("Lieferscheine").Cells(X + 2, 3) = ListBox1.Text
Sheets("Lieferscheine").Cells(X + 2, 4) = ComboBox2.Text
Sheets("Lieferscheine").Cells(X + 2, 5) = TextBox5.Text
Sheets("Lieferscheine").Cells(X + 2, 6) = TextBox6.Text

If ComboBox3 Then

Sheets("Lieferscheine").Cells(X + 3, 1) = Format(TextBox1.Text, "dd.mm.yyyy")
Sheets("Lieferscheine").Cells(X + 3, 2) = TextBox2.Text
Sheets("Lieferscheine").Cells(X + 3, 3) = ListBox1.Text
Sheets("Lieferscheine").Cells(X + 3, 4) = ComboBox3.Text
Sheets("Lieferscheine").Cells(X + 3, 5) = TextBox7.Text
Sheets("Lieferscheine").Cells(X + 3, 6) = TextBox8.Text

If ComboBox4 Then

Sheets("Lieferscheine").Cells(X + 4, 1) = Format(TextBox1.Text, "dd.mm.yyyy")
Sheets("Lieferscheine").Cells(X + 4, 2) = TextBox2.Text
Sheets("Lieferscheine").Cells(X + 4, 3) = ListBox1.Text
Sheets("Lieferscheine").Cells(X + 4, 4) = ComboBox4.Text
Sheets("Lieferscheine").Cells(X + 4, 5) = TextBox9.Text
Sheets("Lieferscheine").Cells(X + 4, 6) = TextBox10.Text

If ComboBox5 Then

Sheets("Lieferscheine").Cells(X + 5, 1) = Format(TextBox1.Text, "dd.mm.yyyy")
Sheets("Lieferscheine").Cells(X + 5, 2) = TextBox2.Text
Sheets("Lieferscheine").Cells(X + 5, 3) = ListBox1.Text
Sheets("Lieferscheine").Cells(X + 5, 4) = ComboBox5.Text
Sheets("Lieferscheine").Cells(X + 5, 5) = TextBox11.Text
Sheets("Lieferscheine").Cells(X + 5, 6) = TextBox12.Text
End If
End If
End If
End If
End If

ActiveWorkbook.Save
Unload Me
End Sub

Das ist jetzt der komplette Code für den Button.
Mit einfach End If ans ende stellen, kommt das gleiche bei rum.
Angehängt die gelbe Zeile, beim debuggen.

Es ist doch für den Code selbst egal, ob ich etwas am anfang schreibe, oder etwas versetzt nach hinten, oder?
Es geht dabei doch nur um für den Benutzer optischen Trennung?

Code:
If 1 then
  ...
If 2 Then
     ...
If 3 Then
 ...  
If 4 Then
...
If 5 Then
....
End if
End if
End if
End if
End if


Code:
If 1 then
  ...
  If 2 Then
     ...
     If 3 Then
       ...
       If 4 Then
          ...
          If 5 Then
             ...
          End if
       End if
    End if
  End if
End if


Angehängte Dateien Thumbnail(s)
   
Top
#6
Hallöchen,

das Einrücken ist auf jeden Fall für die Lesbarkeit von Vorteil.

Der Fehler könnte kommen, weil bei If ... ein boolscher Wert erwartet wird, aber nicht vorhanden ist. Du kannst ja mal die Combobox2 in die Überwachung nehmen und schauen, was da angegeben wird.

Ansonsten, Du hattest ja an anderer Stelle Prüfungen mit ....Text = "", anders herum wäre ....Text <> ""
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#7
Zitat:bei If ... ein boolscher Wert erwartet wird

Ich musste zwar erst googeln was das ist, aber das ist die Lösung!

So was simples.
Einfach überall = True dazu.

Und ob ich das End If nach jeder Combobox mache, oder alle ans ende mache, macht anscheinend dabei keinen Unterschied.

Dieser Satz von dir kommt in mein VBA Notitz Dokument :)

Code:
If ComboBox1 = True Then

X = Sheets("Lieferscheine").Range("A1048576").End(xlUp).Row

Sheets("Lieferscheine").Cells(X + 1, 1) = TextBox1.Text
Sheets("Lieferscheine").Cells(X + 1, 2) = Format(TextBox2.Text, "dd.mm.yyyy")
Sheets("Lieferscheine").Cells(X + 1, 3) = ListBox1.Text
Sheets("Lieferscheine").Cells(X + 1, 4) = ComboBox1.Text
Sheets("Lieferscheine").Cells(X + 1, 5) = TextBox3.Text
Sheets("Lieferscheine").Cells(X + 1, 6) = TextBox4.Text
End If
If ComboBox2 = True Then

Sheets("Lieferscheine").Cells(X + 2, 1) = TextBox1.Text
Sheets("Lieferscheine").Cells(X + 2, 2) = Format(TextBox2.Text, "dd.mm.yyyy")
Sheets("Lieferscheine").Cells(X + 2, 3) = ListBox1.Text
Sheets("Lieferscheine").Cells(X + 2, 4) = ComboBox2.Text
Sheets("Lieferscheine").Cells(X + 2, 5) = TextBox5.Text
Sheets("Lieferscheine").Cells(X + 2, 6) = TextBox6.Text
End If

If ComboBox3 = True Then

Sheets("Lieferscheine").Cells(X + 3, 1) = TextBox1.Text
Sheets("Lieferscheine").Cells(X + 3, 2) = Format(TextBox2.Text, "dd.mm.yyyy")
Sheets("Lieferscheine").Cells(X + 3, 3) = ListBox1.Text
Sheets("Lieferscheine").Cells(X + 3, 4) = ComboBox3.Text
Sheets("Lieferscheine").Cells(X + 3, 5) = TextBox7.Text
Sheets("Lieferscheine").Cells(X + 3, 6) = TextBox8.Text
End If

If ComboBox4 = True Then

Sheets("Lieferscheine").Cells(X + 4, 1) = TextBox1.Text
Sheets("Lieferscheine").Cells(X + 4, 2) = Format(TextBox2.Text, "dd.mm.yyyy")
Sheets("Lieferscheine").Cells(X + 4, 3) = ListBox1.Text
Sheets("Lieferscheine").Cells(X + 4, 4) = ComboBox4.Text
Sheets("Lieferscheine").Cells(X + 4, 5) = TextBox9.Text
Sheets("Lieferscheine").Cells(X + 4, 6) = TextBox10.Text
End If

If ComboBox5 = True Then

Sheets("Lieferscheine").Cells(X + 5, 1) = TextBox1.Text
Sheets("Lieferscheine").Cells(X + 5, 2) = Format(TextBox2.Text, "dd.mm.yyyy")
Sheets("Lieferscheine").Cells(X + 5, 3) = ListBox1.Text
Sheets("Lieferscheine").Cells(X + 5, 4) = ComboBox5.Text
Sheets("Lieferscheine").Cells(X + 5, 5) = TextBox11.Text
Sheets("Lieferscheine").Cells(X + 5, 6) = TextBox12.Text
End If


Jetzt muss ich nurnoch raus finden, wie ich überprüfe ob das Tabellenblatt "Lieferscheine" voll ist. Excel hat ja leider ne Begrenzung. Und hier und da noch kleinigkeiten, aber dann bin ich mit meinem ersten VBA Code schon zufrieden. Der nächste Code wird dann noch komplizierter :D
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste