VBA Array of integers from integer to integer without typing out every single one
I am trying to figure out a correct code for
FormatStrokeArray = Array (120 to 300 step 1)
Because typing out hundreds of integers would be insane.
Later I am trying to find if my value is inside that array using
If IsInArray(FormatStroke, FormatStrokeArray) = True Then
MsgBox ("WORKS")
end if
and the function is
Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
IsInArray = UBound(Filter(arr, stringToBeFound)) > -1
End Function
Please, try understanding the next code:
Sub testEvaluate()
Dim FormatStrokeArray
FormatStrokeArray = Application.Transpose(Evaluate("row(120:300)")) 'create an array as you need (based 1 array)
Debug.Print Join(FormatStrokeArray, "|") 'see the array in Immediate Window
'play here with integers:
Debug.Print IsInArray(FormatStrokeArray, 300) 'it returns true
Debug.Print IsInArray(FormatStrokeArray, 100) 'it returns false
Debug.Print PositionInArray(FormatStrokeArray, 150) 'it returns 31 (the 31th element)
Debug.Print PositionInArray(FormatStrokeArray, 100) 'it returns -1 (no match)
End Sub
Function IsInArray(arr As Variant, myVal As Integer) As Boolean
Dim mtch
mtch = Application.Match(myVal, arr, True)
If Not IsError(mtch) Then
If mtch = UBound(arr) Then
If arr(UBound(arr)) = myVal Then IsInArray = True: Exit Function
Else
IsInArray = True: Exit Function
End If
End If
IsInArray = False
End Function
Function PositionInArray(arr As Variant, myVal As Integer) As Variant
Dim mtch: mtch = Application.Match(myVal, arr, True)
If Not IsError(mtch) Then
If mtch = UBound(arr) Then
If arr(UBound(arr)) = myVal Then PositionInArray = mtch: Exit Function
Else
PositionInArray = mtch: Exit Function
End If
End If
PositionInArray = -1
End Function
If something not clear, please do not hesitate to ask for clarifications.
I don't think that you need an array. If you want to check numbers in a range you can do it like this:
isValueInRange
checks if the given value is equal or greater than the minValue (120) and equal or lower than the maxValue. If yes it returns true otherwise false. That's it.
Option Explicit
Private Const const_minValue As Long = 120
Private Const const_maxValue As Long = 300
Public Sub test_isValueInRange()
'this is for testing the result of isValueInRange
Dim v As Long
v = 123
If isValueInRange(v) = True Then Debug.Print "Test 1: OK" Else Debug.Print "Test 1: error"
v = 10
If isValueInRange(v) = True Then Debug.Print "Test 2: error" Else Debug.Print "Test 2: OK"
v = 301
If isValueInRange(v) = True Then Debug.Print "Test 3: error" Else Debug.Print "Test 3: OK"
v = 300
If isValueInRange(v) = True Then Debug.Print "Test 1: OK" Else Debug.Print "Test 1: error"
End Sub
Public Function isValueInRange(valueToCheck As Long, _
Optional minValue As Long = const_minValue, _
Optional maxValue As Long = const_maxValue)
If valueToCheck >= minValue And _
valueToCheck <= maxValue Then
isValueInRange = True
End If
End Function
'One-liner version of above code that uses the const-values for min and max.
Public Function isValueInRange_shortVersion(valueToCheck As Long)
isValueInRange_shortVersion= (valueToCheck >= minValue And valueToCheck <= maxValue)
End Function