Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
660to664
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
660to664
660to664
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Arrays in VBA
03.09.2005 23:41:01
windalf
Ich komm aus der C++ Ecke und hab mal eine Frage zu Arrays in VBA...
1) Hat ein array ein member mit dem ich die grösse bzw anzahl der elemente abfragen kann? Wenn ja wie heisst dieses oder muss ich mir die Grösse immer in einer extravariablen merken
2) Was passiert wenn ein Array per value übergeben wird. Wird dann das ganze Array kopiert oder nur der "Zeiger" des Arrays...
3) Nehmen wir an ich will mir eine Funktion basteln die mir ein Array zurückliefern soll. Wie geht das (ich bekomm bei meinen versuchen immer nen compileerror)
4) Nehmen wir an ich will mir eine

Sub basteln die per Refenrenz einen Paramter bekommt der Array beinhaltet in das die 

Sub die Werte schreiben soll (und vorher das array entsprechend redimenionieren soll) Wie geht das...
Was war an meinen versuchen (ich skizziere es mal hier) falsch bzw wie macht man es richtig?

Sub get_Array(a() As Long)
ReDim a(5)
For i = 0 To 5
a(i) = i
Next i
End Sub


Sub Test()
Dim a() As Long
get_Array(a)
End Sub

oder
Funktion get_Array()As Long()
Redim getArray(5)
For i = 0 To 5
a(i) = i
Next i
End Sub


Sub Test()
Dim a() As Long
Set a =get_Array()
End Sub

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

Betreff
Datum
Anwender
Anzeige
AW: Arrays in VBA
04.09.2005 00:05:25
Nepumuk
Hallo windalf,
1. Das ghet mit der UBound - Funktion.
2. Es wird das komplette Array im Stackfram kopiert. Du hast aber trotzdem nur einen Zeiger darauf.
3. Das geht nur über ein Variantarray. Beispiel:
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Public Sub prcTest()
    Dim varArray As Variant
    varArray = fncTest(10)
    MsgBox UBound(varArray)
End Sub

Private Function fncTest(ByRef lngDimension As Long) As Variant
    Dim varArray() As Variant
    Redim varArray(1 To lngDimension)
    fncTest = varArray
End Function

4. So geht's:
' **********************************************************************
' Modul: Modul2 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub get_Array(a() As Long)
    Dim i As Integer
    Redim a(5)
    For i = 0 To 5
        a(i) = i
    Next i
End Sub

Sub Test()
    Dim a() As Long
    Call get_Array(a())
    MsgBox UBound(a)
End Sub

Gruß
Nepumuk
Excel & VBA – Beispiele
Anzeige
AW: Arrays in VBA
04.09.2005 00:28:16
windalf
Hi Nepumuk,
vielen Dank für die spontane und ausführliche Antwort. Hat mir seh weitergeholfen. Dazu kommen bei mir aber noch folgende Fragen auf...
[quote]
1. Das ghet mit der UBound - Funktion.
[/quote]
Heisst dann vermutlich ich muss auch LBound beachten falls jemand auf die kranke aber in VBA anscheinend mögliche Idee kommt einen Arrayindex nicht bei 0 beginnen zu lassen. richtig?
Geh ich richtig in der Annahme, dass die Version mit dem "Feld als returnvalue zurückliefern" die klar schlechtere Variante ist. Eine Übergabe per Parameter erscheint mir besser.
[quote]
2. Es wird das komplette Array im Stackfram kopiert. Du hast aber trotzdem nur einen Zeiger darauf.
[/quote]
Heisst also wenn ich im Array selbst rummüllen will ist ein call by reference unumgänglich. (im gegensatz zu c/c++, da hier nur der pointer kopiert werden würde) richtig?
Anzeige
AW: Arrays in VBA
04.09.2005 00:46:00
Nepumuk
Hallo windalf,
1. Ja. Du kansst mit der Funktion die Ober und Untergrenze jeder Dimension einzeln abfragen.
2. Nein, bei einem Call ByRef wir auch nur der Pointer kopiert. Noch ein Beispiel für den Unterschied:
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Public Sub test()
    Dim a As Long
    Call tByRef(a)
    MsgBox a
    a = 0
    Call tByVal(a)
    MsgBox a
End Sub

Public Sub tByRef(ByRef a As Long)
    a = 1
End Sub

Public Sub tByVal(ByVal a As Long)
    a = 1
End Sub

Gruß
Nepumuk
Excel & VBA – Beispiele
Anzeige
AW: Arrays in VBA
04.09.2005 11:52:48
windalf
Hi Nepi,
wie sich das mit "normalen" Datentypen verhält war mir schon klar. Ich wusste halt nicht was VBA bei einem CallbyValue macht wenn man ein array übergibt. In C/C++ wusste ich das nur der Pointer kopiert wurde und damit dann ein direktes arbeiten auf den Daten unproblematisch ist. Bei VBA war ich mir halt nicht sicher ob der wirklich das ganze Array auf den Stack packt oder wirklich nur den Zeiger bzw die Referenz kopiert. Daher rührte die Frage...
Danke Gruss Windalf
AW: Arrays in VBA
04.09.2005 00:49:44
chris
Hallo Ihr beiden,würdet ihr das ganze auch mal für nicht VBA Leute durchschaubar machen ?
Also erst mal den unterschied zwischen den beiden Array Makros von Dir Nepumuk und dann das mit dem einen Zeiger und Zeiger und so.? Ich weiß ist viel verlangt aber vieleicht klärt mich und andere VBA anfänger mal wer auf. Vielen danke grüße Christian
Anzeige
AW: Arrays in VBA
04.09.2005 08:34:44
Nepumuk
Hallo Chris,
1. Probier es einfach mal aus, dann siehst du den Unterschied. Am besten gehst du das ganze mit F8 durch und beobachtest die Variablen im Lokalfenster. Ich habe es ein bisschen erweitert und gebe dir die Speicheradressen der Variablen im Direktfenster aus. Siehe dazu 2.
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Public Sub test()
    Dim a As Long
    Debug.Print VarPtr(a)
    Call tByRef(a)
    MsgBox a
    a = 0
    Call tByVal(a)
    MsgBox a
End Sub

Public Sub tByRef(ByRef a As Long)
    Debug.Print VarPtr(a)
    a = 1
End Sub

Public Sub tByVal(ByVal a As Long)
    Debug.Print VarPtr(a)
    a = 1
End Sub

2. Für eine Variable, die du dimensionierst, wird im Stapelspeicher oder Stackframe ein Bereich reserviert, welcher der Größe der Variablen entspricht. Für einen Integer 2 Bytes für einen Double 8 Bytes usw.. Deine Variable beihaltet einen Zeiger oder Pointer auf die Speicheradresse dieses Bereichs. Wir beim Aufruf einer Sub, Function oder Property - Prozedur ein Wert ByVal übergeben, wird von diesem Bereich eine Kopie im Stapelspeicher angelegt und der Zeiger der Variablen in der aufgerufenen Prozedur geht auf die Adresse der Kopie. Übergibst du eine Variable ByRef, wird ein Zeiger auf den Zeiger der ursprünglichen Variablen übergeben. Also, eine Variable beinhaltet keinen Wert, sondern einen Zeiger auf eine Speicheradresse in der dieser Wert steht. Die Adresse kannst du mit den Funktionen VarPtr, StrPtr und ObjPtr auch abfragen. Das ist, wenn du mit API arbeitest öfters notwendig, da du mit diesen Funktionen direkt im Speicher schreiben und lesen kannst ist die exakte Speicheradresse und die Größe des Bereichs sehr wichtig. Sonst riskierst du wenn's gut geht einen Programmabsturz, wenn's schlecht geht einen Systemabsturz.
Gruß
Nepumuk
Excel & VBA – Beispiele
Anzeige
AW: Arrays in VBA
04.09.2005 10:02:54
chris
Hallo Nepumuk,
vielen Danke für deine Erklärung !
Jetzt muss ich das ganze nur noch mal durchprobieren aber dann werde ich es schon verstehen.
Vielen dank und mann liest sich und einen schönen Sonntag wünsche ich Dir noch !!!

320 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige