Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Handeln von Arrays als Rückgabewerte

Forumthread: Handeln von Arrays als Rückgabewerte

Handeln von Arrays als Rückgabewerte
22.12.2018 14:16:53
Arrays
Guten Morgen,
ich bin Neuling in der VBA-Programmierung und scheitere gerade an Fragestellung, die nach eigener Google-Recherche ein häufigeres Problem zu sein scheint.
Ich habe eine Klasse mit verschiedenen String-Arrays als private Eigenschaften.
Diese String-Arrays sollen per Property-Let-Prozedur bei der Objektinitialisierung befüllt werden, und zwar anhand von Zellverbundadressen, die dem Objekt bei Initialisierung mitgegeben werden.
Da ich mehrere dieser Arrays habe und somit mehrere Let-Prozeduren, habe ich den Code zur Befüllung des Arrays anhand eines Adressenstrings in eine externe Funktion ausgelagert.
Modul "Projektinitialisierung"
Option Explicit
'Ein neues Objekt der Klasse "Profile" erzeugen und initialisieren
Set clsProfile = New Profile
clsProfile.Initialize strAddrA, strAddrB, strAddrC

Klassenmodul "Profile"
Option Explicit
Private bIsInitialized As Boolean
Private aMonthList(), aCurrencyList(), aDesignList() As String
Public Function Initialize(sTableMonthsAddr As String, sTableCurrenciesAddr As String,  _
sTableDesignsAddr As String) As Integer
If bIsInitialized Then
Initialize = 1
Exit Function
End If
MonthList = sTableMonthsAddr
CurrencyList = sTableCurrenciesAddr
DesignList = sTableDesignsAddr
End Function
Public Property Let MonthList(sAddr As String)
If bIsInitialized = False Then
aMonthList = mArrayStrCreateFromAddr(sAddr, 1)    'hier wird der Fehler _
erzeugt! Es wird ein Array erstellt mit den Zellinhalten des Bezugs "sAddr" im  _
Worksheet Nr. 1 ohne Angabe eines Upper-Limits. Dies funktioniert auch, aber die _
Rückgabe und Speicherung in "aMonthList" klappt nicht.
End If
End Property

Modul "Allgemeine Funktionen"
Option Explicit
Public Function mArrayStrCreateFromAddr(sAddr As String, iSheet As Integer, Optional iUBound As  _
Integer = -1) As String()
Dim i As Integer
Dim rngList As Range
Set rngList = Worksheets(iSheet).Range(sAddr)
Dim aList() As String
If iUBound >= 0 Then
ReDim aList(iUBound) As String
Else
ReDim aList(rngList.Rows.Count - 1) As String
End If
For i = 1 To UBound(aList) + 1
aList(i - 1) = rngList.Cells(i, 1).Value
Next
mArrayStrCreateFromAddr = aList
End Function
Scheinbar ist es allgemein nicht gut, Arrays mittels Zuweisungsoperator "=" zu kopieren, aber laut Google-Recherche sollte dies so eigentlich funktionieren.
Wenn ich alles, also jegliche String-Arrays in Variant-Arrays abändere und auch den Rückgabetyp der Funktionen auf Variant ändere, dann funktioniert alles bestens. Aber es stört mich, dass ich auf Variant zurückgreifen muss..
Gibt es eine bessere Möglichkeit? Ggf. mit einer korrekten "Array-Kopier-Schleifenfunktion"?
Merci und Lg
Binary
Anzeige

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Handeln von Arrays als Rückgabewerte
22.12.2018 16:19:46
Arrays
Wieso erklärst du nicht einfach (ohne Fachausdrücke), was genau du mit dem Code erreichen willst?
Deinen Code neu zu schreiben wäre wohl wesentlich einfacher, als ihn zu reparieren.
Du wirfst hier mit Fachausdrücken (wie Klassenmodul, Property-Let-Prozedur und Objektinitialisierung) um dich, die du weder benötigst noch wirklich verstehst.
Dein Code ist völlig unnötig kompliziert und verworren.
Warum nicht Variant? Kennst du denn überhaupt den Unterschied zu z.B. String?
Anzeige
AW: Handeln von Arrays als Rückgabewerte
22.12.2018 17:17:25
Arrays
Hallo Binary,
die Deklaration der Arrays in der Klasse ist falsch. Du musst grundsätzlich bei JEDER Variablen den Datentyp angeben.
Teste mal:
Private aMonthList() As String, aCurrencyList() As String, aDesignList() As String

Es ist meiner Meinung nach nie zu früh sich mit Klassen zu befassen!
Gruß
Nepumuk
Anzeige
AW: Handeln von Arrays als Rückgabewerte
24.12.2018 11:03:31
Arrays
Hallo Nepumuk.
Vielen Dank für die Rückmeldung. Tatsächlich war genau das das Problem an der Sache! Jetzt funktioniert es einwandfrei.
Ich komme aus der C++-Programmierung, zwar auch eher Laienniveau aber dort kann man Variablen eines Datentyps tatsächlich auf diese Weise kumulativ deklarieren. Weshalb das in VBA nicht funktioniert, verstehe ich nicht ganz. So wirklich "Einsparung" macht man so ja nicht, außer dass man sich das Wörtchen "Dim" spart.
Wenn wir schon dabei sind, ich sehe keine Möglichkeit, separate Konstruktoren für eine VBA-Klasse zu definieren, die mir mein Vorhaben erleichtern und diesen separaten Aufruf einer Initialize-Funktion ersparen könnten.
Hast Du da einen Vorschlag für mich, wie ich einem benutzerdefinierten Objekt bereits bei Initialisierung Argumente mitgebe und diese verwerte. Das würde mir auch die Codezeilen mit der boolean-Abfrage ersparen, ob das Objekt bereits initialisiert wurde oder nicht..
Freundliche Grüße
Binary91
Anzeige
AW: Handeln von Arrays als Rückgabewerte
24.12.2018 11:27:56
Arrays
Hallo Binary,
du meinst einen Konstruktor überladen? Ja das geht. Schau mal hier:
http://www.office-loesung.de/ftopic618585_0_0_asc.php
Gruß
Nepumuk
Anzeige
AW: Handeln von Arrays als Rückgabewerte
24.12.2018 14:36:11
Arrays
Hallo Nepumuk,
dankeschön für den Link. Das ist ja ein ziemlich ausgeklügeltes Verfahren, um einen Konstruktor zu überladen bzw. über einen Umweg an selbiges Ziel zu kommen. Ziemlich interessant!
Eine Sache noch:
In meiner Property-Let-Funktion mit einem String-Argument als Parameter lasse ich das String-Datenfeld erstellen und in die Membervariable speichern.
Über Property-Get würde ich dieses Datenfeld nun logischerweise gerne zurückgeben, allerdings meckert der Compiler aufgrund der unterschiedlichen Datentypen von Property-Let und Property-Get. Gibt es da eine Möglichkeit, wie ich dennoch ein String()-Datenfeld zurückgeben kann, ohne umständlicherweise das Argument von Property-Let ebenfalls auf ein Datenfeld abändern zu müssen, nur um damit eine Stringvariable übergeben zu können?
LG Binary91
Anzeige
AW: Handeln von Arrays als Rückgabewerte
24.12.2018 15:53:43
Arrays
Hallo Binary,
eine Eigenschaft wie deine MonthList die ein Array erzeugt ist doch grundsätzlich was anderes wie eine Eigenschaft die einen einzelnen Wert zurückgibt. Ich hätte daher kein Problem damit eine eigene Eigenschaft mit entsprechenden Namen benutzen z.B. MonthItem. Beides in einer Eigenschaft geht, wie du ja selbst festgestellt hast, nicht.
Gruß
Nepumuk
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Handeln von Arrays als Rückgabewerte in VBA


Schritt-für-Schritt-Anleitung

  1. Erstelle die Klasse: Lege eine neue Klasse an, z.B. "Profile", in der du die String-Arrays als private Eigenschaften definierst.

    Private aMonthList() As String
    Private aCurrencyList() As String
    Private aDesignList() As String
  2. Initialisierungsmethode: Implementiere eine Methode Initialize, um die Arrays bei der Objektinitialisierung zu befüllen.

    Public Function Initialize(sTableMonthsAddr As String, sTableCurrenciesAddr As String, sTableDesignsAddr As String) As Integer
       MonthList = sTableMonthsAddr
       CurrencyList = sTableCurrenciesAddr
       DesignList = sTableDesignsAddr
    End Function
  3. Property-Let-Prozedur: Definiere eine Property Let-Prozedur, um die Werte in die Arrays zu speichern.

    Public Property Let MonthList(sAddr As String)
       aMonthList = mArrayStrCreateFromAddr(sAddr, 1)
    End Property
  4. Array-Kopierfunktion: Erstelle eine separate Funktion, um Arrays korrekt zu kopieren und zu initialisieren.

    Public Function mArrayStrCreateFromAddr(sAddr As String, iSheet As Integer) As String()
       ' ... (Code zur Array-Erstellung)
    End Function
  5. Verwende das Objekt: Nutze das Objekt in deinem Hauptmodul, um die Klasse zu initialisieren und die Werte zu setzen.


Häufige Fehler und Lösungen

  • Fehler bei der Array-Deklaration: Achte darauf, dass du bei der Deklaration der Arrays den Datentyp immer angibst. Richtig ist:

    Private aMonthList() As String, aCurrencyList() As String, aDesignList() As String
  • Array-Zuweisung: Wenn du versuchst, Arrays mit dem Zuweisungsoperator = zu kopieren, kann dies zu Problemen führen. Stattdessen solltest du eine Schleife verwenden, um die Werte zu kopieren.


Alternative Methoden

Eine Alternative zur Verwendung von String-Arrays ist die Nutzung von Variant-Arrays. Diese bieten mehr Flexibilität, da sie verschiedene Datentypen speichern können. Allerdings kann dies zu einer ineffizienten Nutzung des Speichers führen. Überlege dir gut, welches Array für deine Anwendung am besten geeignet ist.


Praktische Beispiele

Hier ein Beispiel, wie du mit der mArrayStrCreateFromAddr-Funktion ein Array aus Zelladressen erstellen kannst:

Dim resultArray() As String
resultArray = mArrayStrCreateFromAddr("A1:A10", 1)

Dieses Beispiel zeigt, wie du die Zellinhalte von A1 bis A10 in ein Array kopierst.


Tipps für Profis

  • Konstruktoren nutzen: In VBA gibt es keine echten Konstruktoren, aber du kannst die Initialize-Methode verwenden, um Parameter bei der Objektinitialisierung zu übergeben. Das kann helfen, den Code übersichtlicher zu gestalten.

  • Eigenschaften gut benennen: Trenne die Eigenschaften für Arrays von einzelnen Werten. Benutze z.B. MonthItem für einen einzelnen Monatswert, anstatt alles in einer Eigenschaft zu vermischen.


FAQ: Häufige Fragen

1. Warum funktioniert die Zuweisung von Arrays nicht?
Arrays sollten nicht mit dem Zuweisungsoperator = kopiert werden. Verwende stattdessen eine Schleife, um die Werte zu übertragen.

2. Wie kann ich einen Konstruktor in VBA nutzen?
VBA unterstützt keine Konstruktoren wie in anderen Programmiersprachen. Du kannst jedoch eine Initialize-Methode erstellen, um Parameter zu übergeben.

3. Was ist der Unterschied zwischen String- und Variant-Arrays?
String-Arrays sind spezifisch für Strings, während Variant-Arrays flexible Datentypen speichern können. Variant-Arrays sind jedoch weniger speichereffizient.

4. Wie kann ich eine Property Get für ein Array implementieren?
Es ist sinnvoll, separate Eigenschaften für Arrays und einzelne Werte zu verwenden, da die Datentypen unterschiedliche Rückgabetypen haben.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige