Option Explicit
Function ExtractNumbersFromString(InputString As String) As Variant
'Returns a single dimension array with all the numbers found in a string
'does not support decimals
Dim avarNumbers() As Variant
Dim strThisCharacter As String
Dim strNextCharacter As String
Dim intNumericStart As Integer
Dim intNumericEnd As Integer
Dim intCharacterCounter As Integer
Dim intStringLength As Integer
Dim blnNumberFound As Boolean
Dim intArraySize As Integer
Dim sngCurrentNumber As Single
intStringLength = Len(InputString)
blnNumberFound = False
intNumericStart = 0
intNumericEnd = 0
intArraySize = 0
For intCharacterCounter = 1 To intStringLength
Select Case intCharacterCounter
Case 1
strThisCharacter = Mid(InputString, intCharacterCounter, 1)
strNextCharacter = IIf(intStringLength > 1, Mid(InputString, intCharacterCounter + 1, 1), "")
Case intStringLength
strThisCharacter = Mid(InputString, intCharacterCounter, 1)
strNextCharacter = ""
Case Else
strThisCharacter = Mid(InputString, intCharacterCounter, 1)
strNextCharacter = Mid(InputString, intCharacterCounter + 1, 1)
End Select
Select Case blnNumberFound
Case True
If IsNumeric(strNextCharacter) = False Then intNumericEnd = intCharacterCounter
Case False
If IsNumeric(strThisCharacter) = True Then
intNumericStart = intCharacterCounter
If IsNumeric(strNextCharacter) = False Then intNumericEnd = intCharacterCounter
End If
End Select
If intNumericStart <> 0 And intNumericEnd <> 0 Then
If intArraySize = 0 Then
ReDim Preserve avarNumbers(intArraySize)
sngCurrentNumber = Mid(InputString, intNumericStart, intNumericEnd - intNumericStart + 1)
avarNumbers(intArraySize) = sngCurrentNumber
intArraySize = intArraySize + 1
Else
ReDim Preserve avarNumbers(intArraySize)
sngCurrentNumber = Mid(InputString, intNumericStart, intNumericEnd - intNumericStart + 1)
avarNumbers(intArraySize) = sngCurrentNumber
End If
blnNumberFound = False
intNumericStart = 0
intNumericEnd = 0
ElseIf intNumericStart = 0 And intNumericEnd = 0 Then
blnNumberFound = False
ElseIf intNumericStart <> 0 And intNumericEnd = 0 Then
blnNumberFound = True
End If
Next intCharacterCounter
ExtractNumbersFromString = avarNumbers
End Function
Function GetAverageFromString(InputString As String) As Single
Dim avarNumbers As Variant
Dim intArraySize As Integer
Dim sngSum As Single
Dim intCounter As Integer
InputString = Replace(InputString, ",", "", 1, -1, vbTextCompare)
avarNumbers = ExtractNumbersFromString(InputString)
sngSum = 0
intArraySize = UBound(avarNumbers)
For intCounter = 0 To intArraySize
sngSum = sngSum + avarNumbers(intCounter)
Next intCounter
GetAverageFromString = sngSum / (intArraySize + 1)
End Function
Sub test()
Debug.Print GetAverageFromString("US 500000-550000,US 450000-500000,US" _
& "400000-450000,US 350000-400000,US 300000-350000,US 275000-300000,US 250000-275000,")
Debug.Print GetAverageFromString("500,000-550,000,450,000-500,000," _
& " 400,000-450,000,350,000-400,000,300,000-350,000,275,000-300,000,250,000-275,000,225,000-250,000,200,000-225,000,")
End Sub
Results are...