
The solution is quite simple, actually. Just read the help for the MATCH function. If argument match_type is 1 or omitted, the function finds the largest value that is less than or equal to lookup_value.
Here is the formula that the solution is based on:
Select all
The first part - MATCH - looks a particular character up and the second - FIND - converts it to a large/small according to the original.=IFERROR(CHAR(CODE("A")-1+MATCH(char,{"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"})+IF(ISERROR(FIND(LOWER(char),char)),0,32)),char)
You can download the workbook with a few examples here.
In the VBA
The formula is the solution for worksheets. However, this problem is mostly solved within the VBA project. Look at the UDF below, where I show how you can use this method in the VBA subroutines.
Select all
Function REMOVE_DIACRITICS(vValue) Dim sRetValue As String sRetValue = vbNullString Dim bIsString As Boolean bIsString = TypeName(vValue) = "String" If Not bIsString Then If TypeName(vValue) = "Range" Then bIsString = TypeName(vValue.Value) = "String" End If End If If bIsString Then Dim sOrigString As String sOrigString = vValue Dim sChars() As String sChars = Split("A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z", ",") Dim sRetString As String sRetString = sOrigString Dim iChar As Long For iChar = 0 To UBound(sChars) If Not InStr(sOrigString, sChars(iChar)) = 0 Then sOrigString = Replace(sOrigString, sChars(iChar), vbNullString) End If If Not InStr(sOrigString, LCase(sChars(iChar))) = 0 Then sOrigString = Replace(sOrigString, LCase(sChars(iChar)), vbNullString) End If Next iChar Dim sCharOrig As String * 1, sCharNew As String * 1 While Not Len(sOrigString) = 0 sCharOrig = Left$(sOrigString, 1) If Not StrComp(UCase(sCharOrig), LCase(sCharOrig), vbBinaryCompare) = 0 Then sCharNew = Chr(64 + WorksheetFunction.Match(sCharOrig, sChars) - 32 * (StrComp(UCase(sCharOrig), sCharOrig, vbBinaryCompare))) Else sCharNew = sCharOrig End If If Not sCharNew = sCharOrig Then sRetString = Replace(sRetString, sCharOrig, sCharNew) End If sOrigString = Replace(sOrigString, sCharOrig, vbNullString) Wend REMOVE_DIACRITICS = sRetString Else REMOVE_DIACRITICS = vValue End If End Function
|
Tweet |
No comments:
Post a Comment