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

Forumthread: Array an Funktion übergeben

Array an Funktion übergeben
15.05.2019 08:55:59
Sven
Wahrscheinlich ganz einfach: Was mache ich hier falsch?
Function inArray(ByVal myArray As Variant, strValue As String) As Boolean
'Gibt true zurück, wenn das Array den Wert bereits enthält:
Dim i As Integer
inArray = False
For i = LBound(myArray) To UBound(myArray)
If myArray(i) = strValue Then
inArray = True
Exit For
End If
Next i
End Function

Private Sub UserForm_Initialize()
If inArray(strArrUnternehmen, "test") = False Then ...
End Sub
Warum ist der Index außerhalb des gültigen Bereichs? Wie übergebe ich das Array richtig?
Danke und Grüße
Sven
Anzeige

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Weil wir nicht wahrsagen können...
15.05.2019 09:03:39
EtoPHG
was strArrUnternehmen für ein Datentyp und dessen Inhalt ist, Sven!
Gruess Hansueli
AW: Weil wir nicht wahrsagen können...
15.05.2019 10:01:03
Sven
Hier ein größerer Einblick in die aufrufende Prozuedur:
Dim strArrUnternehmen() As String
If inArray(strArrUnternehmen, .Range("B" & i).Value) = False Then
u = u + 1
ReDim Preserve strArrUnternehmen(u - 1)
strArrUnternehmen(u - 1) = .Range("B" & i).Value
End If

Anzeige
Ein String ist doch kein Array! (owT)
15.05.2019 10:16:17
EtoPHG

AW: Ein String ist doch kein Array! (owT)
15.05.2019 10:17:47
Sven
Und das Array braucht keine weitere Angabe zum Datentyp?
AW: Array an Funktion übergeben
15.05.2019 09:05:39
Daniel
Hi
Wie erstellst du das Array?
Mit der Funktion kannst du nur echte eindimensionale Arrays prüfen, aber keine zweidimensionalen, wie sie bspw entstehen, wenn du Zellbereiche in ein Array übergibst.
Wenn das der Fall sein kann, nimm die Schleife
For Each X in inArray
If X  = StrValue Then
...
Die kommt mit jeder Anzahl an Dimensionen zurecht.
Gruß Daniel
Anzeige
AW: Array an Funktion übergeben
15.05.2019 09:28:19
Nepumuk
Hallo Sven,
versuch es mal so:
Function inArray(ByRef myArray() As String, ByVal strValue As String) As Boolean

Gruß
Nepumuk
AW: Array an Funktion übergeben
15.05.2019 09:58:38
Sven
Das führt leider zum selben Fehler.
AW: Array an Funktion übergeben
15.05.2019 10:21:01
Nepumuk
Hallo Sven,
teste mal:
Option Explicit
Private Declare Function SafeArrayGetDim Lib "oleaut32.dll" ( _
ByRef pArray() As Any) As Long
Function inArray(ByRef myArray() As String, ByVal strValue As String) As Boolean
'Gibt true zurück, wenn das Array den Wert bereits enthält:
Dim i As Long
If SafeArrayGetDim(myArray)  0 Then
For i = LBound(myArray) To UBound(myArray)
If myArray(i) = strValue Then
inArray = True
Exit For
End If
Next i
End If
End Function
Public Sub Test()
Dim strArrUnternehmen() As String
If inArray(strArrUnternehmen, "Test") Then
MsgBox "drin"
Else
MsgBox "nicht drin"
End If
End Sub

Gruß
Nepumuk
Anzeige
AW: Array an Funktion übergeben
15.05.2019 10:24:10
Sven
Hallo Nepumuk,
Matthias (s.o.) hatte es schon gefunden. Am grundsätzlichen Aufbau war eigentlich alles gut, nur war beim ersten Aufruf der Funktion noch keine Dimensionierung des Arrays klar.
Danke für die Hilfe!
AW: Array an Funktion übergeben
15.05.2019 10:18:26
Matthias
Moin!
Am Anfang ist dein Array strArrUnternehmen noch kein Array. Du hast zwar den Namen deklariert aber das Ganze noch nicht initialisiert. Dimensioniere vor dem ersten Aufruf dein Array.
Bspw.:
redim strArrUnternehmen(0)
VG
Anzeige
AW: Array an Funktion übergeben
15.05.2019 10:22:40
Sven
Danke Matthias, das war der Fehler! Super!
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Array an Funktion übergeben in VBA


Schritt-für-Schritt-Anleitung

  1. Array deklarieren: Stelle sicher, dass du dein Array korrekt deklarierst. Wenn du ein String-Array verwenden möchtest, kannst du dies so machen:

    Dim strArrUnternehmen() As String
  2. Array dimensionieren: Bevor du das Array an die Funktion übergibst, musst du es dimensionieren. Zum Beispiel:

    ReDim strArrUnternehmen(0)
  3. Wert zum Array hinzufügen: Füge Werte zum Array hinzu, bevor du die Funktion aufrufst:

    strArrUnternehmen(0) = "Beispielwert"
  4. Funktion aufrufen: Rufe die Funktion inArray auf und übergebe das Array:

    If inArray(strArrUnternehmen, "Beispielwert") Then
       MsgBox "Wert gefunden"
    Else
       MsgBox "Wert nicht gefunden"
    End If
  5. Funktion definieren: Die Funktion, die du erstellen möchtest, könnte so aussehen:

    Function inArray(ByRef myArray() As String, ByVal strValue As String) As Boolean
       Dim i As Long
       If SafeArrayGetDim(myArray) > 0 Then
           For i = LBound(myArray) To UBound(myArray)
               If myArray(i) = strValue Then
                   inArray = True
                   Exit Function
               End If
           Next i
       End If
       inArray = False
    End Function

Häufige Fehler und Lösungen

  • Kein Array-Wert gefunden: Dieser Fehler tritt auf, wenn das Array nicht korrekt initialisiert oder dimensioniert ist. Stelle sicher, dass du das Array vor dem ersten Aufruf der Funktion dimensionierst:

    ReDim strArrUnternehmen(0)
  • Index außerhalb des gültigen Bereichs: Dies passiert, wenn der Index, den du verwendest, nicht innerhalb der Grenzen des Arrays liegt. Überprüfe, ob du mit LBound und UBound arbeitest, um die Grenzen korrekt zu bestimmen.

  • VBA ByRef Array: Wenn du ein Array übergibst, stelle sicher, dass du ByRef verwendest, um sicherzustellen, dass Änderungen am Array auch in der aufrufenden Prozedur sichtbar sind.


Alternative Methoden

Eine Alternative zur Verwendung einer Funktion zur Überprüfung von Werten in einem Array ist die Verwendung von Schleifen. Hier ein Beispiel:

Dim gefunden As Boolean
gefunden = False
For Each wert In strArrUnternehmen
    If wert = "Beispielwert" Then
        gefunden = True
        Exit For
    End If
Next wert

Diese Methode kann auch mit mehrdimensionalen Arrays verwendet werden und ist oft flexibler.


Praktische Beispiele

Hier ist ein praktisches Beispiel, wie du ein Array an eine Funktion übergibst und überprüfst, ob ein Wert vorhanden ist:

Sub Test()
    Dim strArrUnternehmen() As String
    Dim u As Long
    u = 0
    ReDim strArrUnternehmen(u)

    strArrUnternehmen(u) = "Testwert"

    If inArray(strArrUnternehmen, "Testwert") Then
        MsgBox "Wert gefunden"
    Else
        MsgBox "Wert nicht gefunden"
    End If
End Sub

Tipps für Profis

  • Verwendung von SafeArrayGetDim: Nutze SafeArrayGetDim, um die Dimensionen deines Arrays zu überprüfen, bevor du darauf zugreifst. Dies hilft, Fehler wie "kein Array-Wert gefunden" zu vermeiden.

  • Fehlerbehandlung: Implementiere Fehlerbehandlung in deinen Funktionen, um unerwartete Fehler abzufangen und besser zu diagnostizieren.

  • VBA String Array: Wenn du nur Strings verwendest, kannst du die Typen klar definieren, um die Lesbarkeit und Wartbarkeit deines Codes zu verbessern.


FAQ: Häufige Fragen

1. Was ist der Unterschied zwischen ByRef und ByVal?
ByRef übergibt eine Referenz auf das ursprüngliche Array, während ByVal eine Kopie übergibt. Mit ByRef kannst du Änderungen am Array innerhalb der Funktion vornehmen.

2. Wie kann ich ein mehrdimensionales Array an eine Funktion übergeben?
Für mehrdimensionale Arrays kannst du die Funktion so definieren:

Function inArray(ByRef myArray() As Variant, ByVal strValue As String) As Boolean

Hierbei wird der Datentyp auf Variant gesetzt, um unterschiedliche Dimensionen zu unterstützen.

3. Warum funktioniert VLOOKUP manchmal nicht?
Wenn du den Fehler "VLOOKUP führt zu einem Wert außerhalb des gültigen Bereichs" erhältst, überprüfe die Daten, die du durchsuchst, und stelle sicher, dass dein Suchbereich korrekt definiert ist.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige