lime43
Goto Top

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

Content-Key: 163474

Url: https://administrator.de/contentid/163474

Printed on: April 19, 2024 at 04:04 o'clock

Mitglied: 76109
76109 Mar 28, 2011 at 14:09:54 (UTC)
Goto Top
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):
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
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 klarkommenface-wink

Gruß Dieter
Member: Lime43
Lime43 Mar 28, 2011 at 15:06:49 (UTC)
Goto Top
Hallo didi1954
Das werde ich mal probieren, glaube aber nicht so ganz daran. Es ist so das ganze Projekt heißt Rechnung und sheet 3 also Formular ist das Rechnungsblatt welches
dann auch ausgedruckt wird am Ende. Beim Start sind die sheets Adresse,Journal, Angebot und das benotigte Lager noch nicht geladen. Und damit habe ich das Problem,
da kann ich dann wohl eine Combobox erstellen, aber ich kann dann das ganze nicht speichern weil es Fehler meldet. Deshalb wollte ich es Dynamisch erst nach dem
Nachladen dieser Sheets generieren und die Combobox füllen mit den Artikelnr. des Lagers.
Wenn ich nun versuche auf Formular die Combobox zu erstellen, bekomme ich diese Eigenschaften nicht zu sehen, sondern nur einen leeren Rahmen. Auch erstellt er mir
im Tabelle3 (Formular) unter MS Excel Objekte, dieses combobox1_change() und ich kann auch da kenen Namen ändern, klappt alles nicht.
Deshalb dachte ich aus all diesen Gründen die Combobox dynamisch an der richtigen Stelle zu programmieren, nur ich weiß nicht wo und wie ich noch alles benötige um sie
dem Projekt bekannt zu geben. Ist ja so, wie schon Anfangs beschrieben ich habe einige 100 Versuche in den letzten 2 Wochen durch mit vielen Beispielen und abwechselnden
Codes und immer meldete der debugger andere Fehler, einmal kannte er die Box nicht hat sie aber eingerichtet, nur beim Füllen da wußte er ncihts mit dem Namen an zu fangen
und ging von einer nicht definierten Variablen aus und das ander Mal ging im ..._change alles daneben, was an Definitionen daneben gehen konnte, denn die Box mit meinem
vergeben Namen war unbekannt.
Wie ich nun meine, brauche ich doch erstmal den dynamischen Comboboxerzeugercode an der Richtigen stelle, zumindest das Füllen darf da erst stattfinden, dann noch der Change()
nur was soll der im Lager und nicht im Modulteil. oder auch im Grundsheet, also sheet3 (Formular).
Irgendwie drehe ich mich im Kreis, wenn das eine geht, dann hakt es an anderer Stelle.
Also ganz Kurz die Fakten:
Sheet3(Formular) steht und dann erscheint ein Feld auf dem mitgeteilt wird, ob die Datensheets geladen werden sollen, denn im Code ändern geht nur ohne.
nach dem Laden müßte die Combobox auf dem Sheet3(Formular generiert werden per VBA dann muß das dem System mitgeteilt werden, damit die Box auch bekannt ist,
danach muß sie ja gefüllt werden und dann muß noch irgendwo die ..._Change() stehen, wie gesagt, wenn ich eine normal das Projekt lade, landet die auf dem sheet Lager.

Auch komisch ist noch, das unter Formulare eine DL_Briefkopf existiert, in dem eine ComboBox1 ist und wenn ich eine auf Sheet3 (Formular ) eine Box erstelle, wieder eine Combobox1 entsteht

Also nur Fragen über Fragen, aber ich versuche mal wenigstens den Code im Lager unter zu bringen, ist ja eine extra XLS Datei

Danke erstmal Emil
Mitglied: 76109
76109 Mar 28, 2011 at 17:17:57 (UTC)
Goto Top
Hallo Lime43!

Deine Erklärung ist ziemlich verwirrendface-sad

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
Member: Lime43
Lime43 Mar 28, 2011 at 18:18:25 (UTC)
Goto Top
Ich starte die Arbeitsmappe welche RechnungV3-40.xlt heißt und dann sehe ich 5 sheets wie gesagt das Formular als erstes Offene dann Übersicht, Mahnung1, Mahnung2, Manung 3
und nach kurzer Zeit kommt ein Fenster wo ich gefragt werde, ob ich die Datenbanken öffnen will und erst danach werden noch 4 Sheets, welche heißen adressen2011.xls, Angebot.2011.xls,
Journal2011.xls und das besagte Lager2011.xls nachgeladen und erscheinen direkt nach dem ersten Scheet von links, dem Formular.
Ich habe zum Test eine combobox angelegt welche gleich beim start belegt wird mit test1 ....5 das macht es auch, aber ich komme nicht auf das Eigenschaftsfenster es geht nicht auf.
Die Box reagiert wohl denn ich kann die Vorbelegung sehen und gebe auch die Zeilennummer mir zum Test aus.
Nach dem Einbau des Worksheet change in Lager habe ich eine sonderbare Feststellung gemacht. Es reagiert aber komplett falsch. Es nimmt wohl die richtige Anzahl von Zeilen aus
Lager, bekomme ja den Zeilenwert geliefert aber der Inhalt in der Box ist vom Sheet Adresse welcher ja auch für die Adressauswahl vorher gestartet wurde. Genau genommen habe
ich in der Lagerdatei 85 Artikel und soviel sind auch die Zahlen die ich habe, aber der Inhalt den ich in der Combobox sehe sind auch 85 aber die Anredeform der Kunden dieser sheet hat 1500
Zeilen. Da beißt sich irgendwas und wie gesagt ich komme nicht an das Eigenschaftsfenster, es öffnet nciht und nun habe ich 2 comboboxen mit gleichem Namen. Kann ich eine einfach im Code
an allen Stellen umwandeln, also ohneweiteres den Namen nur ändern? Aber dann erkennt er die nicht, hatte ich ja schon mehrfach gemacht.
Ich hatte schon mal eine Dynamische Variante, aber da erschien nur die Box und alles andere konnte ich nicht erreichen, da fehlte irgendwie die Zuordnujng zueinander.
Warum bekomme ich nur das Eigenschaftenfenster nicht auf??
Ich dachte ich kann es deshalb mit drei Subs ereichen eine die die Box erstellt über VBA Code, eine die sie Füllt und eine die mit Change die Aktion dann ausführt.

Gruß Emil

Damit sie sich ein Bild von der Eröffnung machen können
http://lime-videos.de/pict/rechnungssheet.jpg
Mitglied: 76109
76109 Mar 28, 2011 at 21:50:20 (UTC)
Goto Top
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.
    With Sheets("Lager")  
        Sheets("Formular").ComboBoxX.ListFillRange = .Name & "!C2:C" & .Cells(.Rows.Count, "C").End(xlUp).Row  
    End With
ComboBox-Name anpassen

Gruß Dieter

PS. Und nicht vergessen, den Code (Worksheet_Change) im Tabellenblatt 'Lager' wieder zu entfernenface-wink
Member: Lime43
Lime43 Mar 29, 2011 at 07:25:45 (UTC)
Goto Top
Guten Morgen didi1954

Bin nun ein schönes Stück weiter gekommen, habe jetzt aber beide Initialisierungen drinne. Einmal direkt nach dem Laden der restlichen Sheets, kann man als Grundinitialisierung sehen und dann noch auf dem Sheet Lager, was in deinem vorherigen Post von dir beschrieben wurde, und das letztere probierte ich ja schon gestern aus, was man als Aktualisierung nach Änderung im Lager ansehen kann. Scheint sich nicht zu beißen.
Nur der Effekt ist immer noch da, das in der Box, wohl die Anzahl der Lagerbestände ist und wenn ich eine Zeile dieses DropDowns anklicke auch der Eintrag richtig im Sheet Formular erscheint, jedoch und das war auch gestern schon
in der Dropdownliste die Anredebezeichnung der Liste Adressen erscheint, aber nur die ersten 85, also so lange wie die Liste Lager ist. Adressliste ist über 1500. Bin ganz schön verwirrt, wie das nun zustande kommt.. Zudem holt er auch nicht die 85 sondern nur 84. Hat aber im ersten Feld ein Leerfeld und wenn ich das anklicke kommt die Überschrift in den jeweiligen Ausgabefeldern. Anscheinend darf ich nicht mit C2 anfangen sondern muß C1 nehme.
Das werde ich gleich, wenn ich wieder Zeit habe, probieren, liegt evtl daran das er mit = anfängt zu zählen. Nur das er nicht die Artikelnummer nimmt aus dem sheet sondern auf das Adresssheet übergreift und da die Daten der Fam Spalte einliest, schon sonderbar.
Nun bin ich aber schon ein gutes Stück weiter.
Es fällt mir gerade ein und das habe ich noch nicht gesagt, das gesammte Sheet wird abhängig von Zuständen indiviiduell, was die einzelnen Zellenformeln betrifft, jeweils neu programmiert. Also ob Brutto oder Nettorechnung, ob mit oder ohne Rabatt usw. Das war eine Heidenarbeit, sich in das fertige, z.T fehlerhaft rechnende Programm ein zu arbeiten und noch zu ergänzen und da habe ich noch viel vor mir. Aber das alles zu einem viel späteren Zeitpunkt. macht aber schon Spaß, sich noch im höheren Alter und nach über 15 Jahren wieder an Programmierung ran z u gehen.

Vielen Dank für die bisherige Hilfe

Emil
Mitglied: 76109
76109 Mar 29, 2011 at 08:30:17 (UTC)
Goto Top
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 kannface-wink

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
Member: Lime43
Lime43 Mar 29, 2011 at 11:23:15 (UTC)
Goto Top
Hi didi1954, nun wirds noch geheimbnisvoller
Aber erst mal ein Bild mit geladenen Restsheets und das eine Comboboxfenster aufgeklappt. Über dem darüberliegenden Rollmenufeld sieht man den Return von der Box hier die 1
doch in dem Blauen Feld was ich angeklickt hatte steht nichts. danach, also ab Zeile 2 sind die Angaben aus dem Adresssheet. Ja und das angeklickte nichts erscheint richtig im links liegenden
Formularteil. Hatte ja nur an 3 Stellen was eingefügt was mit der ComboBox2 zu tun hatte, also an VBA Code. Auf dem Lagerblatt die initialisierung und auch an der Stelle nach der die Datenbanken geladen waren.
zudem noch im Formularsheet den Ausgeabeteil also die Sub ComboBos2_Change.

http://lime-videos.de/pict/rechnungssheet-2.jpg

Dies war noch der Zustand in dem ich dieses Bild gemacht hate.
Nun habe ich, wie angesagt den Initialisierungsteil aus dem Lagerblatt entfernt und es erscheint nun nichts mehr, die Box bleibt leer, trotz der noch verbleibenden Initialisierung nach dem laden der Restsheets.
Auch habe ich versucht , die Eigenschafte ohne die geladenen Teile an zu sehen, da bekomme ich einen Leere Box und mit den geladene im Bearbeitungsmode die Box wohl gefüllt, aber ohne einen Eintrag
bei ListFillRange, obwohl ja was drinne war, wenn auch falsch.

http://lime-videos.de/pict/rechnungssheet-3.jpg - http://lime-videos.de/pict/rechnungssheet-4.jpg - http://lime-videos.de/pict/rechnungssheet-5.jpg
Zur Ansicht noch diese Teile als Bilder, 3.= das Formular Change auf dem Sheet Formular, macht ja eigentlich das was erwartet wird hat nur falsche Voraussetzungen
4. die Eigenschaften von ComboBox2 nach dem Laden aller Sheets, das war gestern.
5. Dieser Teil im unteren Bereich initialisiert anscheinend gar nichts, habe dabei den Teil aus dem Lagerblatt entfernt.

also das alles wird für mich nun noch undurchsichtiger, habe allerdings auch die größten Probleme mit den EIgenschaften denn in einem Zustand werden sie angezeigt
und in einem anderen nicht , ja und ohne die nachgeladenen Sheets isses komplett leer.

Das war alles ein Grund warum ich wollte, das die Box überhaupt erst mit VBA Code erzeugt wird, wenn sie gebraucht wird, da kann man ja auch alle Eigenschaften mitgeben
Nur ich komme mit dem was ich bis jetzt in dieser Richtung las überhaupt nciht zurecht, muß ja dann auch dynamisch dem Project mitgeteilt werden, usw. Ich selbst hatte es nur
geschafft, das ich so eine erstellte Box per VBA an eine Stelle erscheinen lassen konnte, aber die Einbindung, das Initialisieren wie diese Change aktion, bekam ich nicht hin.
Wollte so ein Beispiel zum Laufen bringen, damit ich im Weiteren Ausbau, Varioboxeb geberuereb kann, wenn ich sie bei bestimmten Zuständen brauche, jeweils auf dem eigentlichen
Rechnungsblatt. z.B wenn ein Monatsabschluß fällig ist, oder der Jahresabschluß usw.

Hoffe ich langweile niemanden mit meinen Ausführungen, weiß nicht, wie ich es anders erklären könnte.

Gruß Emil
Mitglied: 76109
76109 Mar 29, 2011 at 13:58:32 (UTC)
Goto Top
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:
Private Sub Workbook_Open()
    '....  
End Sub
Wenn ja, dann füge diese Codezeile in die Routine mit ein:
    Call CleanUp
und darunter irgendwo diesen Code, der Die ComboBoxen 1+2 beim Start entleert:
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
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.
Member: Lime43
Lime43 Mar 29, 2011 at 18:32:36 (UTC)
Goto Top
Hallo didi1954
Es geht,
Es geht,
Es geht, die Stelle war wirklich falsch, ich war der Meinung hier wird der Ladetext ausgegeben, also muß danach der Init rein. Dem war nicht so und dieses DL-Scroll selbst rief sofort offne() auf und siehe da, da wurden die fehlenden Sheets dann eingebunden.
Das klappt nun gut und er bekommt auch die Nummern, doch frage ich mich, woher er die aus dem anderen Sheet bekam, das gar nicht angesprochen wurde. Ist mir immer unheimlich gewesen, wenn man nicht wußte was genau
passiert und das ist so auch mit so einer Blackbox wie combobox. War auch mit ein Grund warum ich vor 15 Jahren nach meiner Clipperzeit aufhörte zu programmieren. Da konnte ich wenigstens in C noxh was machen und für Spezialfälle sogar im Assembler, bin halt noch aus der Zeit, wo man die Bits in Form von Diodenmatrix lötete, dann später Lochkarten und Lochstreifen, Ja und die Funktionen mußte man selbst noch programmieren, aber da wußte man wenigstens was die genau machten. Deshalb auch meine penetrante Frage nach dem Erstellen einer Combobox über VBA, denn dann kann man auch die Eigenschaften selbst setzen und Programmcode mäßig schnell ändern.
Aber jetzt zu dem Laufenden, Die Ausgabe oder auch EIngabe in der Box, kann man da auch die Schriftgröße ändern und, programmtechnisch, wenn man alles durchgeführt hat im Change() auch das reine Sichtfenster, also das zugeklappte einzeilige Fenster leeren, denn da bleibt nun der gewählte Inhalt erhalten und muß also erst markiert werden um zu überschreiben.

Und nun zu den anderen Vorgaben, ich habe dieses Call CleanUp mit eingesetzt und Folgendes erhalten: http://lime-videos.de/Excel-VBA/rechnungssheet-6.jpg ,nach entfernen ging alles wieder.

Anbei noch einen Code, den ich testete wegen der Combobox bei Laufzeit in Abhänigkeit erzeugen, die erste Sub ging und man sah die Box, aber alles andere war nichts, wußte auch nicht, wo und wie ich es unterbringen und dem System beibringen sollte : http://lime-videos.de/Excel-VBA/VBA-makeArtComb.rtf

Danke für die Geduld und umfassende Hilfe
Mitglied: 76109
76109 Mar 29, 2011 at 23:02:26 (UTC)
Goto Top
Hallo Lime43!

Freut mich, dass es nun zumindest teilweise funktioniertface-wink

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 Fragenface-wink

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
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
Member: Lime43
Lime43 Mar 30, 2011 at 04:39:14 (UTC)
Goto Top
Guten Morgen didi1954
Danke, werde es aber heute erst gegen Abend weitertesten können, da ich heute außer Haus bin.
Eines kapiere ich nicht, warum im Workbook open mit Call der Aufruf stattfindet, und sonst nur mit dem Sub Namen. Ja es könnte sein, das zu diesem Zeitpunkt zumindest ja ComboBox2 noch nciht esxistiert, da ja das sheet da noch nicht geladen ist. Bei der ComboBox1 weiß ich es noch nicht genau, denn diese wird über den Button Briefkopf auf dem Grundseet Formular erst eingebracht. Da wird DL_Briefkopf als Formular eingeblendet und da steuert dann das Sub Briefkopf alles Weitere. Diese Teile sind aber sicher schon nach Starten vorhanden, da ja nicht extra nachgeladen wird wie bei Lager.

Das nun auf die Schnelle, muß gleich los, melde mich sicher Abends wieder, wenn ich einiges testen konnte.

Gruß Emil
Mitglied: 76109
76109 Mar 30, 2011 at 08:33:29 (UTC)
Goto Top
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?
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
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.

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
Member: Lime43
Lime43 Mar 30, 2011 at 09:14:36 (UTC)
Goto Top
Hallo didi1954
Bin gerade über Mittag mal am reinsehen.Nun verstehe ich überhaupt nichts mehr, aber trotzdem geht nun die Combobox. Sie ist zu sehen aber reagiert überhaupt erst nach dem Freigeben, also dem Laden der restlichen 4 sheets. Und das mit dem Call in dieser Arbeitsmappe, hier ein Beispiel welches im Original so ist:
'*
Private Sub Workbook_Open()

fnen 'hier werden wenn nicht vorhanden Pfade gesetzt und datensheets eingebunden

End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
'ThisWorkbook.Activate
If Not ThisWorkbook.Saved Then ThisWorkbook.Saved = True
Out
Application.Caption = Empty
Application.DisplayAlerts = False
Application.CommandBars("Standard").Controls(3).Enabled = True
Application.CommandBars("EuEx´s Menü").Delete
Application.CommandBars("Nummer").Delete
Application.ScreenUpdating = True
If ThisWorkbook.Saved = False Then ThisWorkbook.Saved = True
'Application.Quit
End Sub

Private Sub Workbook_WindowActivate(ByVal Wn As Window)
Application.CommandBars("Standard").Controls(3).Enabled = False
Menu
End Sub

Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)
Dim i As Byte, meinSteuerelement As Object

On Error GoTo raus
For i = 1 To 12
Set meinSteuerelement = Application.CommandBars("EuEx´s Menü").Controls(i)
With meinSteuerelement
.Enabled = False
.
.
'
*

da wird fnen aufgerufen als erstes ohne ein Call, das habe ich in dem, was ich bisher meinte verstanden zu haben, noch nicht anders gefunden.
Das fnen liegt wiederum nicht in "dieser Arbeitsmappe" sondern unter Module in diesem Fall " Vorlage3_40"
Deshalb meine Frage, da wurde nichts, also keine Sub, mit Call aufgerufen.

Zum Anderen, die Combobox ist doch ohne den Rollup oder Pulldown Pfeil erstaml das einzeilige Eingabefenster leer. Wenn ich da drinne anklicke
kann ich was eingeben und es wird versucht, anhand der Inhalte es zu ergänzen, wird bei mir blau, also ohne das gesamte Feld oder 10 Zeilen auf zu rollen.
Die .._Change Routine trägt dann ein, aber danach kann ich nicht erneut was eingeben, ohne erst alles in dem Eingabefeld zu markieren und dann zu überschreiben,
oder halt mit Pfeil Down das Feld aufrollen und dann eines Auswählen.
Kann ich erreichen, das nach dem Verarbeiten, also nach der Durchführung, ich wieder in den Anfangszustand komme, denn er ist auch nicht gegeben wenn ich das
mit dem .ListIndex = -1 mache. Oder muß ich da jeweils danach neu initialisieren.Ich weiß nicht, wie ich mich hier verständlciher ausdrücken kann?

wünsche noch einen schönen Nachmittag, bin dann mal wieder weg.

Noch schnell eine Bemerkung, sieht nicht dieser erste Teil deines obigen, also letzten Posts nach virtuellem Einfügen einer Combobox aus face-wink)
Grüße Emil
Mitglied: 76109
76109 Mar 30, 2011 at 12:04:13 (UTC)
Goto Top
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 springtface-wink

Aja, jetzt habe ich's verstanden, nachdem Du erwähnt hast, das die Vorlage auch erst geladen wirdface-smile

Dann funktioniert das über Workbook_Open natürlich nicht und den ganzen CleanUp-Teil kannst Du ganz vergessenface-wink

Das Auswahlfeld löschen so:
Private Sub ComboBox1_Change()
    If ComboBox1.Text = "" Then Exit Sub  
    
   'Dein Code  
    
    ComboBox1.ListIndex = -1
End Sub
Wobei die Codezeile 2 verhindert, das Dein Code nochmal ausgeführt wird, wenn der Inhalt gelöscht wird.

Noch schnell eine Bemerkung, sieht nicht dieser erste Teil deines obigen, also letzten Posts nach virtuellem Einfügen einer Combobox ausface-wink
Das Ganze dann in etwa soface-wink
Sub 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
Bitte mit Beispieleface-wink
Member: Lime43
Lime43 Mar 30, 2011 at 19:39:46 (UTC)
Goto Top
Hallo didi1954
Anbei einen Teil einer Rechnung zur Betrachtung, wie sie ausgedruckt wird und noch mal den kompletten Code mit dem Einschreiben
in das reine Rechnungsteil des Formulares, welcher dann später auch ausgedruckt wird.
http://lime-videos.de/Excel-VBA/VBA-ComboBox2_Change.rtf - http://lime-videos.de/Excel-VBA/Teil_einer%20_Rechnung.jpg

Es geht hierbei um langen Artikeltext, bei dem Kommas Trenner sind oder auch die Länge um in neue Zeilen zu schreiben im
Rechnungsblatt. Wie gesagt, das ist nicht von mir, habe ja dieses Programm gekauft, weil das außenrum stimmte, bis auf einige
Rechenfehler, die schon beseitigt sind und nun bin ich am Zusätzen dran, daß das Programm mindestens das macht, was ich
vor 15 Jahren mit meinem Clipperprogramm machte. Mache das ja für einen Freund, Winzer und Gastwirt, der es nun benötigt,
da ja Clipper, als reines Dosprogramm auf neuen Rechnern nicht mehr läuft.

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

habe ich aber noch nicht ausprobiert, bin momentan ziemlich geschafft, aber Morgen gebe ich mich dran

Danke für all das Bemühen

Gruß Emil
Mitglied: 76109
76109 Mar 30, 2011 at 20:36:39 (UTC)
Goto Top
Hallo Lime43!

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 kannface-wink

Den Rest schaue ich mir erst noch an.

Gruß Dieter
Member: Lime43
Lime43 Mar 31, 2011 at 08:42:23 (UTC)
Goto Top
Guten Tag didi1954

Habe nochmal die entscheidende Changeroutine eingestgellt, so erweitert und noch ein Bild der Projektübersicht

http://lime-videos.de/Excel-VBA/VBA-ComboBox2_Change-2.rtf - http://lime-videos.de/Excel-VBA/Projekt_aufgeklappt.jpg

In dem neuen Zustand machte die Box nicht mal mehr das was sie ohne dem macht. Beim allerersten Start ist das Boxfenster selbst leer und ich kann eingeben, noch in der nicht erweiterten Version.
Will ich also einen vorhanden Artikel, z.B 8888 eingeben so verfollständigt sich in der Zeile z.B 803, wobei die 03 blau hinterlegt ist, gebe ich nun die nächste 8 ein so erscheint z.b 8850 weil dies die nächste wäre und die 50 ist blau hinterlegt. Nehme ich nun die nächste, also 3te 8 so kommt evtl 8885 wenn es die gibt und in meinem falle gleich die 8888. nun ein Klick in die Zeile wo alles erscheinen soll im reinen Rechnungsblatt/Druckausgabe, und ich habe die Eingabe abgeschlossen. Noch zu erwähnen ist, das bei jedem autovervollständigen die Werte des sog. Vorschlages schon in der anfangs markierten Ausgabezeile erscheinen und bei weiterer Eingabe überschrieben werden, was ich dann abschließe mit klick auf die Ausgabezeile. Nun bei Eingabe eines neuen Artikels, geht es nur wenn ich im Boxfenster, hier in dem Falle die 8888 komplett markiere, wird blau hinterlegt und ich kann somit wie gewohnt wieder eingeben, sonst geht das nicht und nur über das Rollfenster würde es gehen eine Zeile von da aus zu wählen, was ich aber nicht vor habe, das bei ber 200 Artikel oder so richtiges Suchen/scrollen von Nöten und sehr umständlich wäre.

Und nun mit dem EInbaui von index = -1 wird es noch doller, da erscheint bei der Eingabe von der ersten 8 z.B 85 weil es dies gibt, aber ich kann nicht weiter eingeben und es ist in der Rechnung dann fest. da läuft irgend etwas ganz anders, als ohne diese Zusätze. Kann es nicht besser erklären ohne paar Seiten Roman zu schreiben.

Gibt es eine andere Funktion. welche auch mit meinen Rechn,nungsnummern geladen wird, ohne diese Aufklappmöglichkein, also irgend eine Funktion, in der ich z.B die 8888 eingebe, diese bei der EIngabe evtl vervollständigt wird, oder auch nicht und ich zur Weiterverarbeitung dann die Position von der anderen Tabelle geliefert bekomme.?
Sollte halt so sein, ein Fenster, ich gebe die Zahl ein und mit Return oder klick auf die Ausgabezeile wird mir in der anstehenden Routine die Zeile geliefert und ich bereite die Ausgabe vor wie in der ...Change Funktion??

viele Grüße Emil
Mitglied: 76109
76109 Mar 31, 2011 at 11:51:23 (UTC)
Goto Top
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 nichtface-wink

Gruß Dieter
Member: Lime43
Lime43 Mar 31, 2011 at 12:45:50 (UTC)
Goto Top
Hallo didi1954

genau sowas habe ich mir nun schon überlegt und dachte nun, gehe ich einfach über Textboxen. Na ja einfach weiß ich noch nicht, aber meine Überlegung ist folgendermaßen.
In meinem Formular = Tabelle 3 sind auf B22 bis B44 die möglichen Artikelnummern ein zu tragen. Wenn ich nun über jeder Zelle eine Textbox lege, also max. 22 Boxen und da dann in der entsprechenden eine Eingabe mache,
übergibt die doch den eingegeben Wert als Text. an die zugehörende TextBoxX_Change(). Da kann dann doch in diesen mit der Nummer eine Funktion aufgerufen werden, welche im sheet Lager sich die Nummer sucht und die passenden Werte dann gleich richtig im Blatt Formular einträgt, So wie ich es in der ComboBox ja gelöst hatte und bei Nichtvorhanden einen Message "Artikel nicht gefunden" ausgibt. Der Return von der Funktion würde dann noch die Changeaktivität wieder zurücksetzen. Wenn ich dann, müßte doch sogar gehen, die Textboxen nicht sichtbar zu setzten, oder nehmen die dann die EIngabe nciht an???

Na ja, zur Not geht das ja mit der ComboBox ist nur für meine Begriffe umständlcih, vor allem weil sie ja für jeden Artikel benutzt werden muß und nicht nur sporadisch benötigt wird.
Dann werde ich mal mit den Textboxen ecxperementieren, hoffendlich finde ich was, das ich dann auch verstehe. Reine Tabellenkalkulation und das normale Basic ist ja bei mir eigentlch kein Problem aber all das was mit dem visual eingeführt wurde, da hängt es, deshalb hörte ich ja nach C, als ich VisualBasic 5 gekauft hatte auf. Das Buch habe ich sogar noch.

Erstmals vielen Dank für all deine Mühen,ich werde mich sicher später, wenn ich wieder voll auf laufe, melden. Aber eines ist ja nun gut, es läuft wenigstens.und macht5 schon was es soll.

Grüße
Emil
Mitglied: 76109
76109 Mar 31, 2011 at 16:44:33 (UTC)
Goto Top
Hallo Lime!

Glaub ich habe da ne viel bessere Ideeface-wink

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 soface-wink
Member: Lime43
Lime43 Mar 31, 2011 at 17:55:57 (UTC)
Goto Top
Hallo didi1954

http://lime-videos.de/Excel-VBA/rechnungssheet-7.jpg

Hier hakt es bei mir schon und zwar bei Combobox zulassen, das finde ich nicht in der Liste die da aufgeht. Siehe Bild. Ich ahne schon was und kann hier nur der Einfachheit halber sagen, ich bräuchte nur die Variante mit Eingabe der ArtikelNr. denn die wird zu 99,99% von den Bestellern, aufgrund der Internetbestellung, also dem dortigen Formular fest vorgegeben. Ich habe das alles mit der letzten Version, die mit funktionierender ComboBox durchgeführt.
In der Lagerliste habe ich ab C2 bis C85 markiert, denn auf C1 steht ja Art.Nummer, die gesamte relevante Line 1 ist Text.

Ja mehr kann ich momentan nichts zu sagen

viele Grüße
Emil
Mitglied: 76109
76109 Mar 31, 2011 at 18:20:58 (UTC)
Goto Top
Hallo Lime!

Mit Liste ist der Eintrag 'Liste' auswählen gemeint (4. Eintrag)face-wink

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
Member: Lime43
Lime43 Mar 31, 2011 at 18:47:42 (UTC)
Goto Top
Hallo didi1954

Ich hänge doch schon Nach dem Reiter Einstellungen fest, da habe ich ja auch den Screenshoot gemacht, bin da auf die Einstellungen genangen und das wars dann. Da auf Zulassen und da ist nichts mit
Combobox zulassen. Da häünge ich fest und hab keine Richtung mehr
Combobox Zulassen:Liste auswählen ist doch gar keine Möglichkeit an dem Punkt wo ich angelangt war. siehe letzes Bild, oder ich verstehe einiges ganz falsch.

Gruß Emilo
Mitglied: 76109
76109 Mar 31, 2011 at 18:50:28 (UTC)
Goto Top
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
Member: Lime43
Lime43 Mar 31, 2011 at 19:10:46 (UTC)
Goto Top
Hallo didi1954
habe im Fenster Combobox zulassen gesucht und nicht begriffen das damit die Combobox gemeint war, habe die auch nicht so erkannt.
Nun bin ich bei der Combobox Typ, hab da das Symbol Warnung genommen.

Das sieht jetzt erstmals sehr gut aus ich kann die Nummer eingeben und mit return geht alles eine Zeile tiefer.
Wie ich sehe hat er auch die Nummern der Artikelspalte alle drinne aber ich kann sonst was reinschreiben, auch Nummern die es nicht gibt
auch Text, oder kommt dieses noch, wie auch die zusätzliche Ausgabe der restlichen benötigten Werte. Aber ist vielversprechend diese Art.
Wird dann aber auch sicher kompliziert bei den 2zeiligen Texten der Artikel um eines weiter zu schalten.

Ich denke, das wurde auch alles so von dir erwartet face-wink
Gruß Emil
Mitglied: 76109
76109 Mar 31, 2011 at 20:00:06 (UTC)
Goto Top
Hallo Lime!

Na, war vermutlich doch schlecht bzw verwirrend erklärtface-smile

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 bisschenface-wink

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? face-wink

Gruß Dieter
Member: Lime43
Lime43 Mar 31, 2011 at 20:19:36 (UTC)
Goto Top
Sage mal schnell gute Nacht, denn für mich wird es Zeit.
Bis jetzt war aber noch keine Fehlermeldung eingebaut, denn ich konnte Nr. eingeben die nicht im Lager vorhanden waren, sowie auch text, alle Eingaben wurden genommen. Denke aber das dies noch nciht behandelt wurde.
Wo sehe ich eigentlich diese Einstellungen, im kompletten Codeteil ist nichts zu finden. ist das nur Tabellenintern zu suchen. Bin mal gespannt, wie das klappen soll, da ja normalerweise die relevanten Teile nachgeladen werden. Ich kann ja so wie es jetzt ist nicht abspeichern, weil er da ja alles zusammen in eine XLS packt und die 4 Datenbanken, wenn ich die nach dem Sichern lösche und dann speichern meckert er beim Laden, das bezuüge fehlen und das kann
ich nciht abstellen, obwohl er ansonsten richtig arbeitet mit dem Nachladen. Habe ich aber alles zusammen aus versehen gespeichert, mosert er das er die zusätzlichen Sheets naich laden kann, weil schon welche existieren.
Bis jetzt machte ich die Änderungen immer ohne die 4 Sheets und speicherte auch immer als .xlt, nur die 4 quasi Datensheets wurden nach Freigabe vom Programm aus extra weggespeichert.

Bliocke da auch noch nicht so ganz durch, wieso und warum, bis auf den Punkt, das ich die quasi Datenbanekn ohne alles bearbeiten kann, also erweitern und diese ja mit Jahreszehner abgespeichert werden. Und auch das eigentliche Sheet dadurch nicht ganz so groß ist beim Sichern.

So das wars für mich heute.
Gute Nacht
Mitglied: 76109
76109 Mar 31, 2011 at 20:33:38 (UTC)
Goto Top
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 Nachtface-wink

Gruß Dieter
Mitglied: 76109
76109 Mar 31, 2011 at 22:22:03 (UTC)
Goto Top
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 Schrittface-wink

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
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:
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 testenface-wink

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]
Member: Lime43
Lime43 Apr 01, 2011 at 05:04:29 (UTC)
Goto Top
Hallo didi1954

Guten Morgen, da haste dir ja viel Arbeit gemacht, meinetwege und ich hänge schon wieder am ersten Punkt fest. Ich versuchte unter Module ein neues ein zu richten und der gibt mir nur Modul1 vor und ich finde nirgend die Möglichkeit dieses um zu benennen. Das sind all die Dinge dich ich nicht kenne und auch noch nicht gelesen habe, doch wo sollte ich da anfangen. Wenn ich so den reinen Ausfühurngscode lese, dann verstehe ich meißt den Inhalt und das warum, naja nur halt diese Blackboxes nicht.

Oder meinst du mit Modul einfach das Einkopieren enes neuen Subs, doch da habe ich gleich dieFrage, wo es besser untergebracht wird unter Microsoft Excel Objekte und da in "diese Arbeitsmappe", wo ja die Teile des Starts und des Beendens liegen oder besser unter Module und da in das Modul "Vorlage3_40". Eine Übersicht darüber hatte ich ja als Bildlink gestern gepostet.

Nun und die Combo2 ... werfge ich nicht weg, bin ja froh, das ich das einigermaßen verstanden habe, dank deiner Hilfe, da kann ich dann immer mal nachsehen, also wie eine Private Bibliothek. Ich setze halt da wieder auf, wo ich vor meiner Anfrage hier war.

Vielen Dank

Emil
Mitglied: 76109
76109 Apr 01, 2011 at 06:55:24 (UTC)
Goto Top
Guten Morgen Lime43!

Was, Du hängst schon wiederface-smile

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
Member: Lime43
Lime43 Apr 01, 2011 at 07:33:41 (UTC)
Goto Top
Hallo didi1954
Das Modul1 steht unter Module und da ist auch das ganze InitFormularValidation() nun drinne. Auch im lager habe ich den Teil, wie geheißen einkopiert, brachte dann auch einen Fehler, das die Variable nicht bekannt sei, ist aber klar, die ist ja auch im Formular definiert. Aber es zeigt sich nichts im Formular sheet. Und ich finde keinen Punkt, wo ich das Modul umbenennen kann.
+
Bevor ich gleich weg muß, noch zur Vervollständigung des ganzen Objektes noch ein Bild welches zu sehen ist, wenn die 4 zusatzsheets geladen sind und ich über den Button Briefkopf mit dem Schreiben der Rechnung beginne, denn dies ist der erste Arbeitspunkt um die Adresse ein zu geben. Und das klappt gut, da brauchte ich nichts dran ändern, aber eines Fehlte ja dier Kundenrabatt. den hatte ich noch integriert.
+
Und nun bin ich bis Mittag mal wieder außer Haus.

Gruß Emil
Mitglied: 76109
76109 Apr 01, 2011 at 08:30:32 (UTC)
Goto Top
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)
With Sheets("Lager")  
    Sheets("Formular").ComboBoxX.ListFillRange = .Name & "!C2:C" & .Cells(.Rows.Count, "C").End(xlUp).Row  
End With
das soll jetzt durch das hier ersetzt werden:
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? face-wink
Member: Lime43
Lime43 Apr 01, 2011 at 09:53:26 (UTC)
Goto Top
Hallo didi1954
Ganz kurz bevor ich weg bin und du dir unnötige Arbeit machst, das Programm läßt bis zu 10 Seiten zu, aber die werden nicht benötigt und abgeklemmt, kam nur, weil ich auf meine geänderte Version 7 zurück bin. sonst blende ich es auch aus und habe, soweit gefunden, schon alles gelöscht, nur noch nicht dieses Sheets. Ist auch nur ein Muster für die anderen.
Aber was anderes sehe dir die Bilder an, das habe ich an den Stellen drinne und noch der Code an dem dann am Ende nach dem Laden die init aufgerufen wird.
http://lime-videos.de/Excel-VBA/rechnungssheet-10.jpg - http://lime-videos.de/Excel-VBA/rechnungssheet-11.jpg - http://lime-videos.de/Excel-VBA/VBA-offne.rtf
im ersten Bild ist da public const Bestellung gemeint, mein Screencopy, oder der Editor ließ das unterlegen weg nach dem Aufruf

Ja und umbenennen konnte ich Modul 1 immer noch nicht komme da nicht ran .

Bin nun wieder weg

Gruß Emil
Mitglied: 76109
76109 Apr 01, 2011 at 10:29:33 (UTC)
Goto Top
Hallo Lime43!

Dieser Code
Public Const BestellRange As String = "B22:B44"  
geht bei Deiner VB-Version wohl nicht, von daher ändern auf
Public Const BestellRange = "B22:B44"  

Jepp, der Aufruf der Sub 'InitFormularValidation' steht an der richtigen Stelleface-wink

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 Geschmackssacheface-wink

Gruß Dieter

P.S. Habe im letzten Code im zweiten Teil (Worksheet_Change) noch Änderungen eingefügt
Member: Lime43
Lime43 Apr 01, 2011 at 13:00:05 (UTC)
Goto Top
Hallo didi1954
Wäre es nicht besser für dieses jetzt einen neuen Thread zu machen, stimmt ja nicht mehr mit den Thema überein.

Bin grad mal hier vorbeigekommen und mußte es noch schnell aus probieren. Aber was war, das was ich vorhin noch in Abrede gestellt habe ging und schaltete sogar sauber die 2 Zeilen weiter usw.
Nur 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.
Aber anscheinend ist es ja egal, wenn es auch weiterhin Modul1 heißt?? geht ja.
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..

Na ja und zum Programm selbst, ich habe mir einige angesehen und auch gekauft um mich in die Programmierung ein zu arbeiten und schon was Lauffähiges zu haben. Auch reine Teile auf Tabellenkalkulation, kannte es ja gar nicht das man mit mehreren Sheets gleichzeitig arbeiten konnte, da kam ich erst mal drauf als ich so einen Autoabrechnung/Kalkulation fand. Hat mich interessiert und dann kam das mit meinem Freund, bei dem sein alter PC den Geist aufgab und das Clipperprogramm nicht mehr auf dem neuen Rechner arbeitete. Denke das Programm selbst ist auch schon einige Jahre alt, ich habe zuerst eine 1monatige Testversion gehabt, die sich dann verabschiedete. Na ja war zudem mit Paßwort geschützt, wie diese hier auch, aber das habe ich ja nun, obwohl es auch lästig ist zum erweitern, weil ich jedesmal wenn ich rein sehen will, das Paßwort eingeben muß, ansonsten ist es schon sinnreich, das der reine Anwender nicht im Code rumfummeln kann und das Rechenblatt selbst wird ja zur Laufzeit je nach spezieller Aktion mit den Formeln dementsprechend geladen.

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.

Grüße Emil, bin dann mal wieder kurz weg
Mitglied: 76109
76109 Apr 01, 2011 at 14:15:54 (UTC)
Goto Top
Hallo Lime43!

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 Spurface-wink 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.

Nur 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...

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 Ideeface-wink Eine Email-Adresse findest Du in Deinem Postfach

Gruß 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

Dann solltest Du ohne Kennwort reinkommen und wie das setzen eines neues KennwortesPasswortes geht, sollte Dir dann auch klar seinface-wink
Member: Lime43
Lime43 Apr 01, 2011 at 16:15:58 (UTC)
Goto Top
Hallo didi1954
ich gebe es auf denn ich habe überall probiert den Modulnamen zu ändern, bei den anderen geht es aber bei Modul1 ist keine Möglichkeit, oder auch besser ich finde keine den wenn ich auf EIgenschafte gehe kommt bei einigen Stellen plötzlich der Codeteil, aber was soll es auch, es läuft ja nun bestens. Wüßte dann auch wiederum nicht, ob es noch da wäre, wenn das alles getrennt gespeichert wird, was ich ja gar nicht könnte wenn alles aktiv ist.

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ß.

Gruß emil
Mitglied: 76109
76109 Apr 01, 2011 at 17:22:31 (UTC)
Goto Top
Hallo Lime43"

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ätigenface-wink

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
Member: Lime43
Lime43 Apr 01, 2011 at 18:03:40 (UTC)
Goto Top
Hi didi1954

Ich kann mich drehen und wenden, ich bekomme das nicht hin, ich finde da nichts, hab mal da ein Bildchen gemacht, da kannste ja sehen ob ich richtig bin und wenn ich da nun
auf den obersten Fenster auf Eigenschaften gehe, verschwindet nur das Fenster und das wars dann auch.
http://lime-videos.de/Excel-VBA/rechnungssheet-12.jpg

Gruß Emil
Mitglied: 76109
76109 Apr 01, 2011 at 18:30:58 (UTC)
Goto Top
Hallo Lime43!

Mhm, verstehe ich nicht? Gehe auf Menu>Extras>Optionen dann auf den Reiter 'Verankern" und häkchen in Eigenschaftsfenster und OK. Auch mal Menu>Fenster>Untereinander/Nebeneinander... ein wenig rumprobieren. Das Fenster muss ja irgendwo sein, so wie hier face-wink
cb8e23ab383ccf418692ca3d40cb9e2d

Gruß Dieter
Member: Lime43
Lime43 Apr 01, 2011 at 19:11:57 (UTC)
Goto Top
Hi didi1954
So das war es jetzt, hattest wie immer recht, das verschobe Ding lag genau im Doppelrahmen, deshalb konnte man schauen wie man wollte, es viel nicht auf. Jau jetzt ist alles klar.
Mir fällt beim Testen gerade auf, das es toll wäre, wenn nach Eingabe der Artikelnummer in Spalte B nicht sofort in die nächste B-Position gesprungen wird sondern in die Spalte D
jeweils in der ersten Artikelzeile, denn die Anzahl ist sowieso ja die folgende Eingabe und so muß man momentan erst da markieren, eingeben und dann doch wieder nach vorne auf
B gehen. Würde die Abfolge um vieles flüssiger machen. Wenn dann noch bei der Anzahl Spalte D auch mit Return bestätigt würde, wäre es für den Kunden in der EIngabe noch am
Leichtesten. Denke aber , da muß sich viel gemerkt werden, auf erster Zeile nach D eines jeglichen Artikels und dann soviel tiefer wie der Artikel Zeilen benotigt. Ehrlich da bin ich
überfragt wegen der mehrfachen Return abfragen

Aber toll, habe gerade gesehen bin schon 4 Tage hier und es ist soviel erreicht worden. Danke, das war echt klasse.

Gruß Emil
Mitglied: 76109
76109 Apr 01, 2011 at 20:15:54 (UTC)
Goto Top
Hallo Lime43!

Na, hat's jetzt endlich doch noch geklapptface-wink

Dann ändere Codezeile 47 von
Cells(RowF + i, "B").Activate           'Nächste freie Zeile aktivieren   
nach
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 ansehenface-wink

Gruß Dieter
Member: Lime43
Lime43 Apr 01, 2011 at 20:27:53 (UTC)
Goto Top
Hallo Didi1954
Bin auch gleich weg, werde es morgen einsetzen. Da dies nach der Ausgabe der Artikelbeschreibung passiert, kommt da nicht nach einer 2Zeiligen die Anzahl eine Zeile zu tief?
sieht so aufs Erste für mich aus, aber wie gesagt, ich probiere es gleich Morgen Früh, bevor ich wieder außer Haus bin.

Vielen Dank, bist ja unermüdlich
Gute Nacht
Emil
Member: Lime43
Lime43 Apr 02, 2011 at 05:02:36 (UTC)
Goto Top
Und da bin ich schon wieder
Guten Morgen didi1954

Das klappt ja hervorragend und ich habe aber die alte Zeile danach stehen lassen, denn nach dem Eintragen der Anzahl, muß ja dahin auch aktiviert werden, doch
wie bringe ich dem bei, das er wartet auf die Eingabe der Stückzahl und dann erst das nächste nimmt, denn wenn ich beide stehen habe geht er ohne zu warten sofort auf
die zweite und wartet auf neue Artielnr, also aktiviert diese Celle. Im normalemBasic, so wie ich es noch kenne würde ich ein Input setzen???

Na dann , mal sehen ob ich es heute Morgen noch schaffe hier rein zu sehen.

Gruß Emil
Mitglied: 76109
76109 Apr 02, 2011 at 13:44:13 (UTC)
Goto Top
Hallo Lime43!

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
Member: Lime43
Lime43 Apr 02, 2011 at 17:33:40 (UTC)
Goto Top
Hallo didi1954
Top gelöst, nun läuft das genauso wie gewünscht und sehr vorteilhaft in der Bedienung.
War doch mein Gedanke mit der Combobox , sowas von abwägig und umständlich.
Bin mir 100 pro sicher, das mein Bekannter damit genausogut umgehen kann wie mit
meinem alten Clipperprogramm. Ist viel übersichtlicher, nun ja es geht alles weiter und
wird besser entwickelt.

Recht vielen Dank noch einmal für all deinen Mühen und Hilfen, die du mir angedeien ließest.
Hast ja alles alleine gelöst, da konnte ich nicht mal mehr was beisteuern.

Gruß Emil
Mitglied: 76109
76109 Apr 02, 2011 at 17:51:28 (UTC)
Goto Top
Hallo Lime43!

Jepp, gern geschehenface-wink

Und bitte nicht vergessen, den Beitrag auf gelöst zu setzen (grünes Häkchen). Danke!

Gruß Dieter
Member: Lime43
Lime43 Apr 02, 2011 at 18:12:22 (UTC)
Goto Top
Hallo didi1954

Ganz oben steht von Anfang an, das der Fall als gelöst gilt.

Gruß Emil