Office: Objekte ByRef an public sub übergeben

Helfe beim Thema Objekte ByRef an public sub übergeben in Microsoft Excel Hilfe um das Problem gemeinsam zu lösen; Hallo! Innerhalb einer Excel-Arbeitsmappe existiert Folgendes: a) Klassenmodul cBericht b) Im VBA-Code eines Tabellenblattes zwei Subs, die wie... Dieses Thema im Forum "Microsoft Excel Hilfe" wurde erstellt von User, 13. Januar 2008.

  1. Objekte ByRef an public sub übergeben


    Hallo!

    Innerhalb einer Excel-Arbeitsmappe existiert Folgendes:


    a) Klassenmodul cBericht

    b) Im VBA-Code eines Tabellenblattes zwei Subs, die wie folgt deklariert sind:
    Public Sub SetBericht(ByRef Bericht As cBericht)
    '...
    End Sub
    Public Sub GetBericht(ByRef Bericht As cBericht)
    '...
    End Sub

    Ich habe auch schon folgende Variante probiert:
    Public Sub SetBericht(ByVal Bericht As cBericht)
    '...
    End Sub
    Public Function GetBericht() As cBericht
    '...
    End Function


    Das führt zur Fehlermeldung:
    "Private Objektmodule dürfen in öffentlichen Objektmodulen nicht als Parameter oder Rückgabetypen für öffentliche Prozeduren, als öffentliche Datenelemente, oder als Felder öffentlicher, benutzerdefinierter Typen verwendet werden."


    Wie löse ich das Dilemma? Die Randbedingungen, die dabei einzuhalten sind:
    - SetBericht/GetBericht müssen Public-Funktionen sein
    - SetBericht/GetBericht müssen im VBA-Code des entsprechenden Tabellenblatts gespeichert sein



    *** Zum Hintergrund ***

    Ich habe ein Klassenmodul cBericht. Dazu habe ich eine ganze Reihe von Darstellungsmöglichkeiten, unter Anderem:

    - Im Excel Eingabe- und Bearbeitungsformular
    - Als Excel-Tabelle
    - Als fertig formatierter Bericht in Word

    Diese Darstellungsmöglichkeiten sind regelmäßigen Änderungen unterworfen und auch sehr zahlreich, während die cBericht-Klasse auch in Zukunft konstant bleiben wird.

    Die Darstellung soll wg. Wartbarkeit&Co. *nicht* in cBericht implementiert werden, sondern "vor Ort", also z.B. im VBA-Code des jeweiligen Sheets bzw. im VBA-Code des Word-Basisdokuments.

    Wie realisiere ich das ganze in VBA, und zwar *sauber*? (Es geht um ein größeres Projekt, das auch in Zukunft noch wachsen wird. Aus diesem Grund ist es nötig, dass dem Ganzen eine saubere und einfach wartbare Programmstruktur zugrunde liegt und *keine* Ansammlung von Hacks oder dergleichen.)

    :)
     
  2. Hallo!

    Ich habe mir mittlerweile folgenden Workaround überlegt:

    Mein Klassenmodul cBericht hat eine Funktion GetAV und SetAV. GetAV überträgt alle Inhalte in einen Datenfeld aus Variants und SetAV nimmt ein Datenfeld aus Variants und füllt die Inhalte in die Variablen des Objekts. Das funktioniert auch mit Versions- und Objektkontrolle, also im Prinzip genauso wie ich Objektdaten in einen Stream schreiben bzw. daraus lesen würde.

    Damit kann ich meine oben geplante Programmstruktur realisieren, wenn auch etwas umständlicher in der Implementierung.

    An einer Möglichkeit, eine Objektreferenz direkt zu übergeben, wie oben im Anfangsposting dargelegt, wäre ich aber nach wie vor interessiert. Wenn also jemand eine Idee hat...
     
  3. Hi,

    Warum denn? Tu die in ein normales Modul, dann sollte das funktionieren.

    cu, Bernd
     
  4. Objekte ByRef an public sub übergeben

    Hi,

    wie Bernd schon gesagt hat würde ich den Code auch in ein Modul auslagern.
    Den Subs kannst du dann ja das Tabellenblatt als 2ten Parameter übergeben.
     
    Styrkar, 16. Januar 2008
    #4
  5. Ziel ist eigentlich die feste und auch für den Anwender transparent handhabbare Verknüpfung zwischen Sheet und VBA-Code. Wenn die Darstellungsfunktionen Bestandteil der Sheets sind, werden sie automatisch mitkopiert, sobald der Anwender (oder ein Makro) das Sheet z.B. in eine andere Arbeitsmappe kopiert.

    Wenn der zur Darstellung nötige VBA-Code aber als separates Modul existiert, muss ich einige Klimmzüge bewerkstelligen, dass die Anwender nicht plötzlich mit Tabellenblättern dastehen, die nutzlos sind, weil der zugehörige VBA-Code plötzlich fehlt.

    Anders ausgedrückt: Der Anwender soll sich darauf verlassen können, dass wenn er ein Sheet hat, auch immer die Darstellung funktioniert, selbst wenn er mit dem Sheet alles das anstellt, was Excel dem normalen Anwender so an Manipulationen (Umbenennen, verschieben, kopieren, als separates Dokument per Email versenden...) ermöglicht.

    Das mit dem Modul werde ich aber mal im Hinterkopf behalten. Das könnte in anderem Zusammenhang noch sehr nützlich sein; vielen Dank für den Hinweis!
     
    Zuletzt von einem Moderator bearbeitet: 12. Januar 2021
  6. Hi,

    Hmm, dann darfst Du aber auch keine Klassenmodule benutzen, oder?

    cu, Bernd
     
    Zuletzt von einem Moderator bearbeitet: 12. Januar 2021
  7. Hallo, Bernd!

    Doch, das geht durchaus, da die Arbeitsmappen-Vorlagen, in denen letztlich mit den Sheets gearbeitet wird, immer das Klassenmodul beinhalten. Und wie schon gesagt, ist cBericht "zukunftssicher" (Heißt: Änderungen extrem selten). Wenn da alle paar Jahre mal ein Update fällig wird, ist das zu stemmen.

    Anders bei den Darstellungen: Da kommen monatlich, evtl. sogar wöchentlich neue hinzu. Und dann jedesmal ein großes Update durchführen zu müssen...
     
    Zuletzt von einem Moderator bearbeitet: 12. Januar 2021
  8. Objekte ByRef an public sub übergeben

    Du könntest mit Late-Binding arbeiten, den Bericht also als Objekt übergeben und nicht als cBericht:

    Code:
    Damit kannst du die Klasse auch in ein Addin auslagern und die Tabellenblätter z.B. so ansprechen:
    Code:
    Damit hast du dann, wenn die Klasse cBericht mal geändert werden soll, nicht das Problem das du den Code in 100 Arbeitsmappen verändern mußt.
     
    Styrkar, 17. Januar 2008
    #8
  9. Hallo, Styrkar!

    Klingt interessant. Ich werde mir das mal näher anschauen.
     
    Zuletzt von einem Moderator bearbeitet: 12. Januar 2021
  10. Hallo, Styrkar

    Ich habe da doch noch ein Problem mit Deinem Vorschlag. Ich habe jetzt cBericht in ein Addin ausgelagert und das Addin auch geladen und aktiviert. Wenn ich dann aber das darauf aufbauende VBA-Projekt kompilieren will, erhalte ich an dieser Zeile

    Code:
    immer die Fehlermeldung "Benutzerdefinierter Typ nicht definiert".

    Was mache ich fasclh, bzw. wie mache ich es richtig?

    Das Late-Binding hat ja einige gravierende Nachteile (z.B. mangelnde Möglichkeit der Prüfung, ob die angesprochene Funktion überhaupt existiert, weil im Editor das Auswahlfeld nicht erscheint). Das dürfte bei der Entwicklung neuer Darstellungen für einige Probleme sorgen, fürchte ich. Es macht auch wesentlich mehr Aufwand in der Testphase - und zwar bei *jeder* Darstellung.
     
  11. Du kannst den Bericht nur da als cBericht erstellen wo du auch die Klasse cBericht gespeichert hast. In diesem Fall also im AddIn.
    In allen anderen Projekten mußt du den Bericht als Objekt definieren.
    Das hat natürlich die von dir angesprochenen Nachteile.
    Während der Entwicklung kannst du das Teilweise umgehen in dem du die Klasse einfach auch im Darstellungsbereich einfügst und erst auf Late-Binding umstellst wenn du das ganze rausgibst.
     
    Styrkar, 17. Januar 2008
    #11
  12. Hallo, Styrkar!

    Ja, das habe ich mir schon fast gedacht.

    Vielen Dank!
     
Thema:

Objekte ByRef an public sub übergeben

Die Seite wird geladen...
  1. Objekte ByRef an public sub übergeben - Similar Threads - Objekte ByRef public

  2. Datei als OLE-Objekt importieren

    in Microsoft Excel Hilfe
    Datei als OLE-Objekt importieren: Hallo zusammen, leider funktioniert im nachfolgenden Code, um eine Word-Datei via Dateiauswahl/FilePicker auszuwählen und als OLE-Objekt zu speichern, der Teil des Importierens nicht. Fehler...
  3. Datei als OLE-Objekt via FilePicker auswählen und speichern

    in Microsoft Excel Hilfe
    Datei als OLE-Objekt via FilePicker auswählen und speichern: Hallo zusammen, Leider funktioniert der nachfolgende Code nicht, um eine Datei als OLE-Objekt via FilePicker auszuwählen und zu speichern. Die Dateiauswahl funktioniert soweit, nur leider das...
  4. Word-Datei als OLE-Objekt in XLSM importieren

    in Microsoft Excel Hilfe
    Word-Datei als OLE-Objekt in XLSM importieren: Hallo zusammen, ich habe bereits eine Word-Datei (mit Textmarken sowie Kopf-und Fußzeilen) als OLE-Objekt in meine XLSM-Datei importiert und kann diese auch exportieren. Wenn ich dann aber Daten...
  5. Shortcut für Objekte in den Hintergrund verschieben

    in Microsoft PowerPoint Hilfe
    Shortcut für Objekte in den Hintergrund verschieben: Hallo, ich muss bei vielen Folien Objekte (in dem Fall ein Foto) in den Hintergrund verschieben. Normale Vorgehensweise wäre Rechtsklick -> in den Hintergrund. Die Klickarbeit möchte ich mir mit...
  6. Excel VBA Laufzeitfehler 424 Objekt erforderlich

    in Microsoft Excel Hilfe
    Excel VBA Laufzeitfehler 424 Objekt erforderlich: Hallo zusammen, ich habe schon verschiedene Antworten zum Laufzeitfehler 424 gefunden, komme aber leider damit doch irgendwie nicht weiter (bin absoluter VBA-Neuling). Folgendes Makro habe ich...
  7. Alle Objekte markieren macht Probleme

    in Microsoft Word Hilfe
    Alle Objekte markieren macht Probleme: Office Prof. Plus 2019 Word Hallo, ich habe Organigramme (vielleicht etwas umständlich) kreiert, d.h. es sind nur Textfelder, Linien, eine Ellipse und zwei kleine, verschiebbare Grafiken auf der...
  8. Laufzeitfehler "424" Objekt erforderlich Selenium VBA

    in Microsoft Excel Hilfe
    Laufzeitfehler "424" Objekt erforderlich Selenium VBA: Hallo Zusammen, ich möchte mithilfe von Selenium in VBA eine Tabelle auf einer Webseite in eine Excel Tabelle kopieren. Allerdings bekomme ich den Fehler "Laufzeitfehler "424" Objekt...
  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