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

Helfer Gesucht für struktierten VBA Code

Helfer Gesucht für struktierten VBA Code
22.12.2019 06:21:58
Jürgen
Hallo zusammen,
ich Suche auf diesem Weg jemanden der sich „Opfert“ oder so Nett ist und meine Excel Mappe mit VBA „überarbeitet“ und das ganze so Umbaut wie man es eigentlich "richtig" machen sollte.
Im Grunde funktionieren die gewünschten Optionen.
- 3 ComboBoxen als Pflichtfelder
- Druck Button wenn alle Pflichtfelder erfüllt
- ComboBoxen zurücksetzen vor schließen der Datei
Aber „nur“ Funktionieren bedeuten für mich nicht gleich ein fertiges Projekt, zumal ich echte Schwierigkeiten habe den „Grundaufbau“ eines Tabellenblatt mit VBA nachvollziehen zu können.
Daher würde ich mich sehr freuen wenn sie jemand bereit Erklärt, das ganze in die richtige „Form“ zu bringen.
Ich weiß zwar das es keinen eigentlichen VBA Standardaufbau gibt aber es würde mir Helfen wenn ich eine
Vorlage hätte die ich in Zukunft als Grundlage nehmen kann.
- Also die Teile des Codes die aufs Tabellenblatt gehören verschieben/anpassen.
- Teile die in ein Modul oder ein Klasse gehören verschieben usw.
- Tabellenblatt so definieren das es in VBA mit Namen aufgerufen werden kann.
Im Moment greift die Pflichtfeld abfrage leider übergreifend auf zwei Blätter. Ich hätte es aber gerne getrennt bzw. für jedes Blatt einzeln. Aber ich raff den Aufbau einfach noch nicht so wirklich...
Später würde ich gerne auch noch die ComboBoxen Auswahl per angelegte Namensliste abhängig voneinander konfigurieren. Also ComboBox1 ausgewählt füllt die Auswahlliste von ComboBox2 usw. aber auch hier glaube ich dass ich das erst hinbekomme wenn ich den Aufbau verstehe oder in einer Vorlage sehe.
Den passenden Code habe ich, denke ich zumindest, schon dafür... nur eben kein Plan wohin.
Die Pflichtfeldabfrage sollte man so wie sie im Moment als Code existiert auch besser in eine Klasse packen (wurde mir zumindest geraten) aber auch da fehlt mir der Durchblick. Denn ohne das jeweilige Blatt mit Name aufrufen zu können oder die Klasse bzw. Funktion dann im Blatt aufrufen zu können wird das ja auch nichts.
Daher hoffe ich nun auf jemanden der mir da weiterhilft.
Datei gibts hier:
https://www.herber.de/bbs/user/133908.xlsm
Grüße und Danke

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Helfer Gesucht für struktierten VBA Code
23.12.2019 16:52:43
Matthias
MOin!
Kann den Code grad nur im OO öffnen. Damit kann ich aber nicht alles testen bzw. ändern.
Schaue die Tage mal drüber, wenn ich einen anderen Rechner habe. Falls die Woche rum ist und der Thread im Archiv ist, ggf. nochmal starten.
Vorab mal soweit:
In DieseArbeitsmappe die Prozeduren:
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Private Sub Workbook_BeforeClose(Cancel As Boolean)
in ein neues Modul
Function ValidateFormFields() As Boolean
Sub resetFormFields()
Der Rest dann in das Blatt, in welchem die Combos sind.
Extra Klassen brauchst du m.E. bei deinem Code nicht anlegen.
Ggf. müsstest du da am Code noch was ändern. Das müsste man sich aber mal im Excel anschauen.
VG
Anzeige
AW: Helfer Gesucht für struktierten VBA Code
23.12.2019 19:07:48
Jürgen
Hallo Matthias,
vielen Dank erstmal das du dich dafür bereit Erklärst bzw. so Hilfsbereit bist.
In DieseArbeitsmappe die Prozeduren:
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Werde ich mir mal für die Zukunft notieren.
in ein neues Modul
Function ValidateFormFields() As Boolean
Sub resetFormFields()
Hier zu hätte ich noch ne Frage.
Ist es beim Erstellen eines Modul egal was vorher an/ausgewählt wurde?
Also ob ich das gesamte Projekt auswähle? oder DieseArbeitsmappe? oder ein Tabellenblatt?
Ich meine nämlich irgendwo mal gelesen zu haben (welche Funktion weiß ich nicht mehr) dass ich das Blatt auswählen soll und dann Modul erstellen. Aber ich kann nach dem Erstellen keinen besonderen Bezug erkennen, also keine direkt Verbindung zu einem Blatt oder sonst was.

Der Rest dann in das Blatt, in welchem die Combos sind.
Extra Klassen brauchst du m.E. bei deinem Code nicht anlegen.
Ggf. müsstest du da am Code noch was ändern. Das müsste man sich aber mal im Excel anschauen.
VG
Bin mir fast sicher das an dem Code noch was geändert werden muss/sollte.
Gerade bei der Pflichtfeldabfrage der ComboBoxen bedarf es wohl "Verbesserung".
Egal wie groß die Mappe am Ende wird gibt es nur 2 Tabellenblätter mit den ComboBoxen und Abfragen,
daher wollte ich eigentlich die Blatter mit Namen "definieren" und "aufrufen" können.
Wenn ich wüßte wie :( ... und ich denke für den Code bzw. die Pflichtfeldabfrage ist dies wohl auch Sinnvoller als das bisherige "ThisWorksheet".
Außerdem möchte ich an dieser Stelle noch mal deutlich machen, dass es auch wenn es danach aussieht, was mir bewusst ist, es sich dabei um ein rein privates Projekt handelt.
Ich schreibe seit kurzem zwar auf der Arbeit Frachtbriefe allerdings ging es mir irgendwann auf die Nerven das ganze jedes Mal neu schreiben zu müssen.
Ein jeweiliges seperates Abspeichern ging mir irgendwann ebenfalls auf den Sack (wurde einfach zu unübersichtlich) so dass ich den kompletten Brief noch mal neu als Excel Blatt erstellt habe um mir eine Vorlage zu schaffen die mir das ganze erleichtert.
Und wie sich vielleicht einige Denken können ist es meinem Arbeitgeber egal wieviel mehr Arbeit es einem macht,wenn man jedesmal alles neu schreiben muss oder wieviel einfacher man es eigentlich haben könnte dank Excel ;-) ... Daher liegt es allein bei mir um wieviel einfacher es mir mache.
Nur brauche ich wohl erstmal eine visuelle Vorlage mit strukturierten Code "Grundaufbau" um mich in das Thema einarbeiten zu können.
Viele Grüße
und ein schönes besinnliches Weihnachtsfest.
Anzeige
AW: Helfer Gesucht für struktierten VBA Code
25.12.2019 11:29:44
Piet
Hallo Jürgen - und frohe Weihnachten
ich habe mir dein Beispiel auch mal angesehen und es in bescheidenem Masse ans laufen gebracht. Zum Klassenmodul sage ich: davon habe ich NULL Ahnung, benutze nur normale Module! Den Adressbereich für die ComboBoxen habe ich auf 5 Spalten verkleinert. Aufgefallen ist mir, das in den Eigenschafte die Spaltenbreite der ComboBoxen von Spalte 2-5 auf Null eingestellt sind. Die Breite kannst du selbst modifizieren. Unklar ist mir warum die Formel in der Zelle F8 nicht funktioniert?
Mein Code ist etwas einfacher geschrieben, vielleic"ht kannst du ihn leichter verstehen...
https://www.herber.de/bbs/user/133960.xlsm
mfg Piet
Anzeige
AW: Helfer Gesucht für struktierten VBA Code
25.12.2019 21:56:16
Jürgen
Hallo Piet,
Danke dir ebenfalls frohe Weihnachten.
Danke auch dafür das du dir die Datei angeschaut hast und deine Ideen gleich mit Einbaust.
Ist im übrigen mal ne ganz andere Variante....
Bezüglich der ComboBoxen und den Spalte 2-5 die auf Null eingestellt sind. Das hat den Grund das ich in der Auswahl nur die erste Spalte angezeigt haben möchte und der Weg dahin so auf https://www.tabellenexperte.de beschrieben wurde.
Ich weiß zwar gerade nicht welche Formel du genau bei F8 meinst aber dazu kann ich folgendes Sagen.
Für die Empfänger wollte ich mir einheitliche Titel anlegen die dann in der Auswahl der ComboBox erscheinen um auch dort nur eine Spalte zu haben ohne viel Text dahinter.
Leider kann man die Ausgabe oder besser die Bezugszelle der ComboBox in kombi. mit dem Namen aus dem anderen Tabellenblatt aus ersten Spalten "auslesen" lassen und ich bräuchte ja eigentlich nur den Firmennamen in Zelle B10. Zusätzlich klappte dann aber weder der svwerweiß noch der index in Zelle B11/B12 usw.
Daher ist die Ausgabe dieser ComboBox auf Zelle F8 gelegt und die Schriftfarbe auf Weiß eingestellt,
damit beim Drucken weder die ComboBox noch der Inahlt von F8 zu sehen ist ;-)
Bin allerdings auch mal Gespannt was Matthias aus meiner Ursprungsdatei "zaubert".
Viele Grüße
und schöne Festtage
Anzeige
AW: Helfer Gesucht für struktierten VBA Code
26.12.2019 08:50:06
Piet
Hallo Jürgen
konkret meine ich, beim aktivieren der ComboBox für Absender und Spedition sah ich sofort Namen, Adressen usw. Bei Zelle F8 stand als Ergebnis #NV oder #Wert. Warum nur dieser Block nicht klappt weiss ich nicht, mit Formeln kenne ich mich nicht aus. Warten wir mal das Ergebnis von Matthias ab. Fachlich ist er besser ..
mfg Piet
AW: Helfer Gesucht für struktierten VBA Code
26.12.2019 21:49:42
Matthias
Moin!
Hallo ihr zwei. Hier mal die Datei zurück:
https://www.herber.de/bbs/user/133977.xlsm
Ich habe da jetzt aber nur die Makros umgestaltet und die Zuordnung der Elemente verändert. Ein Hinweis dabei noch. Deine CBs zeigen im Code zwar CB2 bzw. CB3 an, heißen dabei aber anders. Die CB2 zeigt den TExt CB3 an und umgekehrt. Nur für deinen weiteren Code, falls du da was änderst. Ansonsten habe ich den CB jeweils ein ListfillRange spendiert. Das fehlte bei zweien. Zur Formel. Da war das Problem, dass die Fomel 3 Parameter braucht. Du hattest aber nur die Matrix und die Zeile drin. Die Spalte fehlte noch. Zudem hatte deine CB3 (also die die CB2 anzeigt) auf B8 verwiesen. In F8 stand ein anderer Wert (glaube ich zumindest), welcher nicht in der Liste vorkam. Habe ich geändert. Am Anfang zeigen die Formeln aber noch einen Fehler an, da ja nix ausgewertet wurde. Das könnte man mit eine Wennschleife oder IStFehler umgehen.
Nun zu den Änderungen im Makro. Das mit dem CB_füllen bzw. deren Events habe ich rausgenommen. HAt so keinen Sinn gemacht. Außer den WB_Events ist alles in einem Modul. Klassen sind wie gesagt nicht notwendig. Das mit den Blätter (bei denen die Prüfung anspringen soll) habe ich mal leicht angepasst.
Schaue mal, ob das als Erklärung reicht und der Code verständlich ist.
HIer mal noch allgemein:
Alle deine Makros kannst du nicht aus DieseArbeitsmappe (DA) herausnehmen. Das liegt zT auch daran, dass dort Events / Ereignisse abgefangen werden, welche speziell für das Objekt (hier Workbook) sind. In DA werden zB die wborkbbok_befor print etc. abgehandelt. Deshalb steht das das workbook davor. In den Tabellenblätter hingegen werden Ereignisse auf dem Blatt abgehandelt. Deshalb steht da worksheets davor. Allen anderen Code kannst du ein Modul packen. Dabei muss tdu nur aufpassen, dass du richtig auf die Objekte (blätter, Dateien etc.) referenzierst.
Du kannst übrigens im VBE im Codeteil oben wo Allgemein steht, das Objekt und rechts davon dann die zugehörign Ereignisse aussuchen. Wenn du da eins in diesen Code gepackt hast, muss es dort auch bleiben.
Weiß nicht, ob das so hilfreich war. Jetzt nach der Arbeit ist die Konzentration ein wenig hin.
Wenn Fragen sind, einfach stellen.
VG und einen Guten Rutsch an Alle.
Anzeige
AW: Helfer Gesucht für struktierten VBA Code
26.12.2019 23:53:17
Jürgen
Hallo Matthias,
bin zwar gerade nicht sicher ob du wirklich deine Datei hochgeladen hast,
dennoch vielen Dank für deine Hilfe.
Ich sehe nun auch das Problem mit meiner anfänglichen Datei bzw. warum diese zur Verwirrung geführt hat. Da ich aber in der Zwischenzeit einige anderen Tips und Tricks erhalten haben, werde ich mit Hilfer dieser und euren Dateien nochmal mein Werk überarbeiten.
Diese werden ich dann hier nochmals Hochladen und die "Kommentarfunktion" im VBA Code dazu nutzen
Probleme oder stellen an den ich Hilfe brauche zu "markieren". So daß du dann direkt Nachlesen kannst im Code was Sache ist ;-)
VG
und Danke dir auch einen Guten Rutsch
Anzeige
AW: Helfer Gesucht für struktierten VBA Code
27.12.2019 15:58:44
Jürgen
Hallo zusammen,
auf ein Neues ;-)
Ich habe die ganze Arbeitsmappe bzw. den Code so abgeändert, dass das was noch Unklar
ist oder das was ich gerne von nem Profi umgesetzt wird, im VBA Code als Kommentar hinterlegt ist.
Daher Funktioniert natürlich auch nichts in der Mappe oder den Blättern.
Zumindest nichts in richtung VBA.
Das ganze soll auch nur dazu Dienen euch bzw. vor allem Matthias verständlich zu machen,
was ich gerne hätte, noch Unklar ist oder ich gerne als visuelle Vorlage für spätere Projekte oder weitere Funktion bräuchte. Ganze Codes oder Codeschnipsel usw. aus dem Netz zu kopieren und irgendwie zum Laufen zu bringen kann zwar am Ende funktionieren, hilft mir persönlich aber nicht das ganze auch zu Verstehen. Dafür muss ich einmal eine ganze Mappe im richtigen "Aufbau" oder "strukturiertem Code Aufbau" sehen um mich daran Orientieren zu können.
https://www.herber.de/bbs/user/133988.xlsm
Danke
Gruß
Anzeige
AW: Helfer Gesucht für struktierten VBA Code
28.12.2019 01:46:00
Matthias
Moin!
Habe die Datei noch nicht angeschaut. Könnte aber sein, dass der thread heute oder morgen ins Archiv wandert. Dann kann man ihn ggf. noch finden aber nix mehr dazu ergänzen / antworten. Dann bitte nochmal einen Neuen aufmachen.
VG
AW: Helfer Gesucht für struktierten VBA Code
28.12.2019 18:11:31
Matthias
Moin!
Also jetzt mal ein bissl mehr Text.
1. Events / Ereignisse - für Mappe oder Blatt:
Wie letztens schon geschrieben. Die Events kannst du nur in den Blätter nutzen, wo auch das zugehörige Object (Workbook, worksheet) existiert. Deine workbook_beforeprint und befor close müssen in DieseArbeitsmappe. Du
beziehst dich dabei ja auch vorgegebene Objekte / Klassen. Die werden von Excel aber nur dort abgefangen, wo die Objekte auch überprüft werden. Im Blatt CMR_Frachtbrief gibt es aber kein workbook und auch kein
cmrworkbook.
Userbild
Da gibt es nur ein Worksheet. Wenn du die Ansicht aus dem Bild in DieseArbeitsmappe prüfst, gibt es da ein workbook . Diese Name der Objekte kannst du auch nicht ändern. Die sind vorgegeben. Wenn du mit
cmrworkbook arbeiten willst brauchst du eigene Klasse, bei der du das Event anlegst. Macht aber keinen Sinn, da du ja das Event der gerade offene Mappe abfangen willst und das ist Thisworkbook. Denke da nicht zu
kompliziert und nutze das, was du schon hast.
Deinen Code in diese Arbeitsmappe kannst du dagegen in das Modul auslagern. Da ist ja nix spezifisches aus der aktuellen Mappe drin.
2. Objekte
In einer Mappe sind immer schon einige Objekte vorgegeben. Dies ist die Mappe selber (Thisworkbook), andere Mappen (workbook mit Namen) und die Blätter (worksheets entweder mit index oder Namen) - sind nicht alle, nur
ein paar. Du kannst aber auch eigene Variablen anlegen und die als eines der Objekte deklarieren.
Dafür bei der Deklaration das entsprechende Objekt auswählen.
bei Worksheet dann as worksheet; bei workbook gitl as workbook usw..
Dieser so "definierten" Variable kannst du dann einen Objekt zuweisen. Das geht dann mit set. Dort gibst du dann den Blattnamen etc an. bspw..
dim myblatt as worksheet
set myblatt = worksheets("Tabelle1")
Um einfacher auf das Objekt der aktuellen Klassen zuzugreifen, kannst du auch das Me nutzen. S.h. https://www.online-excel.de/excel/singsel_vba.php?f=130 Das aber nur der Vollständigkeit halber.
Zusätzliche entstehen auch noch weitere Objekte, wenn du bspw. combos und dergleich auf das Blatt legst. S. nochmal das Bild. Da sind worksheet und deine 3 Combos. Einer Variablen kannst du alle bekannten Objekte zuweisen. Das sind die, welche du im Bild siehst oder die du ansprechen kannst. Bspw. workbooks("derName") - sollte dabei aber auf sein. In deinem Code kannst du zB nicht das cmrWorkbook ansprechen, da es das als Objekt nicht gibt. Sollte das der Dateiname der aktuellen Datei sein, dann nimm da wie o.e. ThisWorkook. Alternativ musst du dann mit Klassen arbeiten - aber warum so kompliziert.
3. Ereignisse der Objekte (ist jetzt vom Aufbau Mist, da oben schonmal Events kamen, habe aber grad keine Lust das umzustricken :-) )
Jetzt wo du weißt (bzw. am Bild siehst) welche Objekte du hast, kannst du denen auch Events geben bzw. die Abfragen. Da gibt es aber nicht immer zu jedem Objekt alle Events. WEnn du eins der Objekte aus dem Bild anklickst, ändert sich rechts davon die Auflistung. Das sind alle Events, die du dazu nutzen kannst.
Auf deine Mappe angewendet sehen wir also, dass im Blatt CMR_Frachtbrief alle genutzten Objekte da gar nicht vorkommen. Und wenn du bei einer der Combos schaust, gibt es da kein Initialize. Deswegen kannst du das nicht aus dem Blatt herausstarten.
Nochmal zu deinem chkCombo. Das ist nur der Name vom Modul. Für ein Modul gibt es kein Initialize. Das gibt es nur für Klassen / Objekte. Wenn ich das so sehe, willst du aus dem Blatt die Prüfung vor Speichern oder Drucken aufrufen. Das geht aber nicht, da die zugehörigen Events dem Workbook und nicht dem worksheet gehören. Das Einzige, was du aus dem Blatt starten könntest, ist nochmal ein Reset der CB oder ein neues Befüllen. Dafür kannst du bspw. das worksheet_activate nutzen.
Falls du die Validation noch für was anderes nutzen willst (Code der aus dem Blätter kommt), nutze Parameter. Habe dir mal noch einen Button reingebaut, um zwischendurch die Prüfung zu starten. Da sind jetzt keine Parameter drin, weil du in der Prüfung ja gleich beide Blätter prüfen willst. Ansonsten könntest du da auch nur dein Blatt übergeben und der würde das prüfen - dsa würde ggf. eher dem Start direkt aus dem Blatt entsprechen. Habe dir dort auch mal ein paar Zuweisungen auf das Blatt, die Mappe bzw. die Verknüpfung Mappe.blatt angelegt. Mit den Parameter wärst du übrigens flexibler. Jetzt müssen im Code alle Namen fest codiert sein. Wenn du mit den Parametern arbeitest, könnten die Namen sich auch ändern oder du ggf. auch andere Controls (Mehr, andere Namen) prüfen. Habe deshalb mal noch einen zweiten Button reingemacht, der nur das aktuelle Blatt prüft.
Soweit erstmal. Habe in der Datei deine Kommentare gelassen und meine jeweils mit ## beginnend darunter gesetzt.
https://www.herber.de/bbs/user/134008.xlsm
Ich bin mir nicht sicher, ob das hilfreich ist. Wenn nicht, einfach nochmal fragen.
VG
Anzeige
AW: Offenstellen vergessen oWt
26.12.2019 08:53:52
Piet
...
AW: Offenstellen vergessen oWt
26.12.2019 17:33:00
Hajo_Zi
lasse den Fragesteller entscheiden ob offen.
Es ist heute nicht mehr üblich eine Rückmeldung zu geben und so ist der Beitrag über 6 Tage offen.
Das ist nur meine Meinung zu dem Thema.

AW: Hajo dur Nervst! Thread war Offen!!
27.12.2019 12:18:26
Piet
Hallo Hajo
der Thread war -von Jürgen- offen gestellt. Ich habe ihn beim antworten -versehentlich- geschlossen.
Deine staendigen Belehrungen Nerven einfach nur, und tragen überhaupt nicht zu Lösungen bei!!
Ein frohes neues Jahr für alle Kollegen, auch für dich ...
mfg Piet
AW: Hajo dur Nervst! Thread war Offen!!
27.12.2019 13:00:48
Hajo_Zi
Hallo Piet,
warum musst Du einen Breitrag schreiben um einen offenen Beitrag auf offen zu stellen.
Ach so es geht Dir nur um die Beitragszahl. Dann mache weiter so.
Gruß Hajo
Anzeige
ich schmeiß mich weg...
28.12.2019 12:30:45
Werner
Hallo Hajo,
...diese Äußerung ausgerechnet von dir.
Ich kann mich noch erinnern, als vor einiger Zeit von Hans das Forum umgestellt wurde.
Damals warst du der einzige, der moniert hat, dass die Rangkingliste nicht mehr direkt aufgerufen werden konnte.
Stelle sich mir die Frage: Wer hier im Forum geil auf seine Beitragszahl - außer du?
Gruß Werner

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige