Kann keine dynamische Combobox einbauen
Habe unter winXP SP3 excell2000 und komme nicht weiter.
hier nur zur allgemeinen Verständniss, sollte sicher später
unter Excel ComboBox Thema weiterbehandelt werden ??
Kann mir jemand helfen, da ich seit nun guten 2 Wochen versuche auf ein Sheet eine dynamische Combobox ein zu richten, welche mit Daten aus einem anderen Sheet gefüllt wird.
Genauer gesagt, mein Grundsheet heißt Formular welches das Rechnungsformular ist und ich wollte da zusätzlich die Combobox plazieren, nachdem noch sheets nachgeladen wurden. und in der Combobox sollten dann die Artikelnummern aus dem sheet Lager welche unter C2 :C liegen gefüllt werden. Auf der Celle A1 liegt die Zahl+2 der Zeilenanzahl.
Dieses Workbook ist gekauft und ich habe schon viele Fehler beseitigt und einiges ergänzt, doch mit
dem Einrichten der Combobox bin ich überfordert. Ich sah schon mal eine aber es lief nicht beim debuggen wurden fehler über fehler gemeldet, sogar den Namen der von mir gewählten myCombo wurde nicht in der nächsten Subroutine erkannt und als Variable, die nicht definiert wurde bemängelt.
Habe keine Ahnung über die Zusammenhänge, was wo zusätzlich eingerichtet werden muß. Weiß nur wo ich das Generieren beginnen kann.
So nun fürs Erste viel zu viel geschrieben, möchte mir trotzdem jemand helfen, ich habe zudem das Problem, das ich die gebräuchliche Terminologie nicht kenne, weil ich auf einem ganz anderen Gebiet programmiert hatte, aber das ist nun auch schon Jahre her. Wird aber zu viel das alles hier zu erläutern.
vG
Emil
hier nur zur allgemeinen Verständniss, sollte sicher später
unter Excel ComboBox Thema weiterbehandelt werden ??
Kann mir jemand helfen, da ich seit nun guten 2 Wochen versuche auf ein Sheet eine dynamische Combobox ein zu richten, welche mit Daten aus einem anderen Sheet gefüllt wird.
Genauer gesagt, mein Grundsheet heißt Formular welches das Rechnungsformular ist und ich wollte da zusätzlich die Combobox plazieren, nachdem noch sheets nachgeladen wurden. und in der Combobox sollten dann die Artikelnummern aus dem sheet Lager welche unter C2 :C liegen gefüllt werden. Auf der Celle A1 liegt die Zahl+2 der Zeilenanzahl.
Dieses Workbook ist gekauft und ich habe schon viele Fehler beseitigt und einiges ergänzt, doch mit
dem Einrichten der Combobox bin ich überfordert. Ich sah schon mal eine aber es lief nicht beim debuggen wurden fehler über fehler gemeldet, sogar den Namen der von mir gewählten myCombo wurde nicht in der nächsten Subroutine erkannt und als Variable, die nicht definiert wurde bemängelt.
Habe keine Ahnung über die Zusammenhänge, was wo zusätzlich eingerichtet werden muß. Weiß nur wo ich das Generieren beginnen kann.
So nun fürs Erste viel zu viel geschrieben, möchte mir trotzdem jemand helfen, ich habe zudem das Problem, das ich die gebräuchliche Terminologie nicht kenne, weil ich auf einem ganz anderen Gebiet programmiert hatte, aber das ist nun auch schon Jahre her. Wird aber zu viel das alles hier zu erläutern.
vG
Emil
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 163474
Url: https://administrator.de/forum/kann-keine-dynamische-combobox-einbauen-163474.html
Ausgedruckt am: 25.04.2025 um 04:04 Uhr
50 Kommentare
Neuester Kommentar

Hallo Lime43!
Also, wenn es ein konstannter Bereich wäre, dann wäre der Ablauf in etwa so:
1. ComboBox einfügen
2. ComboBox-Objekt>Rechtsklick>Eigenschaften
3. Eigenschaften.Namen: Einen sinvollen Namen z.B. 'CBox_Artikelnummer' eintragen oder so belassen
4. Eigenschaften.ListFillRange: Den Bereich z.B. 'Lager!C2:C20' (den aktuellen Bereich) eintragen
5. Eigenschaftsfenster wieder schließen
6. ComboBox-Object>Doppelklick schreibt den dazugehörigen Code im VB-Editor in Tabelle 'Formular'
Wenn sich der Bereich ändert, dann zusätzlich zu den Schritten 1 bis 6 noch diesen Code im VB-Editor in Tabelle 'Lager' einfügen (CBox-Name anpassen):
Mit diesem Code wird die ComboBox bei einer Änderung in der Tabelle 'Lager' automatisch neu initialisiert. D.h. die Zelle mit dem Endzeilen-Eintrag entfällt.
Damit müsstest Du eigentlich klarkommen
Gruß Dieter
Also, wenn es ein konstannter Bereich wäre, dann wäre der Ablauf in etwa so:
1. ComboBox einfügen
2. ComboBox-Objekt>Rechtsklick>Eigenschaften
3. Eigenschaften.Namen: Einen sinvollen Namen z.B. 'CBox_Artikelnummer' eintragen oder so belassen
4. Eigenschaften.ListFillRange: Den Bereich z.B. 'Lager!C2:C20' (den aktuellen Bereich) eintragen
5. Eigenschaftsfenster wieder schließen
6. ComboBox-Object>Doppelklick schreibt den dazugehörigen Code im VB-Editor in Tabelle 'Formular'
Wenn sich der Bereich ändert, dann zusätzlich zu den Schritten 1 bis 6 noch diesen Code im VB-Editor in Tabelle 'Lager' einfügen (CBox-Name anpassen):
Private Sub Worksheet_Change(ByVal Target As Range)
Sheets("Formular").ComboBox.ListFillRange = ActiveSheet.Name & "!C2:C" & Cells(Rows.Count, "C").End(xlUp).Row
End Sub
Damit müsstest Du eigentlich klarkommen
Gruß Dieter

Hallo Lime43!
Deine Erklärung ist ziemlich verwirrend
Also, wenn ich das soweit richtig verstehe, dann hast Du eine Arbeitsmappe mit einer Tabelle namens 'Formular' in der sich eine ComboBox befindet, die aber noch nicht initialisiert werden kann, weil das Sheet 'Lager' noch nicht geladen ist.
Wenn also die Arbeitsmappe mit dem Sheet 'Lager' noch nicht geladen ist, wie wird diese Arbeitsmappe geöffnet?
Wie auch immer, es hindert Dich aber nichts daran, die ComboBox im Sheet 'Formular' mit dem zugehörigen ComboBox_Change-Code zu erstellen und die Eigenschaft.ListFillRange vorweg leer zu lassen. Dann sollte die Arbeitsmappe fehlerfrei zu speichern sein.
Der Code 'Worksheet_Change' im Sheet 'Lager' sollte den Zweck erfüllen, bei einer Änderung im Sheet 'Lager' automatisch die Endzeile neu zu ermitteln und die ComboBox neu zu initialisieren. Das funktioniert natürlich so nicht, wenn sich das Sheet in einer anderen Arbeitsmappe befindet.
Und zu den Eigenschaften der ComboBox:
Wenn Du im Sheet beim Erstellen der ComboBox (per ToolBox) oder im Entwurfsmodus, auf dem markierten ComboBox-Object mit der Mouse einen Rechtsklick machst, dann müsste in dem PopUp der Eintrag 'Eigenschaften' zur Auswahl stehen, über den dann alle Eigenschaften der ComboBox festgelegt werden können. Oder gab's das bei Excel 2000 noch nicht?
Gruß Dieter
Deine Erklärung ist ziemlich verwirrend
Also, wenn ich das soweit richtig verstehe, dann hast Du eine Arbeitsmappe mit einer Tabelle namens 'Formular' in der sich eine ComboBox befindet, die aber noch nicht initialisiert werden kann, weil das Sheet 'Lager' noch nicht geladen ist.
Wenn also die Arbeitsmappe mit dem Sheet 'Lager' noch nicht geladen ist, wie wird diese Arbeitsmappe geöffnet?
Wie auch immer, es hindert Dich aber nichts daran, die ComboBox im Sheet 'Formular' mit dem zugehörigen ComboBox_Change-Code zu erstellen und die Eigenschaft.ListFillRange vorweg leer zu lassen. Dann sollte die Arbeitsmappe fehlerfrei zu speichern sein.
Der Code 'Worksheet_Change' im Sheet 'Lager' sollte den Zweck erfüllen, bei einer Änderung im Sheet 'Lager' automatisch die Endzeile neu zu ermitteln und die ComboBox neu zu initialisieren. Das funktioniert natürlich so nicht, wenn sich das Sheet in einer anderen Arbeitsmappe befindet.
Und zu den Eigenschaften der ComboBox:
Wenn Du im Sheet beim Erstellen der ComboBox (per ToolBox) oder im Entwurfsmodus, auf dem markierten ComboBox-Object mit der Mouse einen Rechtsklick machst, dann müsste in dem PopUp der Eintrag 'Eigenschaften' zur Auswahl stehen, über den dann alle Eigenschaften der ComboBox festgelegt werden können. Oder gab's das bei Excel 2000 noch nicht?
Gruß Dieter

Hallo Lime43!
Also, um noch mal auf die Eigenschaften zurückzukommen:
Vorausgesetzt, das Steuerlement (ComboBox) wurde mit der Toolbox ( (Symbolleiste>Toolbox oder Symbolleiste>VisualBasic inkl. Toolbox) erstellt.
Dann können die Eigenschaften nur angezeigt werden, solange Du dich im Entwurfsmodus befindest. D.h. entweder gleich beim erstellen eines Steuerelements, solange das Steuerelement als Object markiert ist (kleine Kreise um das Object und Mousezeiger auf Object in Kreuzform) oder wenn das bereits vorhandene Steuerelement aktiv ist, dann muss auf der VisualBasic-Symbolleiste das Symbol für die Umschaltung Entwurfsmodus/nicht Entwurfsmodus betätigt werden, sodass das Steuerelement aktionsfrei als Object markiert werden kann. Wenn Du also mit der Mouse auf das Object gehst und ein großes schwarzes Kreuz erscheint, dann die rechte Mousetaste drücken und Eigenschaften auswählen, dann geht ein Eigenschaftsfenster auf, dass für das aktuell markierte Object gilt. Wenn Du die Eigenschaft (Name) änderst, dann musst Du das Object erneut doppelklicken, damit der Code in das Tabellenblatt eingefügt wird oder die Namen im Code-Tabellenblatt manuell anpassen. Gegebenenfalls im VB-Editor im Tabellenblatt 'Formular' die Codezeilen (Sub's) löschen, dessen CombBox-Name es nicht mehr gibt. D.h. wenn sich in Deinem Formular nur 2 ComboBoxen befinden, dann sollten sich im Code-Tabellblatt auch nur 2 ComboBoxen-Sub's befinden.
In Bezug auf die Sheets 'Lager' etc.:
Wenn ich Deine Ausführungen richtig verstanden habe, dann werden nach der Betätigung des OK-Buttons bei der Abfrage: Datenbank öffnen, die Sheets in die Arbeitsmappe mit dem Sheet 'Formular' geladen. Wenn ja, dann musst Du diese Codezeilen in der OK-Routine im Anschluss an die Codezeilen einbinden, in denen der Sheet-Import abgeschlossen ist.
ComboBox-Name anpassen
Gruß Dieter
PS. Und nicht vergessen, den Code (Worksheet_Change) im Tabellenblatt 'Lager' wieder zu entfernen
Also, um noch mal auf die Eigenschaften zurückzukommen:
Vorausgesetzt, das Steuerlement (ComboBox) wurde mit der Toolbox ( (Symbolleiste>Toolbox oder Symbolleiste>VisualBasic inkl. Toolbox) erstellt.
Dann können die Eigenschaften nur angezeigt werden, solange Du dich im Entwurfsmodus befindest. D.h. entweder gleich beim erstellen eines Steuerelements, solange das Steuerelement als Object markiert ist (kleine Kreise um das Object und Mousezeiger auf Object in Kreuzform) oder wenn das bereits vorhandene Steuerelement aktiv ist, dann muss auf der VisualBasic-Symbolleiste das Symbol für die Umschaltung Entwurfsmodus/nicht Entwurfsmodus betätigt werden, sodass das Steuerelement aktionsfrei als Object markiert werden kann. Wenn Du also mit der Mouse auf das Object gehst und ein großes schwarzes Kreuz erscheint, dann die rechte Mousetaste drücken und Eigenschaften auswählen, dann geht ein Eigenschaftsfenster auf, dass für das aktuell markierte Object gilt. Wenn Du die Eigenschaft (Name) änderst, dann musst Du das Object erneut doppelklicken, damit der Code in das Tabellenblatt eingefügt wird oder die Namen im Code-Tabellenblatt manuell anpassen. Gegebenenfalls im VB-Editor im Tabellenblatt 'Formular' die Codezeilen (Sub's) löschen, dessen CombBox-Name es nicht mehr gibt. D.h. wenn sich in Deinem Formular nur 2 ComboBoxen befinden, dann sollten sich im Code-Tabellblatt auch nur 2 ComboBoxen-Sub's befinden.
In Bezug auf die Sheets 'Lager' etc.:
Wenn ich Deine Ausführungen richtig verstanden habe, dann werden nach der Betätigung des OK-Buttons bei der Abfrage: Datenbank öffnen, die Sheets in die Arbeitsmappe mit dem Sheet 'Formular' geladen. Wenn ja, dann musst Du diese Codezeilen in der OK-Routine im Anschluss an die Codezeilen einbinden, in denen der Sheet-Import abgeschlossen ist.
With Sheets("Lager")
Sheets("Formular").ComboBoxX.ListFillRange = .Name & "!C2:C" & .Cells(.Rows.Count, "C").End(xlUp).Row
End With
Gruß Dieter
PS. Und nicht vergessen, den Code (Worksheet_Change) im Tabellenblatt 'Lager' wieder zu entfernen

Hallo Lime43!
Also, Du hast jetzt beide Initialisierungen drinnen und da stellt sich mir erstmal die Frage, ob Du beide benötigst. D.h. wenn das Sheet 'Lager' importiert wird, dann beinhaltet dies ja den aktuellen Bestand und der ändert sich doch nach dem Import innerhalb der aktuellen Arbeitsmappe nicht mehr oder doch?
Wenn nein, dann den Code im Sheet 'Lager' wieder entfernen.
Ansonnsten, kann ich nicht ganz nachvollziehen, wieso die Zeilenanzahl 'Lager' stimmt, aber die Einträge aus einem anderen Sheet angezeigt werden. Da läuft irgendwas schief, was ich mir nicht erklären kann
Klappt das jetzt mit den Eigenschaften? Wenn ja, was steht nach dem Import in Eigenschaften.ListFillRange drinnen (sollte sein: Lager!C2:C85)? Stimmt der ComboBox-Name an allen Stellen überein?
Zu Punkt C1 und C2, hat im ersten Feld ein Leerfeld... Das verstehe ich nun auch nicht. Wenn im Sheet 'Lager' von Zeile 2 bis Zeile 85 Artikelnummern enthalten sind, dann sollte es kein Leerfeld geben. Aber das kannst Du auch nur kontrollieren, wenn Du unter Eigenschaften.ListFillRange nach siehst.
Siehe auch nochmal alle Codezeilen durch, die mit der ComboBox zutun haben und kontrolliere die Angaben.
Gruß Dieter
Also, Du hast jetzt beide Initialisierungen drinnen und da stellt sich mir erstmal die Frage, ob Du beide benötigst. D.h. wenn das Sheet 'Lager' importiert wird, dann beinhaltet dies ja den aktuellen Bestand und der ändert sich doch nach dem Import innerhalb der aktuellen Arbeitsmappe nicht mehr oder doch?
Wenn nein, dann den Code im Sheet 'Lager' wieder entfernen.
Ansonnsten, kann ich nicht ganz nachvollziehen, wieso die Zeilenanzahl 'Lager' stimmt, aber die Einträge aus einem anderen Sheet angezeigt werden. Da läuft irgendwas schief, was ich mir nicht erklären kann
Klappt das jetzt mit den Eigenschaften? Wenn ja, was steht nach dem Import in Eigenschaften.ListFillRange drinnen (sollte sein: Lager!C2:C85)? Stimmt der ComboBox-Name an allen Stellen überein?
Zu Punkt C1 und C2, hat im ersten Feld ein Leerfeld... Das verstehe ich nun auch nicht. Wenn im Sheet 'Lager' von Zeile 2 bis Zeile 85 Artikelnummern enthalten sind, dann sollte es kein Leerfeld geben. Aber das kannst Du auch nur kontrollieren, wenn Du unter Eigenschaften.ListFillRange nach siehst.
Siehe auch nochmal alle Codezeilen durch, die mit der ComboBox zutun haben und kontrolliere die Angaben.
Gruß Dieter

Hallo Lime43!
Also, um mal etwas Verwirrung zu beseitigen:
Leider haben die Steuerelemente in Sheets gegenüber UserForms den Nachteil, das die aktuellen Einträge mit der Arbeitsmappe gespeichert werden und beim Öffnen der Arbeitsmappe noch da sind, auch wenn der Datenbereich leer oder nicht vorhanden ist. Um zu gewährleisten, dass die ComboBoxen zunächst mal beim Öffnen leer sind, hier ne kleine CleanUp-Routine, die beim Öffnen der Arbeitsmappe die ComboBoxen entleert.
Ich gehe mal davon aus, dass im VB-Editor in 'Diese Arbeitsmappe' diese Sub-Routine schon existiert:
Wenn ja, dann füge diese Codezeile in die Routine mit ein:
und darunter irgendwo diesen Code, der Die ComboBoxen 1+2 beim Start entleert:
Im Anschluß fügst Du noch in den Sub-Routinen 'Private Sub ComboBox1_Change()' und 'Private Sub ComboBox2_Change()' diese Codzeile an erster Stelle ein:
Nun sollten beim erneuten Öffnen der Arbeitsmappe die ComboBoxen zunächst Leer sein.
Und nun zum Initialisierungs-Code
der, soweit ich aus Deinen Bildern sehen kann, falsch platziert ist. So wie ich das sehe, wird zunächst nur geprüft ob die Datenbank existiert, aber einen Ladevorgang kann ich nicht erkennen und vermute mal, dass dies in der UserForm 'DL_Scroll.Show' passiert? Wenn ja, dann den Code dorthin verfrachten oder die Codezeilen mal im Anschluß nach dem Aufruf 'DL_Scroll.Show' setzen.
Gruß Dieter
PS. Die ComboBoxen erst zur Laufzeit zu erzeugen macht keinen Sinn. Du kannst allerdings in der CleanUp-Routine noch '.Visible = False' mit einfügen und in dem Init-Teil dann noch '.Visible = True' mit einbauen, damit die ComboBoxen nur sichtbar sind, wenn die Datenbank geladen ist.
Also, um mal etwas Verwirrung zu beseitigen:
Leider haben die Steuerelemente in Sheets gegenüber UserForms den Nachteil, das die aktuellen Einträge mit der Arbeitsmappe gespeichert werden und beim Öffnen der Arbeitsmappe noch da sind, auch wenn der Datenbereich leer oder nicht vorhanden ist. Um zu gewährleisten, dass die ComboBoxen zunächst mal beim Öffnen leer sind, hier ne kleine CleanUp-Routine, die beim Öffnen der Arbeitsmappe die ComboBoxen entleert.
Ich gehe mal davon aus, dass im VB-Editor in 'Diese Arbeitsmappe' diese Sub-Routine schon existiert:
Private Sub Workbook_Open()
'....
End Sub
Call CleanUp
Private Sub CleanUp()
With Sheets("Formular")
With .ComboBox1
.ListIndex = -1
.ListFillRange = ""
End With
With .ComboBox2
.ListIndex = -1
.ListFillRange = ""
End With
End With
End Sub
Im Anschluß fügst Du noch in den Sub-Routinen 'Private Sub ComboBox1_Change()' und 'Private Sub ComboBox2_Change()' diese Codzeile an erster Stelle ein:
If ComboBox1.Text = "" Then Exit Sub
Nun sollten beim erneuten Öffnen der Arbeitsmappe die ComboBoxen zunächst Leer sein.
Und nun zum Initialisierungs-Code
With Sheets("Lager")
Sheets("Formular").ComboBoxX.ListFillRange = .Name & "!C2:C" & .Cells(.Rows.Count, "C").End(xlUp).Row
End With
Gruß Dieter
PS. Die ComboBoxen erst zur Laufzeit zu erzeugen macht keinen Sinn. Du kannst allerdings in der CleanUp-Routine noch '.Visible = False' mit einfügen und in dem Init-Teil dann noch '.Visible = True' mit einbauen, damit die ComboBoxen nur sichtbar sind, wenn die Datenbank geladen ist.

Hallo Lime43!
Freut mich, dass es nun zumindest teilweise funktioniert
Ich hatte eigentlich auch so vor ca 15 Jahren mit Programmieren (Borland C und Assembler) aufgehört und erst vor ca 2 Jahren wieder mit VBA angefangen und auch ein wenig VBS-Kenntnisse angeeignet. Angefangen hatte ich das eigentlich auch nur deswegen, weil ich mir unbedingt eine eigene Depotverwaltung in Excel programmieren wollte, die sehr umfangreich ist und ich dadurch sehr viel über VBA gelernt habe. Bits und Bytes haben mich auch aus beruflicher Hinsicht schon immer fasziniert (Fernwirk-/Netzleittechnik und allgemeine SPS-Steuerungstechnik).
So, nun zu Deinen Fragen
Schriftarten...
Im Eigenschaftsfenster hast Du eine sehr große Auswahl, wie z.B. die Farben (Backcolor) des Steuerelements, die Schrifart/größe (Font), Schriftfarbe (ForeColor) usw. einzustellen. Einfach mal in einer neuen Arbeitsmappe Steuerelemente einfügen und etwas damit herumexperementieren.
ComboBox-Eintrag leeren mit:
CleanUp, steht der Code so bei dir drinnen und existieren die ComboBoxen 1 und 2:
In Deinem Bild mit der Fehlermeldung sehe ich keine ComboBoxen? Wenn die ComboBoxen beim Öffnen der Arbeitsmappe noch nicht existieren, dann funktioniert dieser Code natürlich nicht bzw. würde den Debugger-Fehler erlären.
ComboBoxen erst zur Laufzeit erstellen:
Wie gesagt, ergibt das für mich keinen Sinn, zumal der Aufwand insgesamt wesentlich größer ist, die ComboBoxen beim Schließen der Arbeitsmappe auch wieder gelöscht werden müssen, damit sie beim erneuten Öffnen wieder neu erstellt werden können usw., kein Eigenschaftsfenster verfügbar ist und und und. Da ist es doch wesentlich einfacher, Visible auf True/False zu setzen, wenn's sie in irgendeiner Weise stören?
Gruß Dieter
Freut mich, dass es nun zumindest teilweise funktioniert
Ich hatte eigentlich auch so vor ca 15 Jahren mit Programmieren (Borland C und Assembler) aufgehört und erst vor ca 2 Jahren wieder mit VBA angefangen und auch ein wenig VBS-Kenntnisse angeeignet. Angefangen hatte ich das eigentlich auch nur deswegen, weil ich mir unbedingt eine eigene Depotverwaltung in Excel programmieren wollte, die sehr umfangreich ist und ich dadurch sehr viel über VBA gelernt habe. Bits und Bytes haben mich auch aus beruflicher Hinsicht schon immer fasziniert (Fernwirk-/Netzleittechnik und allgemeine SPS-Steuerungstechnik).
So, nun zu Deinen Fragen
Schriftarten...
Im Eigenschaftsfenster hast Du eine sehr große Auswahl, wie z.B. die Farben (Backcolor) des Steuerelements, die Schrifart/größe (Font), Schriftfarbe (ForeColor) usw. einzustellen. Einfach mal in einer neuen Arbeitsmappe Steuerelemente einfügen und etwas damit herumexperementieren.
ComboBox-Eintrag leeren mit:
'....
ComboBox2.ListIndex = -1 'aber erst nachdem der Inhalt ausgewertet wurde
CleanUp, steht der Code so bei dir drinnen und existieren die ComboBoxen 1 und 2:
Private Sub Workbook_Open()
'......
Call CleanUp
End Sub
Private Sub CleanUp()
With Sheets("Formular")
With .ComboBox1
.ListIndex = -1
.ListFillRange = ""
End With
With .ComboBox2
.ListIndex = -1
.ListFillRange = ""
End With
End With
End Sub
ComboBoxen erst zur Laufzeit erstellen:
Wie gesagt, ergibt das für mich keinen Sinn, zumal der Aufwand insgesamt wesentlich größer ist, die ComboBoxen beim Schließen der Arbeitsmappe auch wieder gelöscht werden müssen, damit sie beim erneuten Öffnen wieder neu erstellt werden können usw., kein Eigenschaftsfenster verfügbar ist und und und. Da ist es doch wesentlich einfacher, Visible auf True/False zu setzen, wenn's sie in irgendeiner Weise stören?
Gruß Dieter

Hallo Lime43!
Wie jetzt, dass verstehe ich nicht so ganz? Dachte, dass im Sheet 'Formular' die 2 ComboBoxen beim Öffnen der Arbeitsmappe schon existieren, sollten sie eigentlich, sonst müsste im Code ja schon etwas in der Art stehen?
Ansonsten den ganzen CleanUp-Teil wieder rausnehmen und falls benötig, diese Codzeilen an entsprechender Stelle im Code (Laden Datenbank = False) einfügen?:
Der Sinn des Ganzen bestand eigentlich darin, dass bei einem erneuten Öffnen der Arbeitsmappe mit bereits bestehenden Comboboxen, die Einträge in der ComboBox, die zum Zeitpunkt des Schließens vorhanden waren und beim Öffnen immer noch da sind, zu entfernen bzw. die ComboBox zu leeren, was z.B. dann sinnvoll wäre, wenn die Datenbank mit Sheet 'Lager' garnicht geladen wird.
Gruß Dieter
Wie jetzt, dass verstehe ich nicht so ganz? Dachte, dass im Sheet 'Formular' die 2 ComboBoxen beim Öffnen der Arbeitsmappe schon existieren, sollten sie eigentlich, sonst müsste im Code ja schon etwas in der Art stehen?
Set CBox = Sheets("Formular").OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _
DisplayAsIcon:=False, Left:=100, Top:=100, Width:=60, Height:=24)
With CBox
.Name = "CBoxArtikel"
'......
End With
Ansonsten den ganzen CleanUp-Teil wieder rausnehmen und falls benötig, diese Codzeilen an entsprechender Stelle im Code (Laden Datenbank = False) einfügen?:
With Sheets("Formular").ComboBox2
.ListIndex = -1
.ListFillRange = ""
End With
Eines kapiere ich nicht, warum im Workbook open mit Call der Aufruf stattfindet, und sonst nur mit dem Sub Namen
Mhm, ja wie sollte der Aufruf den sonst aussehen, wenn bei CleanUp keine Übergabeparameter benötigt werden und das Workbook_Open ist eine vordefinierte Sub, die automatisch beim Öffnen der Arbeitsmappe ausgeführt wird und funktioniert nur in der Code-Seite von 'Diese Arbeitsmappe'. Das sind sogenannte Erreignisse, von denen es eine ganze Menge gibt. Am besten im VB-Editor>ObjectKatalog an den gelben Blitzen zu erkennen (z.B. noch Workbook_BeforeSave, Workbook_BeforeClose usw.)Gruß Dieter

Hallo Lime43!
Jetzt weiß ich was Du mit Call meinst und nö ist eignentlich nicht erforderlich. Habe ich mir nur so angewöhnt, weil's dann irgendwie übersichtlicher ist bzw. beim Lesen von Code besser in's Auge springt
Aja, jetzt habe ich's verstanden, nachdem Du erwähnt hast, das die Vorlage auch erst geladen wird
Dann funktioniert das über Workbook_Open natürlich nicht und den ganzen CleanUp-Teil kannst Du ganz vergessen
Das Auswahlfeld löschen so:
Wobei die Codezeile 2 verhindert, das Dein Code nochmal ausgeführt wird, wenn der Inhalt gelöscht wird.

Gruß Dieter
P.S. Mal aus reiner Neugierde, was soll dieser Teil eigentlich bewirken?
Bitte mit Beispiele
Jetzt weiß ich was Du mit Call meinst und nö ist eignentlich nicht erforderlich. Habe ich mir nur so angewöhnt, weil's dann irgendwie übersichtlicher ist bzw. beim Lesen von Code besser in's Auge springt
Aja, jetzt habe ich's verstanden, nachdem Du erwähnt hast, das die Vorlage auch erst geladen wird
Dann funktioniert das über Workbook_Open natürlich nicht und den ganzen CleanUp-Teil kannst Du ganz vergessen
Das Auswahlfeld löschen so:
Private Sub ComboBox1_Change()
If ComboBox1.Text = "" Then Exit Sub
'Dein Code
ComboBox1.ListIndex = -1
End Sub
Noch schnell eine Bemerkung, sieht nicht dieser erste Teil deines obigen, also letzten Posts nach virtuellem Einfügen einer Combobox aus
Das Ganze dann in etwa soSub CreateComboBoxArtikel()
Dim CBox As OLEObject, ListRange As String
With Sheets("Lager")
ListRange = .Name & "!C2:C" & .Cells(.Rows.Count, "C").End(xlUp).Row
End With
Set CBox = Sheets("Formular").OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _
DisplayAsIcon:=False, Left:=400, Top:=100, Width:=100, Height:=16)
With CBox
.Name = "CBoxArtikel" 'Name
.ListFillRange = ListRange 'List-Bereich
With .Object
.BackColor = RGB(240, 240, 240) 'Hintergrundfarbe
.ForeColor = RGB(0, 128, 0) 'Schriftfarbe
.FontName = "Tahoma" 'Schriftart
.FontSize = 8 'Schriftgröße
End With
End With
End Sub
Private Sub CBoxArtikel_Change()
If CBoxArtikel.Text = "" Then Exit Sub
'Dein restlicher Code
CBoxArtikel.ListIndex = -1
End Sub
Gruß Dieter
P.S. Mal aus reiner Neugierde, was soll dieser Teil eigentlich bewirken?
Tekst = Worksheets("Lager").Cells(st + 1, 2)
ii = Len(Tekst)
For i = 1 To ii
Tekst(2) = Right(Tekst, ii - i + 1)
zeich = Left(tekst2, 1)
If zeich = "," Or i = 11 Then
iii = iii + 1
If iii = 1 Then
c = i
ActiveSheet.Cells(z, 3) = Left(Tekst, i)
Else
tekst3 = Mid(Tekst, c + 1, i - c)
c = i
ActiveSheet.Cells(z + iii - 1, 3) = tekst3
End If
End If
Next i

Hallo Lime43!

Den Rest schaue ich mir erst noch an.
Gruß Dieter
So und zu meinem Problem, wie ich es einschätze, wenn ich dieses Listindex -1 gebe, muß ich anscheinend danach immer neu intialisieren
damit ich im Anfangszustand bin, denn danach ist der Ausgangspunkt anders, also rufe ich danach immer am besten
Sheets("Formular").ComboBoxX.ListFillRange = .Name & "!C2:C" & .Cells(.Rows.Count, "C").End(xlUp).Row
Das ist völlig unnötig, da nur der Text im Eingabefeld entfernt wird, und somit der gleiche Eintrag auch mehrere male hintereinander ausgewählt werden kanndamit ich im Anfangszustand bin, denn danach ist der Ausgangspunkt anders, also rufe ich danach immer am besten
Sheets("Formular").ComboBoxX.ListFillRange = .Name & "!C2:C" & .Cells(.Rows.Count, "C").End(xlUp).Row
Den Rest schaue ich mir erst noch an.
Gruß Dieter

Hallo Lime43!
Tja, dass sind so die Feinheiten bei den ComboBoxen. Das Problem bei der Ganzen Sache ist, dass die Change-Routine nach jeder Eingabe eines Zeichens aufgerufen wird und bei einem Treffer durch die Autovervollständigung ein Ergebnis liefert. Hätten alle Artikelnummern die gleiche Stellenanzahl, könnte man prüfen, ob es nur eine oder mehrere Übereinstimmungen gibt und dementsprechend agieren. Wenn aber z.B. eine 2.stellige Artikelnummer mit den beiden ersten beiden einer 3- oder 4.stelligen übereinstimmt, dann sehe ich keine Möglichkeit da was zu tricksen.
Mit einer TextBox bestünde das gleiche Problem mit der Change-Routine, denn auch da wird diese für jedes einzelne Zeichen aufgerufen. Insofern würde da nur ein extra Button helfen, mit dem die Übernahme bestätigt wird.
Von daher wäre zu überlegen, ob alle Artikelnummer mit einer gleichen Stellenanzahl generiert werden können z.B. Porto anstatt 82 dann 0082 usw.
Der Code '.ListIndex = -1' funktioniert mit der aktuellen Change-Routine leider nicht
Gruß Dieter
Tja, dass sind so die Feinheiten bei den ComboBoxen. Das Problem bei der Ganzen Sache ist, dass die Change-Routine nach jeder Eingabe eines Zeichens aufgerufen wird und bei einem Treffer durch die Autovervollständigung ein Ergebnis liefert. Hätten alle Artikelnummern die gleiche Stellenanzahl, könnte man prüfen, ob es nur eine oder mehrere Übereinstimmungen gibt und dementsprechend agieren. Wenn aber z.B. eine 2.stellige Artikelnummer mit den beiden ersten beiden einer 3- oder 4.stelligen übereinstimmt, dann sehe ich keine Möglichkeit da was zu tricksen.
Mit einer TextBox bestünde das gleiche Problem mit der Change-Routine, denn auch da wird diese für jedes einzelne Zeichen aufgerufen. Insofern würde da nur ein extra Button helfen, mit dem die Übernahme bestätigt wird.
Von daher wäre zu überlegen, ob alle Artikelnummer mit einer gleichen Stellenanzahl generiert werden können z.B. Porto anstatt 82 dann 0082 usw.
Der Code '.ListIndex = -1' funktioniert mit der aktuellen Change-Routine leider nicht
Gruß Dieter

Hallo Lime!
Glaub ich habe da ne viel bessere Idee
Mal folgendes machen, wobei ich jetzt zum testen mal davon ausgehe, dass das Sheet 'Formular' und 'Lager' geladen ist:
1.
Im Sheet Lager den Zellbereich mit den Artikelnummern markieren und
oben im Feld, wo die Zell-Adresse angezeigt wird, Eingabe: LagerListe + Returntaste (Zellbereich einen Namen geben)
2.
Im Sheet Formular den Bereich B22-B44 markieren dann
auf Menu>Daten>Gültigkeit klicken dann
Reiter Einstellungen
ComboBox Zulassen: Liste auswählen
RefEdit Quelle: =LagerListe
Reiter Eingabemeldung
Textfeld Titel: Eingabe:
Textfeld Eingabemeldung: Artikel-Nr.
Reiter Fehlermeldung
ComboBox Typ: Symbol auswählen
Textfeld Titel: Fehler:
Textfeld Fehlermeldung: Artikel-Nr.
Das Ganze dann noch mit OK bestätigen
Dann mal im Bereich B22-B44 auf eine beliebige Zelle klicken, dann kann zum einen aus der Liste ausgewählt werden und zum anderen Eingaben mit Return abgeschlossen werden und wenn die Eingabe nicht in der Liste steht, dann wird ein Fehler-Dialog angezeigt, bei dem mit Ja die nächste Zelle aktiviert wird und bei Nein die Eingabe wiederholt werden kann/muss..
Probiers mal soweit aus. Das Ganze muss dann natürlich noch automatisiert werden, aber zum testen jetzt erstmal so
Glaub ich habe da ne viel bessere Idee
Mal folgendes machen, wobei ich jetzt zum testen mal davon ausgehe, dass das Sheet 'Formular' und 'Lager' geladen ist:
1.
Im Sheet Lager den Zellbereich mit den Artikelnummern markieren und
oben im Feld, wo die Zell-Adresse angezeigt wird, Eingabe: LagerListe + Returntaste (Zellbereich einen Namen geben)
2.
Im Sheet Formular den Bereich B22-B44 markieren dann
auf Menu>Daten>Gültigkeit klicken dann
Reiter Einstellungen
ComboBox Zulassen: Liste auswählen
RefEdit Quelle: =LagerListe
Reiter Eingabemeldung
Textfeld Titel: Eingabe:
Textfeld Eingabemeldung: Artikel-Nr.
Reiter Fehlermeldung
ComboBox Typ: Symbol auswählen
Textfeld Titel: Fehler:
Textfeld Fehlermeldung: Artikel-Nr.
Das Ganze dann noch mit OK bestätigen
Dann mal im Bereich B22-B44 auf eine beliebige Zelle klicken, dann kann zum einen aus der Liste ausgewählt werden und zum anderen Eingaben mit Return abgeschlossen werden und wenn die Eingabe nicht in der Liste steht, dann wird ein Fehler-Dialog angezeigt, bei dem mit Ja die nächste Zelle aktiviert wird und bei Nein die Eingabe wiederholt werden kann/muss..
Probiers mal soweit aus. Das Ganze muss dann natürlich noch automatisiert werden, aber zum testen jetzt erstmal so

Hallo Lime!
Mit Liste ist der Eintrag 'Liste' auswählen gemeint (4. Eintrag)
Wenn die Bestellungen aus Internetbestellungen nur abgelesen und eingegeben werden, dann frage ich mich allerdings, warum dann nicht in die Zellen direkt eingeben?
Das finden der dazugehörigen Spalteneinträge aus der Lagerliste ist einfach?
Gruß Dieter
Mit Liste ist der Eintrag 'Liste' auswählen gemeint (4. Eintrag)
Wenn die Bestellungen aus Internetbestellungen nur abgelesen und eingegeben werden, dann frage ich mich allerdings, warum dann nicht in die Zellen direkt eingeben?
Das finden der dazugehörigen Spalteneinträge aus der Lagerliste ist einfach?
Gruß Dieter

Hallo Lime43!
Siehe Dir bitte das Bild an, wenn Du auf die Einträge in der offenen ComboBox schaust, dann steht da nach Dezimal "Liste" und das musst Du anklicken, dann gehts weiter.
Gruß Dieter
P.S. Alles was in meiner Beschreibung Fett geschrieben ist, sind die Eingaben von Dir
Siehe Dir bitte das Bild an, wenn Du auf die Einträge in der offenen ComboBox schaust, dann steht da nach Dezimal "Liste" und das musst Du anklicken, dann gehts weiter.
Gruß Dieter
P.S. Alles was in meiner Beschreibung Fett geschrieben ist, sind die Eingaben von Dir

Hallo Lime!
Na, war vermutlich doch schlecht bzw verwirrend erklärt
Also, wenn Du etwas reinschreibst, was es in der Liste nicht gibt und mit Enter bestätigst, dann wird eine Fehlermeldung mit Ja-Nein-Abbrechen-Buttons ausgegeben. Die Fehlerauswertung kann auch ausgeschaltet werden und im Code durch eine einfache MsgBox-Ausgabe ersetzt werden. Und wie gesagt der Rest bzw. die Auswertung der Eingabe ist einfach, habe ich aber noch nicht fertig, weil ich gerade noch mit was anderem zu kämpfen habe. Dauert also noch ein bisschen
Was die zweizeiligen Texte angeht, sehe ich da im Moment kein Problem. Wenn sich in der Activen Zeile schon ein Text-Eintrag in Spalte C befindet, dann wird die Eingabe ignoriert und eine Fehlermeldung ausgegeben oder einfach nur ignoriert?
Gruß Dieter
Na, war vermutlich doch schlecht bzw verwirrend erklärt
Also, wenn Du etwas reinschreibst, was es in der Liste nicht gibt und mit Enter bestätigst, dann wird eine Fehlermeldung mit Ja-Nein-Abbrechen-Buttons ausgegeben. Die Fehlerauswertung kann auch ausgeschaltet werden und im Code durch eine einfache MsgBox-Ausgabe ersetzt werden. Und wie gesagt der Rest bzw. die Auswertung der Eingabe ist einfach, habe ich aber noch nicht fertig, weil ich gerade noch mit was anderem zu kämpfen habe. Dauert also noch ein bisschen
Was die zweizeiligen Texte angeht, sehe ich da im Moment kein Problem. Wenn sich in der Activen Zeile schon ein Text-Eintrag in Spalte C befindet, dann wird die Eingabe ignoriert und eine Fehlermeldung ausgegeben oder einfach nur ignoriert?
Gruß Dieter

Hallo Lime43!
Wenn die Fehlermeldung nicht funktioniert, dann markiere nochmal den ganzen Bereich und gehe wieder auf Menu>Daten>Güligkeit und aktiviere im Reiter Eingabemeldung und Fehlermeldung anzeigen (ganz oben).
Na, dann gute Nacht
Gruß Dieter
Wenn die Fehlermeldung nicht funktioniert, dann markiere nochmal den ganzen Bereich und gehe wieder auf Menu>Daten>Güligkeit und aktiviere im Reiter Eingabemeldung und Fehlermeldung anzeigen (ganz oben).
Na, dann gute Nacht
Gruß Dieter

Hallo nochmal!
Ich gehe mal davon aus, dass Du inzwischen den ganzen ComboBox2-Kram inzwischen entsorgt hast. Wenn nicht, dann wäre das der erste Schritt
Dieser Code muss in ein Modul z.B. mit Namen "FormularValidation" eingefügt werden:
Hiermit wird im Sheet Lager der Zell-Bereich mit Name und im Sheet Formular die Gültigkeitsregel erstellt. Diese Sub muss aufgerufen werden, nachdem die Sheets 'Formular' und das Sheet 'Lager' importiert wurden. Praktisch an der Stelle, wo vorher die ComboBox mit dem Lager-Bereich initialisiert wurde.
Und dieser Code wird in der Formular-Tabelle eingefügt:
Nachdem das Einfügen soweit geklappt hat und die entsprechenden Sheets importiert sind, sollte einem Test hoffentlich nix mehr im Wege stehen.
Noch ein paar Dinge zum Ablauf:
Die Fehlerbehandlung in der Gültigkeitsregel ist deaktiviert und wird Codeseitig geregelt.
Bei einer Falscheingabe wird eine Fehlermeldung ausgegeben und die Fehlerzelle wieder aktiviert.
Der Bestelltext, wird auf Anzahl der Komma gesplittet und für jedes Komma in eine neue Zeile (,=2 ,,=3...) geschrieben und die nächste freie Zeile aktiviert
Viel Spaß beim testen
Gruß Dieter
[edit] Im 2. Code mit Worksheet_Change Codezeile14 noch Zellen-Leertest hinzugefügt [/edit]
[edit]
Im 2. Code mit Worksheet_Change noch eine Prüfung hinzugefügt, mit der verhindert wird, dass mehrzeiliger Bestelltext über
den Formularbereich hinaus geht.Hierzu wird wird eine entsprechende Meldung ausgegeben und Eingabezelle wieder aktiviert.
[/edit]
Ich gehe mal davon aus, dass Du inzwischen den ganzen ComboBox2-Kram inzwischen entsorgt hast. Wenn nicht, dann wäre das der erste Schritt
Dieser Code muss in ein Modul z.B. mit Namen "FormularValidation" eingefügt werden:
Option Explicit
Public Const BestellRange As String = "B22:B44" 'Formular: Bereich Bestelldaten (in ganzer Mappe verfügbar)
Private Const LagerAbZeile = 2 'Lager: Artikelnummern ab Zeile x
Sub InitFormularValidation()
Dim LagerRange As String
'Lager-Bereich mit Artikelnummern ermitteln und Parameter für Zellen-Namen erstellen
With Sheets("Lager")
LagerRange = "=" & .Name & "!$C$" & LagerAbZeile & ":$C$" & .Cells(.Rows.Count, "C").End(xlUp).Row
End With
'Zellen-Name mit Bereich festlegen
ThisWorkbook.Names.Add Name:="LagerListe", RefersTo:=LagerRange
'Gültigkeitsregeln festlegen
With Sheets("Formular").Range(BestellRange).Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
Operator:=xlBetween, Formula1:="=LagerListe"
.InputTitle = "Eingabe:"
.InputMessage = "Artikel-Nr."
.ShowInput = True
.ShowError = False
End With
End Sub
Und dieser Code wird in der Formular-Tabelle eingefügt:
Option Explicit
Private Const LagerArtikelSpalte = "C" 'Tabelle: Lager-Spalte Artikelnummern
Private NoChange As Boolean 'Flag Bestelldaten eintragen (Änderungen ignorieren)
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Found As Range, Text As Variant, RowF As Long, RowL As Long, MaxRowF As Long, i As Long
'Wenn Bestelldaten eingetragen werden abbrechen
If NoChange = True Then Exit Sub
'Prüfen ob nur 1 Zelle selektiert und nicht Leer ist und ob die Zelle im Bereich der Bestelldaten liegt
If Target.Count <> 1 Or IsEmpty(Target) Or Application.Intersect(Target, Range(BestellRange)) Is Nothing Then Exit Sub
With Sheets("Lager")
'Artikelnummer im Sheet Lager suchen
Set Found = .Columns(LagerArtikelSpalte).Find(Trim(Target), LookIn:=xlValues, LookAt:=xlWhole)
'Prüfen ob Artikelnummer gefunden wurde
If Found Is Nothing Then
Target.Activate 'Eingabe-Zelle wieder aktivieren
MsgBox "Artikelnummer wurde nicht gefunden!", vbExclamation, "Fehler...": Exit Sub
Else
RowF = Target.Row: RowL = Found.Row 'Formular und Lager Zeilen ermitteln
Text = Split(.Cells(RowL, "B"), ",") 'Text = Array mit Komma-Trennzeichen
With Range(BestellRange)
MaxRowF = .Row + .Rows.Count - 1 'Max-Zeile in Bestellbereich ermitteln
End With
If (RowF + UBound(Text)) > MaxRowF Then 'Test ob Bestelltext (Mehrzeiler) innerhalb Bestellbereich
Target.Activate 'Eingabe-Zelle wieder aktivieren
MsgBox "Der Bestelltext passt nicht mehr in den Formularbereich!", vbInformation, "Hinweis..."
Else
NoChange = True 'Flag setzen, Bestelldaten werden eingetragen
Cells(RowF, "B") = .Cells(RowL, "C") 'Art.Nr
Cells(RowF, "E") = .Cells(RowL, "D") 'Menge
Cells(RowF, "F") = .Cells(RowL, "E") 'Preis
Cells(RowF, "G") = .Cells(RowL, "F") 'MWST
'Text in Abhängigkeit der Kommas Zeilenweise eintragen
For i = 0 To UBound(Text): Cells(RowF + i, "C") = Trim(Text(i)): Next
Cells(RowF + i, "B").Activate 'Nächste freie Zeile aktivieren
NoChange = False 'Flag zurücksetzen, Bestelldaten sind eingetragen
End If
End If
End With
End Sub
Nachdem das Einfügen soweit geklappt hat und die entsprechenden Sheets importiert sind, sollte einem Test hoffentlich nix mehr im Wege stehen.
Noch ein paar Dinge zum Ablauf:
Die Fehlerbehandlung in der Gültigkeitsregel ist deaktiviert und wird Codeseitig geregelt.
Bei einer Falscheingabe wird eine Fehlermeldung ausgegeben und die Fehlerzelle wieder aktiviert.
Der Bestelltext, wird auf Anzahl der Komma gesplittet und für jedes Komma in eine neue Zeile (,=2 ,,=3...) geschrieben und die nächste freie Zeile aktiviert
Viel Spaß beim testen
Gruß Dieter
[edit] Im 2. Code mit Worksheet_Change Codezeile14 noch Zellen-Leertest hinzugefügt [/edit]
[edit]
Im 2. Code mit Worksheet_Change noch eine Prüfung hinzugefügt, mit der verhindert wird, dass mehrzeiliger Bestelltext über
den Formularbereich hinaus geht.Hierzu wird wird eine entsprechende Meldung ausgegeben und Eingabezelle wieder aktiviert.
[/edit]

Guten Morgen Lime43!
Was, Du hängst schon wieder
Also, Modul1 hast Du ja schon eingefügt, dann brauchst Du nur noch unter Menu>Ansicht>Eigenschaftsfenster anklicken oder F4 drücken. Und wo steht (Name) Modul1, kannst Du die Bezeichnung anpassen, wobei ein kurzer Name wie z.B. "Validation" ausreicht .
Gruß Dieter
Was, Du hängst schon wieder
Also, Modul1 hast Du ja schon eingefügt, dann brauchst Du nur noch unter Menu>Ansicht>Eigenschaftsfenster anklicken oder F4 drücken. Und wo steht (Name) Modul1, kannst Du die Bezeichnung anpassen, wobei ein kurzer Name wie z.B. "Validation" ausreicht .
Gruß Dieter

Hallo Lime43!
Wie, Du hast in Lager Code eingefügt? Verstehe ich nicht ganz?
Der eine Code sollte in das Code-Blatt 'Rechnung-Formular' und der andere Code in das Modul 'Rechnung-Validation'
Und da wo vorher stand (nach dem DL_Scroll-Dingens)
das soll jetzt durch das hier ersetzt werden:
Ich hoffe Du hast auf jeden Fall Sicherheitskopien gemacht? Den alles was Du jetzt machst sollte erstmal nur als Test angesehen werden.
Mir ist bei nochmaligem durchsehen Deiner eingestellten Bilder noch aufgefallen, das es z.B. beim Formular noch ein Muster für die Bestellfortsetzung gibt, insofern, habe ich das noch nicht berücksichtigt und auch nur teilweise einen Plan, weil ich nicht weiß, wie das im Moment von statten geht.
Gruß Dieter
P.S. Welches Bild?
Wie, Du hast in Lager Code eingefügt? Verstehe ich nicht ganz?
Der eine Code sollte in das Code-Blatt 'Rechnung-Formular' und der andere Code in das Modul 'Rechnung-Validation'
Und da wo vorher stand (nach dem DL_Scroll-Dingens)
With Sheets("Lager")
Sheets("Formular").ComboBoxX.ListFillRange = .Name & "!C2:C" & .Cells(.Rows.Count, "C").End(xlUp).Row
End With
Call InitFormularValidation
Ich hoffe Du hast auf jeden Fall Sicherheitskopien gemacht? Den alles was Du jetzt machst sollte erstmal nur als Test angesehen werden.
Mir ist bei nochmaligem durchsehen Deiner eingestellten Bilder noch aufgefallen, das es z.B. beim Formular noch ein Muster für die Bestellfortsetzung gibt, insofern, habe ich das noch nicht berücksichtigt und auch nur teilweise einen Plan, weil ich nicht weiß, wie das im Moment von statten geht.
Gruß Dieter
P.S. Welches Bild?

Hallo Lime43!
Dieser Code
geht bei Deiner VB-Version wohl nicht, von daher ändern auf
Jepp, der Aufruf der Sub 'InitFormularValidation' steht an der richtigen Stelle
Modul1 umbenennen:
Wenn das Modul1 aktiviert ist, dann gehe in das Menü und klicke unter Ansicht auf den Eintrag 'Eigenschaftsfenster'. Dann wo steht: (Name) | Modul1, dann ersetzt Du den Namen "Modul1" durch "Validation"
Aber mal so ganz nebenbei, was ich bis jetzt so an Code gesehen habe, fällt mir auf, dass da schon einiges Verbesserungs-/Optimierungsbedürftig wäre, ist aber reine Geschmackssache
Gruß Dieter
P.S. Habe im letzten Code im zweiten Teil (Worksheet_Change) noch Änderungen eingefügt
Dieser Code
Public Const BestellRange As String = "B22:B44"
Public Const BestellRange = "B22:B44"
Jepp, der Aufruf der Sub 'InitFormularValidation' steht an der richtigen Stelle
Modul1 umbenennen:
Wenn das Modul1 aktiviert ist, dann gehe in das Menü und klicke unter Ansicht auf den Eintrag 'Eigenschaftsfenster'. Dann wo steht: (Name) | Modul1, dann ersetzt Du den Namen "Modul1" durch "Validation"
Aber mal so ganz nebenbei, was ich bis jetzt so an Code gesehen habe, fällt mir auf, dass da schon einiges Verbesserungs-/Optimierungsbedürftig wäre, ist aber reine Geschmackssache
Gruß Dieter
P.S. Habe im letzten Code im zweiten Teil (Worksheet_Change) noch Änderungen eingefügt

Hallo Lime43!
Muss natürlich (Aktuelle Zeile + Textzeilen) > Max-Zeile geprüft werden, wobei UBound bei Zeile1 den Wert 0, Zeile 2 den Wert 1 usw. zurückgibt. Code oben geändert.
Eine Email-Adresse findest Du in Deinem Postfach
Gruß Dieter
P.S. Passwort löschen:
Dann solltest Du ohne Kennwort reinkommen und wie das setzen eines neues KennwortesPasswortes geht, sollte Dir dann auch klar sein
Und zu guter Letzt hatte ich dann noch den geänderten Teil rein und jetzt meldet dieses Ding bei jedem 2Zeiler das der Bestelltext nicht rein paßt..
Da war ich wohl etwas neben der SpurNur umbenennen kann ich es das Modul nicht, Ich bekomme es nicht hin mit den Eigenschaftsfenster ist gleich in welchen Zustand
ich es versuche Ohne oder Mit > Editor, aktiv oder nicht aktiv, da tut sich nichts.
Im VB-Editor das Modul aktivieren (Code anzeigen) und dann im VB-Editor auf Menu>Ansicht>Eigenschaftsfenster anklicken oder F4-Taste betätigen...ich es versuche Ohne oder Mit > Editor, aktiv oder nicht aktiv, da tut sich nichts.
Kann dir gerne die Testversion zuschicken, denn die war ja frei, mußte nur sagen, sind als zip 985 KB, ginge über Mail, oder über meine Page auf der ich ja auch die Bilder habe, wie meine Videos, die ich für einige mache.
Jepp, das ist eine gute IdeeGruß Dieter
P.S. Passwort löschen:
Datei Öffnen
In den VB-Editor wechseln
Projekt auswählen und Password eingeben
Menu>Extras>Eigensachaften von VBAProject anklicken
In den Reiter Schutz wechseln
Projekt sperren Haken raus
Kennwort-Feld löschen
Kennwort bestätigen-Feld löschen
Das Ganze mit OK bestätigen und speichern
In den VB-Editor wechseln
Projekt auswählen und Password eingeben
Menu>Extras>Eigensachaften von VBAProject anklicken
In den Reiter Schutz wechseln
Projekt sperren Haken raus
Kennwort-Feld löschen
Kennwort bestätigen-Feld löschen
Das Ganze mit OK bestätigen und speichern
Dann solltest Du ohne Kennwort reinkommen und wie das setzen eines neues KennwortesPasswortes geht, sollte Dir dann auch klar sein

Hallo Lime43"

Was das Eigenschaftsfenster im VB-Editor betriff, siehst Du kein Eigenschaftsfenster wenn Du im Menü auf >Ansicht>Eigenschaftsfenster klickst? Wenn ja dann ist das Fenster eventuell hinter einem anderen Fenster versteckt? Mein Eigenschaftsfenster teilt sich den Platz am linken Rand mit dem Projekt-Explorer (oben Explorer/unten Eigenschaften)
Gruß Dieter
So und in meinem Postfach ist noch nichts, was nach didi aussieht, das zum Ersten und zum zweiten, es ist doch gut zu arbeiten,
wenn man nicht dauernd beim Testen das PW eingeben muß.
Hatte wohl vergessen den Senden-Button zu betätigenwenn man nicht dauernd beim Testen das PW eingeben muß.
Was das Eigenschaftsfenster im VB-Editor betriff, siehst Du kein Eigenschaftsfenster wenn Du im Menü auf >Ansicht>Eigenschaftsfenster klickst? Wenn ja dann ist das Fenster eventuell hinter einem anderen Fenster versteckt? Mein Eigenschaftsfenster teilt sich den Platz am linken Rand mit dem Projekt-Explorer (oben Explorer/unten Eigenschaften)
Gruß Dieter

Hallo Lime43!
Na, hat's jetzt endlich doch noch geklappt
Dann ändere Codezeile 47 von
nach
Das mit dem zurück von Spalte D auf Spalte B werde ich mir aber erst morgen ansehen
Gruß Dieter
Na, hat's jetzt endlich doch noch geklappt
Dann ändere Codezeile 47 von
Cells(RowF + i, "B").Activate 'Nächste freie Zeile aktivieren
Cells(RowF, "D").Activate 'Gleiche Zeile Spalte D aktivieren
Das mit dem zurück von Spalte D auf Spalte B werde ich mir aber erst morgen ansehen
Gruß Dieter

Hallo Lime43!
Hier der neue Code:
Gruß Dieter
Hier der neue Code:
Option Explicit
Private Const LagerArtikelSpalte = "C" 'Tabelle: Lager-Spalte Artikelnummern
Private NoChange As Boolean 'Flag Bestelldaten eintragen (Änderungen ignorieren)
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Found As Range, RngArea As Range, RngB As Range, Text As Variant
Dim RowF As Long, RowL As Long, MaxRowF As Long, i As Long
'Exit wenn: Bestelldaten eintragen OR mehr als 1 Zelle OR Zelle Leer
If NoChange Or Target.Count <> 1 Or IsEmpty(Target) Then Exit Sub
'Set Bereich (Artikelnummer B22:B44)
Set RngArea = Range(BestellRange)
'Test ob Zelle im Bereich (Stückzahl D22:D44) liegt
If Not Application.Intersect(Target, RngArea.Offset(0, 2)) Is Nothing Then
'Set Zelle in Spalte B in nächster freien Zeile
Set RngB = Cells(RngArea.Row + RngArea.Rows.Count, "C").End(xlUp).Offset(1, -1)
'Test ob Zelle innerhalb des Bestellbereichs liegt
If Not Application.Intersect(RngB, RngArea) Is Nothing Then RngB.Activate Else Target.Activate
Exit Sub
End If
'Test ob Zelle im Bereich (Artikelnummer B22:B44) liegt
If Application.Intersect(Target, RngArea) Is Nothing Then Exit Sub
With Sheets("Lager")
'Artikelnummer im Sheet Lager suchen
Set Found = .Columns(LagerArtikelSpalte).Find(Trim(Target), LookIn:=xlValues, LookAt:=xlWhole)
'Prüfen ob Artikelnummer gefunden wurde
If Found Is Nothing Then
Target.Activate 'Eingabe-Zelle wieder aktivieren
MsgBox "Artikelnummer wurde nicht gefunden!", vbExclamation, "Fehler...": Exit Sub
Else
RowF = Target.Row: RowL = Found.Row 'Formular und Lager Zeilen ermitteln
Text = Split(.Cells(RowL, "B"), ",") 'Text = Array mit Komma-Trennzeichen
With RngArea
MaxRowF = .Row + .Rows.Count - 1 'Max-Zeile in Bestellbereich ermitteln
End With
If (RowF + UBound(Text)) > MaxRowF Then 'Test ob Bestelltext (Mehrzeiler) innerhalb Bestellbereich
Target.Activate 'Eingabe-Zelle wieder aktivieren
MsgBox "Der Bestelltext passt nicht mehr in den Formularbereich!", vbInformation, "Hinweis..."
Else
NoChange = True 'Flag setzen, Bestelldaten werden eingetragen
Cells(RowF, "B") = .Cells(RowL, "C") 'Art.Nr
Cells(RowF, "E") = .Cells(RowL, "D") 'Menge
Cells(RowF, "F") = .Cells(RowL, "E") 'Preis
Cells(RowF, "G") = .Cells(RowL, "F") 'MWST
'Text in Abhängigkeit der Kommas Zeilenweise eintragen
For i = 0 To UBound(Text): Cells(RowF + i, "C") = Trim(Text(i)): Next
Cells(RowF, "D").Activate 'Gleiche Zeile Spalte D aktivieren
NoChange = False 'Flag zurücksetzen, Bestelldaten sind eingetragen
End If
End If
End With
End Sub
Gruß Dieter

Hallo Lime43!
Jepp, gern geschehen
Und bitte nicht vergessen, den Beitrag auf gelöst zu setzen (grünes Häkchen). Danke!
Gruß Dieter
Jepp, gern geschehen
Und bitte nicht vergessen, den Beitrag auf gelöst zu setzen (grünes Häkchen). Danke!
Gruß Dieter