2017-01-20 3 views
2

Ich fand eine Funktion, die mir ein wahres/falsches Ergebnis zurückgibt, wenn eine bestimmte Zeichenfolge, Nummer oder ein Datum in einem Array ist. Ich änderte es leicht, so dass es mir stattdessen eine Zahl gibt (wenn der Wert im Array ist, gibt es mir die Koordinate, sonst gibt es mir -1).IsInArray Funktion VBA

Public Function IsInArray2(DateToBeFound As Date, arr As Variant) As Long 
Dim position As Long 
IsInArray2 = -1 

For position = LBound(arr, 1) To UBound(arr, 1) 
    If arr(position) = DateToBeFound Then 
     IsInArray2 = position 
     Exit For 
    End If 
Next 

End Function 

Ich versuche diese Funktion zu verwenden, um zu überprüfen, ob ein Datum in einem Array ist. Wenn ja, kann ich die Koordinate für weitere Berechnungen in meinem Code verwenden.

Problem: Aus irgendeinem Grund bin ich immer und Fehler (Index außerhalb des Bereichs) in der Zeile:

If arr(position) = DateToBeFound Then 

ich bereits versucht, das Array-Referenz zu ändern, das Datum zu Nummer zu ändern, um Schnur, und versuchte Redim das Array in Bezug auf die maximale Anzahl der Elemente, die es hat, immer noch, der Fehler besteht weiterhin.

Irgendwelche Ideen?

+2

'arr (position, 1)';) – R3uK

+0

Danke für die Antwort. Das habe ich auch schon ausprobiert, gleiches Ergebnis. In jedem Fall, da das Array nur eine Dimension hat, müsste man angeben, in welcher Dimension es aussehen soll? – DGMS89

+1

Haben Sie Ihr Array manuell erstellt oder aus einer Reihe geladen? Wie übertriffst du es deiner Funktion? Versuchen Sie, Debug.Print LBound (arr, 1) hinzuzufügen: Debug.Print UBound (arr, 1): Debug.Print-Position am Anfang der Schleife. – R3uK

Antwort

2

Wenn Sie direkt auf einem Blatt aus einem Bereich ein Array laden:

d.h Arr=Sheets(1).Range("A1:B2").Value

das Array in zwei Dimensionen ist!

Sie müssen also verwenden! ;)

+1

Ich wusste nicht, dass es als 2D eingegeben wurde. Ich habe versucht, den einen vor dem Posten der Frage hinzuzufügen, aber es hat nicht funktioniert. Starten Sie die Datei einfach neu und versuchen Sie es erneut, es funktioniert. Ich verstehe diese Zauberei nicht, lol. – DGMS89

2

"vertical range" (mehr als eine Zeile) resultiert in 2D-Array, aber For Each Schleife verwendet werden kann (nicht getestet):

Public Function IndexOf(arr, value) As Long 
    Dim v: IndexOf = 0   
    For Each v in arr 
     If v = value Then Exit For 
     IndexOf = IndexOf + 1 
    Next 
    IndexOf = -1 ' not found 
End Function 

Für nicht-Datum oder Währungstypen: