Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1664to1668
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

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

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

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige