文字と数字の組み合わせの数が例よりもはるかに多いと言っているので、これはVBAの問題であり、ワークシート関数ではないと思います。WS機能は、維持するのが難しくなり、非常に迅速になります。
これら4つの機能を作りました。このGetCharArray
関数は、渡された文字列のテキストを解析して、そのテキストを文字の配列として返します(BAにはchar
型だけのstring
型がないため、文字列を返します。同じ考えです)
次に、fromを取得するために呼び出し、fromを取得するために呼び出すことができると仮定しGetNumberFromChars
ます。50
VL50s
GetLeftMostLetters
VL
VL50s
次に、名前付き範囲を作成したワークシートがkeys
あります。範囲の列1は「VL」、「H」、「M」などの文字で、それに関連付けられた対応する値は列2にあります。
Col1 Col2
VL 1
M 2
H 3
... ...
との結果でvlookup
ワークシート関数を使用して、の結果に追加する必要のある数値を見つけることができます。Range("keys")
GetLeftMostLetters
GetNumberFromChars
Function GetNewNumber(inString As String) As Double
Dim searchString As String, numberToAddFromKeys As Double, numberToAddToFromCell As Long, cellChars() As String
cellChars = GetCharArray(inString)
searchString = GetLeftMostLetters(cellChars)
numberToAddToFromCell = GetNumberFromChars(cellChars)
'use the keys named range where column 1 is your letters ("VL","H"...)
'and column 2 is the corresponding value for that letter set
numberToAddFromKeys = WorksheetFunction.VLookup(searchString, Range("keys"), 2, 0)
GetNewNumber = CDbl(numberToAddFromKeys) + CDbl(numberToAddToFromCell)
End Function
Function GetNumberFromChars(inChars() As String) As Long
Dim returnNumber As String, i As Long, numberStarted As Boolean
For i = 1 To UBound(inChars)
If IsNumeric(inChars(i)) Then
If Not numberStarted Then numberStarted = True
returnNumber = returnNumber & inChars(i)
Else
If numberStarted Then
'this will ignore that "s" on the end of your sample data
'hopefully that's what you need
GetNumberFromChars = returnNumber
Exit Function
End If
End If
Next
End Function
Function GetLeftMostLetters(inChars() As String) As String
Dim returnString As String, i As Long
For i = 1 To UBound(inChars)
If Not IsNumeric(inChars(i)) Then
returnString = returnString & inChars(i)
Else
GetLeftMostLetters = returnString
End If
Next
End Function
Function GetCharArray(inText As String) As String()
Dim s() As String, i As Long
ReDim s(1 To Len(inText))
For i = 1 To UBound(s)
s(i) = Mid$(inText, i, 1)
Next
GetCharArray = s
End Function
だからそれはそのように使うことができます...
Dim cell As Range, rng As Range
'set this range to your actual range.
Set rng = Sheets("your sheet name").Range("A1:A5")
For Each cell In rng
'put this resulting value wherever you want.
Debug.Print GetNewNumber(cell.Value)
Next cell