Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Wie Arrays an Subs übergeben?

Wie Arrays an Subs übergeben?
13.10.2022 10:31:06
August
Guten Tag,
wie gehe ich das am Besten an?
Ein Makro soll ein Sub aufrufen, welches drei Arrays braucht, das erste davon nicht ändern können soll und die anderen beiden ändert.
Beide, Makro und Sub, sind im selben Modul.
Dieser Aufruf erfolgt millionen Mal. Daher ist eine zeitsparende Lösung angebracht. Die Größe der Arrays sind ca. 40x5 (2-dim).
Was ist besser, die Arrays dem Sub übergeben oder auf Modulebene deklarieren.
Habe gelesen, dass es besser ist, die Arrays als byRef-Variable zu übergeben (statt byVal), da das wenig Zeit kostet (der Ablauf, nicht das Schreiben des Makros). Allerdings sind sie nicht vor Veränderungen im Sub geschützt, was Fehler erzeugen könnte.
Oder ich deklariere die Arrays auf Modulebene, dann haben alle Subs uneingeschränkt Lese- und Schreibrechte, was nicht gut wäre. Nicht, dass meine linke Hand der rechten mißtraut, aber ich wil einfach Fehler vermeiden und die Möglichkeit unabsichtlicher Änderungen ausschließen.
Wie geht man da am Besten vor?
Gruß,
August
Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Wie Arrays an Subs übergeben?
13.10.2022 11:05:07
Oberschlumpf
Hi August,
"...aber ich wil einfach Fehler vermeiden und die Möglichkeit unabsichtlicher Änderungen ausschließen..."
Sorry, aber hier hilft nur: erst denken, dann machen!
Wenn du alles richtig programmierst, dann wird auch nix an falscher Stelle falsch geändert.
Wenn du das nicht richtig machst, dann...finde den Fehler
Und was deine "Angst" wegen Geschwindigkeitsnachteile bzgl ByRef oder ByVal betrifft, hat sich das, glaub ich, erledigt. Wir haben heute so schnelle Computer mit so viel Arbeitsspeicher. Da spielt das Ganze vielleicht ne Rolle, wenn du Millionen Daten im Speicher verarbeitest.
Aber bei dem von dir genannten Array 40x5 hast du "nur" einen Schrank mit 40 Schubladen, und in jeder Schublade gibt es 5 Fächer = 200 Datenfelder nur.
(bitte korrigiert mich nich wegen: Arrays beginnen bei 0 - danke!)
Und hier mal ein einfaches Bsp, wie man ein Array an ein anderes Sub übergibt:

Sub sbStart()
Dim larArray(40, 5), liIdxR As Integer, liIdxC As Integer
For liIdxR = 0 To 40
For liIdxC = 0 To 5
larArray(liIdxR, liIdxC) = liIdxC
Next
Next
sbUebergabeEinesArrays larArray
End Sub
Sub sbUebergabeEinesArrays(ByVal SchrankMit40SchubladenUnd5Faechern)
Dim liIdxR As Integer, liIdxC As Integer
For liIdxR = 0 To 40
For liIdxC = 0 To 5
MsgBox "Schublade " & liIdxR & vbCrLf & "Fach " & liIdxC & vbCrLf & "Inhalt: " & SchrankMit40SchubladenUnd5Faechern(liIdxR, liIdxC)
Next
Next
End Sub
In sbStart wird "dein" 40x5-Array mit Inhalt gefüllt.
Wenn fertig, wird das Array an die Sub sbUebergabeEinesArrays übergeben.
Wichtig!
Ein zu übergebenes Array muss als Variant deklariert sein und als solches auch übergeben werden.
Hilfts?
Ciao
Thorsten
...oh..ach ja...wenn du sbStart gestartet hast und irgdwann keine Lust mehr hast, MsgBoxen mit OK zu bestätigen (ca 2000x wird das wiederholt :-) ), dann drück die Tastenkombi Strg-Pause :-)
Anzeige
AW: Wie Arrays an Subs übergeben?
13.10.2022 11:58:11
volti
Hallo zusammen,
wenn man es nicht unbedingt als ByVal übergeben will, geht es auch mit einem String-Array.
PS: Und das mit der versehentlichen Änderung obliegt ja dann auch dem Programmierer 😊
Code:


Sub MainProg() Dim sArr() As String sArr = Split(" A1 B2 C3 D4 E5 F6 G7") Call Unterprog(sArr()) End Sub Sub Unterprog(sArr() As String) MsgBox sArr(2) End Sub

_________________________
viele Grüße aus Freigericht 😊
Karl-Heinz

Anzeige
AW: Wie Arrays an Subs übergeben?
13.10.2022 11:09:45
Der
Hallo,
also die Frage bei den zu ändernden Array stell sich ja nicht, die müssen ByRef übergeben werden, sonst kannst Du nicht ändern.
Bei der nicht zu ändernden musst Du halt aufpassen, dass Du die nicht änderst oder Du übergibst die ByVal. Du kannst es ja mal testen, indem Du die Laufzeit mit ByVal und ByRef vergleichst. Ich denke, der Unterschied wird marginal sein, da Die Variable im Speicher kopiert wird und die Dimensionen ja nicht wirklich groß sind.
Gruß
Michael
Anzeige
AW: Wie Arrays an Subs übergeben?
13.10.2022 13:32:26
snb
Hier sehe ich kein Geschwindigkeitsunterschied.

Dim sp
Sub M_snb_000()
t0 = Timer
sn = Range("A1:D40")
For j = 1 To 10 ^ 5
M_snb_001 (sn)
Next
MsgBox Timer - t0
End Sub
Sub M_snb_001(sn)
Application.ScreenUpdating = False
For j = 1 To UBound(sn)
For jj = 1 To UBound(sn, 2)
sn(j, jj) = 2 * sn(j, jj)
Next
Next
Range("F1:I40") = sn
End Sub
Sub M_snb_002()
t0 = Timer
sp = Range("A1:D40")
For j = 1 To 10 ^ 5
M_snb_003
Next
MsgBox Timer - t0
End Sub
Sub M_snb_003()
Application.ScreenUpdating = False
sn = sp
For j = 1 To UBound(sp)
For jj = 1 To UBound(sp, 2)
sn(j, jj) = 2 * sp(j, jj)
Next
Next
Range("F1:I40") = sn
End Sub

Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Arrays in VBA an Subs übergeben


Schritt-für-Schritt-Anleitung

Um ein Array in VBA an eine Sub-Prozedur zu übergeben, kannst du die folgende Schritt-für-Schritt-Anleitung befolgen.

  1. Array deklarieren: Deklariere dein Array in der Hauptprozedur (Sub) und fülle es mit Werten.

    Dim larArray(40, 5) As Integer
    For liIdxR = 0 To 40
       For liIdxC = 0 To 5
           larArray(liIdxR, liIdxC) = liIdxC
       Next
    Next
  2. Array an Sub übergeben: Rufe die Sub auf und übergebe das Array. Achte darauf, dass das Array als Variant deklariert ist, wenn du es als ByRef übergeben möchtest.

    sbUebergabeEinesArrays larArray
  3. Sub-Prozedur definieren: Definiere die Sub-Prozedur, die das Array entgegennimmt.

    Sub sbUebergabeEinesArrays(ByVal SchrankMit40SchubladenUnd5Faechern)
       Dim liIdxR As Integer, liIdxC As Integer
       For liIdxR = 0 To 40
           For liIdxC = 0 To 5
               MsgBox "Schublade " & liIdxR & vbCrLf & "Fach " & liIdxC & vbCrLf & "Inhalt: " & SchrankMit40SchubladenUnd5Faechern(liIdxR, liIdxC)
           Next
       Next
    End Sub

Häufige Fehler und Lösungen

  • Fehler: „Typ nicht definiert“ beim Übergeben des Arrays.

    • Lösung: Stelle sicher, dass das Array in der Sub-Prozedur als Variant deklariert ist.
  • Fehler: Das Array wird nicht richtig übergeben.

    • Lösung: Überprüfe die Syntax beim Aufruf der Sub. Achte darauf, dass du die korrekten Argumente übergibst.

Alternative Methoden

Eine Alternative zur Übergabe eines Arrays ist die Verwendung von String-Arrays. Hier ein Beispiel:

Sub MainProg()
    Dim sArr() As String
    sArr = Split("A1 B2 C3 D4 E5 F6 G7")
    Call Unterprog(sArr)
End Sub

Sub Unterprog(sArr() As String)
    MsgBox sArr(2)
End Sub

Diese Methode eignet sich besonders, wenn du keine numerischen Daten, sondern Text verarbeiten möchtest.


Praktische Beispiele

Hier sind einige praktische Beispiele zur Verwendung von vba array übergeben.

Beispiel 1: Übergeben eines 2-dimensionalen Arrays

Sub BeispielUebergabe()
    Dim myArray(1 To 3, 1 To 2) As Integer
    myArray(1, 1) = 1
    myArray(1, 2) = 2
    myArray(2, 1) = 3
    myArray(2, 2) = 4
    myArray(3, 1) = 5
    myArray(3, 2) = 6

    Call VerarbeiteArray(myArray)
End Sub

Sub VerarbeiteArray(arr() As Integer)
    Dim i As Integer, j As Integer
    For i = LBound(arr, 1) To UBound(arr, 1)
        For j = LBound(arr, 2) To UBound(arr, 2)
            Debug.Print arr(i, j)
        Next j
    Next i
End Sub

Beispiel 2: Nutzung von ByRef

Wenn du ein Array ändern möchtest, übergebe es mit ByRef:

Sub AendereArray(ByRef arr() As Integer)
    Dim i As Integer
    For i = LBound(arr) To UBound(arr)
        arr(i) = arr(i) * 2
    Next i
End Sub

Tipps für Profis

  • Verwendung von ByRef und ByVal: Überlege dir gut, ob du ein Array ByRef oder ByVal übergibst. Wenn du das Array nicht verändern möchtest, ist ByVal sicherer.

  • Performance: Teste die Laufzeitunterschiede zwischen verschiedenen Übertragungsmethoden, insbesondere wenn du große Datenmengen verarbeitest.

  • Debugging: Nutze Debug.Print, um den Inhalt deines Arrays während der Laufzeit zu überprüfen.


FAQ: Häufige Fragen

1. Wie kann ich ein Array in VBA an eine Funktion übergeben?
Du kannst es auf die gleiche Weise wie bei einer Sub übergeben, indem du die Funktion aufrufst und das Array übergibst.

2. Was ist der Unterschied zwischen ByRef und ByVal bei der Übergabe von Arrays?
ByRef übergibt eine Referenz des Arrays, was bedeutet, dass Änderungen im Sub auch im Hauptprogramm sichtbar sind. ByVal erstellt eine Kopie des Arrays, sodass Änderungen nicht zurückgegeben werden.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige