在Excel 2010 vba宏

时间:2016-09-15 11:20:58

标签: excel vba excel-vba macros

在Excel 2010中使用宏,我试图替换所有"无效"带有空格的字符(由命名范围定义)。

Dim sanitisedString As String
    sanitisedString = Application.WorksheetFunction.Clean(uncleanString)
    Dim validCharacters As Range
    Set validCharacters = ActiveWorkbook.Names("ValidCharacters").RefersToRange
    Dim pos As Integer
    For pos = 1 To Len(sanitisedString)
        If WorksheetFunction.CountIf(validCharacters, Mid(sanitisedString, pos, 1)) = 0 Then
            sanitisedString = WorksheetFunction.Replace(sanitisedString, pos, 1, " ")
        End If
    Next

它适用于除*和?之外的所有字符,因为CountIf将这些字符解释为通配符。

我尝试使用以下方法转义CountIf中的所有字符:

If WorksheetFunction.CountIf(validCharacters, "~" & Mid(sanitisedString, pos, 1)) = 0

但这会导致所有字符被替换,无论它们是否在列表中。

然后我尝试做两个单独的Substitute命令,放在for循环之后使用"〜*"和"〜?":

sanitisedString = WorksheetFunction.Substitute(sanitisedString, "~*", " ")
sanitisedString = WorksheetFunction.Substitute(sanitisedString, "~?", " ")

但*和?仍然能够完成。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

由于只需要担心两个通配符,您可以明确地测试这些通配符:

Dim character As String
For pos = 1 To Len(sanitisedString)
    character = Mid(sanitisedString, pos, 1)
    If character = "*" Or character = "?" Then character = "~" & character
    If WorksheetFunction.CountIf(validCharacters, character) = 0 Then
        Mid$(sanitisedString, pos, 1) = " "
    End If
Next