Function buchongfu(rng As Range) As String Dim str1 As String, str2 str1 = CStr(rng.Value) str2 = Mid(str1, 1, 1) For i = 2 To Len(str1) For j = 1 To Len(str2) If Mid(str1, i, 1) = Mid(str2, j, 1) Then GoTo 1 Next j str2 = str2 & Mid(str1, i, 1) 1: Next i buchongfu = str2 End Function 用VBA的都是懒人 顺便膜拜下楼上, 以上, 自定义函数=buchongfu() 可以实现以上功能
用 dictionary 可以更懒 Function z(rng As Range) Set d = CreateObject("Scripting.Dictionary") For i = 1 To Len(rng.Value) k = Mid(rng.Value, i, 1) num = d.Count: d(k) = "" If num <> d.Count Then z = z & k Next End Function
楼上程式衍生三个问题 1。 dic.add ..... 是新增字典 dic 元素,当同名元素已存在,你再新增,就出错。 dic.Add Mid(rng.Value, i, 1), "" 改用 dic(k) = "" 可免这种出错。 2。 on error resume next 对 dictionary 无效,须另设测试语法。 If dic.exists(k) Then GoTo 1 3。 Dictionary 有时候不支持关键字串用运算式(我不清楚甚麼时后支持甚麼时后不支持),用一个变量 k 可保高度可靠。 Function StrFilter(rng As Range) As String Set dic = CreateObject("scripting.dictionary") For i = 1 To Len(rng.Value) k = Mid(rng.Value, i, 1) If dic.exists(k) Then GoTo 1 dic.Add k, "" StrFilter = StrFilter & k 1: Next i End Function
最短是这样子了。 Function StrFilter(rng As Range) As String Set dic = CreateObject("scripting.dictionary") For i = 1 To Len(rng.Value) k = Mid(rng.Value, i, 1) If Not dic.exists(k) Then dic.Add k, "": StrFilter = StrFilter & k Next i End Function
研究了一中午,发现18楼的代码如果数字只有1个重复的就可以,多余1个不行。应该是on error goto 1这个语句就执行了一次。另外on error resume next语句可以作用于dictionary,我想利用19楼的第一点,字典不能增加相同的KEY来实现。代码如下: Function StrFilter(rng As Range) Set dic = CreateObject("scripting.dictionary") On Error Resume Next For i = 1 To Len(rng.Value) dic.Add Mid(rng.Value, i, 1), "" Next i On Error GoTo 0 StrFilter = Replace(Join(dic.keys), " ", "") End Function