在Excel for Mac中生成#Value!返回值的VBA函数

w3nuxt5m  于 2023-01-10  发布在  Mac
关注(0)|答案(1)|浏览(163)

我在Excel for Mac上运行VBA函数时遇到问题。
我想处理一系列字符串以删除字符串中的任何重复字符。例如:列1示出了原始字符串,而列2已经去除了任何重复字符。

|Original String | Duplicate Characters Removed
route   | route
trout   | trou
eater   | eatr
brass   | bras
seige   | seig
smelt   | smelt

我发现了一些VBA代码,声称可以做到这一点,但运行时返回#VALUE!。代码如下所示:

Function RemoveDupes1(pWorkRng As Range) As String
'Updateby Extendoffice
Dim xValue As String
Dim xChar As String
Dim xOutValue As String
Set xDic = CreateObject("Scripting.Dictionary")
xValue = pWorkRng.Value
For i = 1 To VBA.Len(xValue)
    xChar = VBA.Mid(xValue, i, 1)
    If xDic.Exists(xChar) Then
    Else
        xDic(xChar) = ""
        xOutValue = xOutValue & xChar
    End If
Next
RemoveDupes1 = xOutValue
End Function

我通过在单元格B2(其中A2保存列表中的第一个字符串)中输入= RemoveDupes 1(A2)来调用此函数,但是收到#VALUE!错误。
我不知道问题是出在VBA代码上(其他人似乎已经成功地使用了它,但可能没有在Mac上)还是出在我应用它的方式上(我并不真正了解VBA,但过去已经成功地应用了其他代码片段)。

nzk0hqpo

nzk0hqpo1#

正如罗恩在评论中所写的,Mac上没有Scripting.Dictionary--字典是 * 微软脚本库 *(scrrun.dll)的一部分,而dll(动态链接库)在Mac上不存在。
现在,使用Dictionary进行重复检查通常是一个好主意,因为它非常快速且易于使用,然而,当涉及到简单检查字符串是否包含字符时,它有点矫枉过正。
下面的函数将把源字符串中的每个字符复制到目标字符串中(如果目标字符串中还没有)-使用InStr完成检查。
我已经将参数类型更改为Variant,并使用函数CStr将内容转换为字符串-使用该函数,您可以对几乎所有数据类型(范围、字符串,甚至数字或日期)调用该函数。

Function RemoveDuplicateChars(param As Variant) As String
    Dim sourceString As String, i As Long
    sourceString = CStr(param)
    For i = 1 To Len(sourceString)
        Dim xChar As String
        xChar = Mid(sourceString, i, 1)
        If InStr(RemoveDuplicateChars, xChar) = 0 Then
            RemoveDuplicateChars = RemoveDuplicateChars & xChar
        End If
    Next
End Function

更新:为了完整起见,我添加了一个可选的第二个参数,这样函数就可以不区分大小写(如果字符串包含一个大写和一个小写字符,则只复制其中一个)

Function RemoveDuplicateChars(param As Variant, Optional IgnoreCase As Boolean = False) As String
    Dim sourceString As String, i As Long
    sourceString = CStr(param)
    For i = 1 To Len(sourceString)
        Dim xChar As String
        xChar = Mid(sourceString, i, 1)
        Dim compareMethod As Long
        compareMethod = IIf(IgnoreCase, vbTextCompare, vbBinaryCompare)
        If InStr(1, RemoveDuplicateChars, xChar, compareMethod) = 0 Then
            RemoveDuplicateChars = RemoveDuplicateChars & xChar
        End If
    Next
End Function

相关问题