Wechselnder Arrayname in Function übergeben

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
UserForm TextBox MsgBox
Bild

Betrifft: Wechselnder Arrayname in Function übergeben
von: Sven
Geschrieben am: 14.08.2015 15:18:49

Hallo zusammen,
Ich habe eine Userform mit TextBoxen. Beim Verlassen der TextBox soll geprüft werden, ob der Inhalt der TB in einem Array vorhanden ist. Dies erfolgt durch Aufruf der Function "IsInArray(Arrayname, Suchwert)". In Abhängigkeit vom gerade gültigen Tabellenindex soll ein bestimmtes Array durchsucht werden.
Arrays (mehrdimensional): Daten_Adresse, Daten_Kunde, Daten_Ansprechpartner, Daten_Verpackung, Daten_Einheiten
Diese Arrays werden ganz zu Beginn mit Daten aus einer Excel Tabelle gefüllt.
Das Array Tabelle() ist gefüllt mit den Werten (1) "Adresse", (2) "Kunde", (3) "Ansprechpartner", (4) "Verpackung", (5) "Einheiten", hat im Programm noch andere Zwecke und soll hier zur Bildung des Arraynamens dienen.
Die Variable Tabellenindex entspricht den Werten von 1 bis 5 und entspricht somit einem Wert aus dem Array Tabelle().
Mein Problem ist nun, wie kann ich den Arraynamen so übergeben, dass er bei Übergabe als Array erkannt wird und nicht als String?
PS: Ich denke, mit Select Case geht es auch, aber ich möchte eine "ausbaubare" Lösung, falls es _ mal mehr Arrays werden.


Private Sub TBox_Daten1_AfterUpdate()
    Dim arName As String
    arName = "Daten_" & Tabelle(Tabellenindex) 'Hier wird der Arrayname gebildet, aber als  _
String
    MsgBox IsInArray(arName, TBox_Daten1.Value) 'Hier soll das Array übergeben werden, aber  _
nicht als string
End Sub


Public Function IsInArray(ByVal sArray As Variant, ByVal sItem As String) As Long
  ' Diese Function habe ich aus einem anderen Internetbeitrag.
  ' Prüfen, ob das Element "sItem" im Array "sArray" enthalten ist
  ' Rückgabewert: Index des Elements bzw. -1, wenn nicht vorhanden
  Dim i As Long
  Dim nIndex As Long
  Dim nLen As Long
  Dim nStart As Variant
  Dim nEnd As Variant
 
  On Error GoTo ErrHandler
  nIndex = -1
 
  nStart = LBound(sArray)
  nEnd = UBound(sArray)
 
  nLen = Len(sItem)
  For i = nStart To nEnd
    If Len(sArray(i, 1)) = nLen Then
      If sArray(i, 1) = sItem Then
        nIndex = i: Exit For
      End If
    End If
  Next i
  On Error GoTo 0
 
ErrHandler:
  IsInArray_1 = nIndex
End Function

Danke schonmal für die Hilfe!!!
Grüße, Sven

Bild

Betrifft: AW: Wechselnder Arrayname in Function übergeben
von: Nepumuk
Geschrieben am: 14.08.2015 17:19:53
Hallo,
einen Variablennamen als String, das geht nicht. Du könntest aber mit einem Variant-Array arbeiten welches deine Arrays enthält. Aber um mehr dazu schreiben zu können, müsste ich mal sehen wie die Arrays gefüllt werden (eines genügt).
Gruß
Nepumuk

Bild

Betrifft: AW: Wechselnder Arrayname in Function übergeben
von: Sven
Geschrieben am: 17.08.2015 12:40:05
Die Arrays befülle ich mit Daten aus einer externen Excel Datei (DateiStammdaten), welche ich zuvor öffne und danach wieder schließe. In der externen Datei gibt es 5 Sheets, welche jeweils die entsprechenden Daten beinhalten.
Ich habe mal das Userform als Bild hochgeladen:
https://www.herber.de/bbs/user/99641.jpg

Private Sub Daten_auslesen()
    Dim iTabelle As Long    'Zähler für Tabellenblätter
    Dim Zeilen As Long      'Anzahl Zeilen im Tabellenblatt
    Dim Spalten As Long     'Anzahl Spalten im Tabellenblatt
    For iTabelle = 1 To 5 'jedes Tabellenblatt wird durchlaufen
        Zeilen = Workbooks(DateiStammdaten).Sheets(Tabelle(iTabelle)).Cells(Rows.Count, 1).End( _
xlUp).Row
        Spalten = Workbooks(DateiStammdaten).Sheets(Tabelle(iTabelle)).Cells(1, Columns.Count). _
End(xlToLeft).Column
        
        With Workbooks(DateiStammdaten).Sheets(Tabelle(iTabelle))
            Select Case iTabelle
                Case 1
                    ReDim Daten_Adresse(0 To Zeilen - 2, 0 To Spalten - 1)
                    Daten_Adresse = .Range(.Cells(2, 1), .Cells(Zeilen, Spalten))
                Case 2
                    ReDim Daten_Kunde(0 To Zeilen - 2, 0 To Spalten - 1)
                    Daten_Kunde = .Range(.Cells(2, 1), .Cells(Zeilen, Spalten))
                Case 3
                    ReDim Daten_Ansprechpartner(0 To Zeilen - 2, 0 To Spalten - 1)
                    Daten_Ansprechpartner = .Range(.Cells(2, 1), .Cells(Zeilen, Spalten))
                Case 4
                    ReDim Daten_Verpackung(0 To Zeilen - 2, 0 To Spalten - 1)
                    Daten_Verpackung = .Range(.Cells(2, 1), .Cells(Zeilen, Spalten))
                Case 5
                    ReDim Daten_Einheiten(0 To Zeilen - 2, 0 To Spalten - 1)
                    Daten_Einheiten = .Range(.Cells(2, 1), .Cells(Zeilen, Spalten))
            End Select
        End With
    Next iTabelle
End Sub

Grüße,
Sven

Bild

Betrifft: AW: Wechselnder Arrayname in Function übergeben
von: Rudi Maintaire
Geschrieben am: 17.08.2015 13:15:22
Hallo,
du musst deine 5 Arrays in ein Array packen und über den Index ansprechen.
etwa so:

Public Daten(1 To 5)
Private Sub Daten_auslesen()
  Dim iTabelle As Long    'Zähler für Tabellenblätter
  Dim Zeilen As Long      'Anzahl Zeilen im Tabellenblatt
  Dim Spalten As Long     'Anzahl Spalten im Tabellenblatt
  
  For iTabelle = 1 To 5 'jedes Tabellenblatt wird durchlaufen
    With Workbooks(DateiStammdaten).Sheets(Tabelle(iTabelle))
      Zeilen = .Cells(Rows.Count, 1).End(xlUp).Row
      Spalten = .Cells(1, Columns.Count).End(xlToLeft).Column
      Daten(iTabelle) = .Range(.Cells(2, 1), .Cells(Zeilen, Spalten))
    End With
  Next iTabelle
End Sub
  Private Sub TBox_Daten1_AfterUpdate()
      MsgBox IsInArray(Daten(TabellenIndex), TBox_Daten1.Value) 'Hier soll das Array übergeben  _
werden, aber _
  nicht als string
  End Sub
  
  Public Function IsInArray(ByVal DasArray As Variant, ByVal sItem As String) As Long
    ' Diese Function habe ich aus einem anderen Internetbeitrag.
    ' Prüfen, ob das Element "sItem" im Array "sArray" enthalten ist
    ' Rückgabewert: Index des Elements bzw. -1, wenn nicht vorhanden
    Dim i As Long
    Dim nIndex As Long
    Dim nStart As Long
    Dim nEnd As Long
   
    nIndex = -1
   
    nStart = LBound(DasArray)
    nEnd = UBound(DasArray)
   
    For i = nStart To nEnd
        If DasArray(i, 1) = sItem Then
          nIndex = i: Exit For
        End If
    Next i
   
    IsInArray = nIndex
  End Function
(Daten(1)= Adressen; Daten(2)=Kunden, ...)
Gruß
Rudi

Bild

Betrifft: AW: Wechselnder Arrayname in Function übergeben
von: Sven
Geschrieben am: 17.08.2015 13:55:25
Das hört sich gut an. Werde das direkt mal umsetzen. Schonmal vielen Dank!!
Aber eine Frage hätte ich noch. Wie spreche ich denn innerhalb des Arrays einzelne Daten an?
Also: Daten(1) entspricht dem Array Adressen. Nun möchte ich innerhalb der Adressen einen bestimmten Datensatz ausgeben (z.B. vorher Daten_Adresse(2, 3). Geht das dann über Daten(1(2, 3))?
Grüße,
Sven

Bild

Betrifft: AW: Wechselnder Arrayname in Function übergeben
von: Rudi Maintaire
Geschrieben am: 17.08.2015 22:51:14
Hallo,
Geht das dann über Daten(1(2, 3))?
Daten(1)(2,3)
Gruß
Rudi

Bild

Betrifft: AW: Wechselnder Arrayname in Function übergeben
von: Sven
Geschrieben am: 18.08.2015 17:41:31
Danke, funktioniert.

 Bild

Beiträge aus den Excel-Beispielen zum Thema "Wechselnder Arrayname in Function übergeben"