Unfortunately it's not quite that simple, since it doesn't pass the translate vs replace test...
|
A |
B Formula |
B Value |
B Expected |
1 |
abcdef |
=translate(A1,"abc","bcd") |
ddddef |
bcddef |
2 |
abcdef |
=translate2(A2,"abc","bcd") |
bcddef |
bcddef |
but it can be fixed
Dim TranslateCache As Variant
Public Function translate2(InputString As String, Characters As String, Optional Translation As String = "") As String
If IsEmpty(TranslateCache) Then Set TranslateCache = CreateObject("Scripting.Dictionary")
Dim trans As Variant, i As Long, l As Long, c As String
Dim CacheName As String: CacheName = Characters & ":" & Translation
If Not TranslateCache.Exists(CacheName) Then
Set trans = CreateObject("Scripting.Dictionary")
l = Application.WorksheetFunction.Min(Len(Characters), Len(Translation))
For i = 1 To l
trans.Add Mid(Characters, i, 1), Mid(Translation, i, 1)
Next i
For i = l + 1 To Len(Characters)
trans.Add Mid(Characters, i, 1), ""
Next i
TranslateCache.Add CacheName, trans
Else: Set trans = TranslateCache.Item(CacheName)
End If
l = 1
For i = 1 To Len(InputString)
c = Mid(InputString, i, 1)
If Not trans.Exists(c) Then GoTo SkipI
If l <> i Then translate2 = translate2 & Mid(InputString, l, i - l)
l = i + 1
translate2 = translate2 & trans.Item(c)
SkipI: Next i
If l < i Then translate2 = translate2 & Mid(InputString, l, i - l)
End Function
Bookmarks