Office: (Office 2013) [vba]

Helfe beim Thema [vba] in Microsoft Excel Hilfe um das Problem gemeinsam zu lösen; Hallo an euch alle, ich habe mich die letzten Wochen intensiv mit Klassen und Objekten beschäftigt und mein Programm entsprechend schon umgebaut.... Dieses Thema im Forum "Microsoft Excel Hilfe" wurde erstellt von sronny, 19. Juni 2015.

  1. sronny Erfahrener User

    [vba]


    Hallo an euch alle,

    ich habe mich die letzten Wochen intensiv mit Klassen und Objekten beschäftigt und mein Programm entsprechend schon umgebaut. Doch denke ich mal, dass ich da noch lange nicht alles begriffen habe. Deshalb will ich jetzt doch mal wieder eine Frage fragen:

    Ich habe mehrere Klassen - bspw. clsKlient. Diese Klasse umfasst den Namen, Strasse, PLZ, Ort und Kundennummer.
    Die Klienten lese ich in einem Modul aus einer Tabelle in ein Array oKlient ein. Also ich habe dann oKlient(1).Name, oKlient(2).Name usw. dann angelegt.

    In einer Userform- bspw. "Rechnung" habe ich eine Combobox cmbx_Klient_Name in der ich den jeweiligen Klient auswähle und mit dem Change-Event der Combobox (cmbx_Klient_Name_Change) werden Textboxen txb_Klient_Strasse, txb_Klient_PLZ usw gefüllt.

    Derzeit ist es so, dass, wenn ich einen Klient ändere, ich erst mit einem Button den Klient speichern kann, und dann die gesamten Klienten wieder einlesen muss, damit die Änderung geändert ist. Also, ich drücke den Button speichern, dann wird oKlient(1).Name etc. in die Tabelle "Klienten" eingetragen, das gesamte Array oKlient gelöscht und neu erstellt und die Combobox neu eingelesen.

    Das nimmt ja nun einige Zeit in Anspruch. Daher hatte ich versucht, in clsKlient mit Withevents txbTextbox (ich nenne die jetzt mal so) ein Changeereignis einzubauen, welches eine Änderung in einer Textbox im Userform, bspw. txb_Klient_Strasse gleich in der Variable mStrasse in dem Objekt einträgt. Dann könnte ich nämlich erst am Ende meiner Sitzung alle Änderungen in der Tabelle eintragen lassen.

    Leider funktioniert das so nicht. Daher meine Frage, wie kann ich erreichen, dass zur Laufzeit ich mittels Textbox_Change das Objekt verändern kann. Ich könnte das natürlich auch in der Userform für jede einzelne Textbox machen, aber Ziel ist ja (und da liegt ja der Vorteil begründet) ich das für Global in einer Klasse programmieren kann, um bsw. in anderen Userformen (Einsatzbestätigung erstellen) nicht das Ganze noch einmal programmieren muss.

    Ich danke euch schon einmal für Anregungen...
     
    sronny, 19. Juni 2015
    #1
  2. maninweb
    maninweb MVP für Microsoft Excel
    Hallo,

    hmm, etwas schwierig nachzuvollziehen, ohne Code. Spontan würde ich sagen, wenn Du ein Array der Objekte clsKlient hättest, könntest Du über die Array-Items direkt auf die Objekte zugreifen, Get und Set Properties aufrufen und Werte setzen. Du musst nur zur Laufzeit den Index kennen.

    Gruß
     
    maninweb, 19. Juni 2015
    #2
  3. sronny Erfahrener User
    Habe gerade gemerkt, dass ich irgendwie gar keine Überschrift angegeben habe- peinlich. Vielleicht könnte das ja ein Moderator ändern - weiß gar nicht wie das hier geht...

    Also im Modul "DatenEinlesen" bilde ich mein Klienten-Array folgendermaßen (gekürzt):

    Dabei sind KlIndex und KlCount öffentliche Variablen. Auf das Klientarray habe ich zur Laufzeit Zugriff über den Combobox-Index.

    Meine clsKlient-Klasse:

    Und dann habe ich für die Userform folgenden Code gefunden:

    Aber das bekomme ich nicht hin. Muss ich doch ein eigenes Textboxobjekt erstellen - bspw. oKlienttextbox() as clsKlient? Aber dann erhalte ich ja wieder unabhängige Objekte, die mit dem oKlient-Objekt nichts zu tun haben. Stehe voll auf dem Schlauch. Hoffe, ich habe nichts vergessen...
     
    sronny, 19. Juni 2015
    #3
  4. maninweb
    maninweb MVP für Microsoft Excel

    [vba]

    Hallo,

    erstmal vielen Dank für das Einstellen des Codes. Fällt mir leider immer noch etwas schwer zu folgen. Deshalb fasse ich es mal zusammen, so wie ich es verstehe: Du hast die Klasse clsKlient mit entsprechenden Properties. Du erstellst aus der Tabelle heraus ein Array mit N Objekten des Typs clsKlient. Ok, wobei, beim Füllen, Du KIndex = i schreibst, was Du nicht bräuchtest. Dann hast Du eine UserForm mit Textboxen. Hier sieht es so aus, als hättest Du statische drin, wie z.B. txb_Klient_Vorname.Value = oKlient(KlIndex).Vorname. Wofür soll dann der Code mit den For Each Schleifen gut sein? Ist mit nicht klar.

    Spontan würde ich sagen, es ginge wie folgt: Du hast die Liste der Klienten in der Combobox, woraus Du bei Auswahl den Index hast. Dann müsste in einem der Textbox-Ereignisse, wie z.B. txt_Klient_Vorname_Change() folgende einfache Zuweisung ausreichend sein:

    Code:
    oKlient(cmbx_Klient_Name.ListIndex+1).Vorname = txt_Klient_Vorname.Text
    Das Koppeln der Textbox-Events an clsKlient ist m.E. nicht notwendig. Falls Du die Textboxen dynamisch erstellen möchtest, würde ich mir ggf. eine Klasse z.B. clsKlienten erstellen, die das Array der Klienten verwaltet und diese an die dynamischen Textboxen koppelt. In dieser Klasse könntest Du dann die Zuweisungen durchführen, das Speichern erledigen und müsstest nicht für jedes i die Zuweisung der Textboxen per Set = ... an die Basisklasse machen.

    Gruß
     
    Zuletzt bearbeitet: 19. Juni 2015
    maninweb, 19. Juni 2015
    #4
  5. sronny Erfahrener User
    Hallo maninweb,

    das mit den dynamischen Textboxen hab ich mir auch schon überlegt, habe sie teilweise auch im Programm umgesetzt. Allerdings war mir dass dann bei so vielen Feldern zu umständlich, so das ich doch wieder auf einzelne Userformen zurückgegriffen habe und die Elemente festgelegt habe. Bei dynamischen Feldern muss ich ja erstmal eine Form erstellen, dann die einzelnen Koordinaten, Größen etc nehmen und diese wieder programmieren. Vorteil wäre, ich bräuchte für alles nur eine Userform. Stand aber nicht so im Verhältnis, da ich einiges vorher schon mal hatte.

    Nach weiterem Probieren habe ich es allerdings jetzt auch hinbekommen:

    Ich habe doch eine eigene Textbox-Klasse erstellt mit diesem Code (wiederum nur kurzgefasst):

    Dann habe ich eine oTextbox() -Variable erstellt.

    Und in der Userform:


    Das mit der For each-Schleife ist deshalb, da ich ja noch andere Formen in dem Frame habe und diese dann anders abfragen will. Wenn ich das nicht brauche, dann vielleicht mal nen kurzen Tip.

    Mein clsKlient-Objekt bekommt noch eine Changevariable verpasst (Boolean), mit der ich dann am Schluss prüfe, ob etwas geändert wurde und falls ja, dann ich das noch speichere. Bedeutet am Schluss zwar etwas länger warten, aber während der Laufzeit ist die Verarbeitung fließender...

    Ich danke aber trotzdem mal und den Rest muss ich mir noch einmal durch den Kopf gehen lassen..

    Habt ein tolles, sonniges Wochenende :-)
     
    sronny, 19. Juni 2015
    #5
Thema:

[vba]

Die Seite wird geladen...
  1. [vba] - Similar Threads - vba

  2. VBA in einer Zeile zu lang

    in Microsoft Excel Hilfe
    VBA in einer Zeile zu lang: Moin, mein VBA Code ist für eine Zeile zu lang. Kann mir einer helfen wie ich den auf 2 Zeilen aufteilen Kann? arrSchuhDaten = Array(Range("A6"), Range("F6"), Range("J6"), Range("A7"),...
  3. Listbox wird nicht breiter, Schriftgrösse ändert sich

    in Microsoft Excel Hilfe
    Listbox wird nicht breiter, Schriftgrösse ändert sich: Hallo, ich habe ein Formular dessen Breite ich mit der Maus ändern kann. Im Formular habe ich einen Rahmen und darin eine Listbox deren Breite an die Formularbreite angepasst wird....
  4. Kontrollkästchen aktivieren ohne VBA - wenn KK1 angekreuzt dann KK2 auch

    in Microsoft Excel Hilfe
    Kontrollkästchen aktivieren ohne VBA - wenn KK1 angekreuzt dann KK2 auch: Hallo zusammen, erstmal danke für all die Tipps und Kniffe, die ich ohne eigenen Thread gefunden und gelernt habe. Leider finde ich mein Thema nirgendwo... Aktuell habe ich zwei Spalten mit...
  5. Per Hyperlink ausgeblendetes Blatt einblenden

    in Microsoft Excel Hilfe
    Per Hyperlink ausgeblendetes Blatt einblenden: Hola ins Forum, ich bräuchte mal wieder eure Hilfe. Ich habe ein Tabellenblatt das mir als Register dient und wo Hyperlinks eingefügt sind um auf das dazugehörige Blatt zu springen. Diese Blätter...
  6. Bilder über VBA Größe und DPI ändern für Webshop

    in Microsoft Excel Hilfe
    Bilder über VBA Größe und DPI ändern für Webshop: Hallo Excel Spezialisten, Ich habe mir eine recht aufwendige Tabelle gebastelt, aus der ich Daten für meinen Webshop generiere und in einer .csv bereitstelle. Es werden neue Preislisten...
  7. VBA: Platzhalter ersetzen und evtl. leere Zeile einfügen

    in Microsoft Word Hilfe
    VBA: Platzhalter ersetzen und evtl. leere Zeile einfügen: Hallo zusammen, ich habe eine Word-Vorlage mit Platzhaltern, in die ich mit VBA Daten aus einer Excel-Datei einfüge (in eine Excel-Zeile schreibe ich alle Daten für ein neues Word-Dokument). So...
  8. Erstellung eines Dynamischen Kalenders (ggf. VBA)

    in Microsoft Word Hilfe
    Erstellung eines Dynamischen Kalenders (ggf. VBA): Guten Morgen an Alle, ich hoffe, es geht euch soweit gut :) Ich wende mich heute an euch, weil ich gerade vollkommen verzweifle und irgendwie so ganz und garnicht weiterkomme und irgendwie...
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden