如何在Excel中找到无法识别的字符

时间:2014-10-13 22:31:03

标签: excel excel-vba excel-formula vba

我有数据集,如:

  • 1 AAA
  • 2 Asss,Inc
  • 3aéroports de paris
  • 4AachenMünchener
  • 5AachenMünchener
  • 6 Arco,Inc

我需要的结果包含只有无法识别的字符的记录。 在我的例子中,它将是记录N 3,4,5。

我可以创建任何功能或宏来执行此操作吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

您可以使用高级过滤器

使用A6中的数据:A11和A5中添加的标题

Data

标准范围A1:A2,您可以更改字符代码;或在同一栏中添加其他字符代码范围作为附加标准(例如A3,A4)

A1:  <Leave Blank>
A2:  =SUMPRODUCT(--(CODE(MID(A6,ROW(INDIRECT("1:"&LEN(A6))),1))>=128))>0

过滤器对话框:

Filter Dialog

结果:

Results

如果您更喜欢VBA代码,这里有一个宏,用于查看是否与所需字符不匹配;您可以在代码中看到将任何所需字符添加到列表中的位置。对于初学者,我包括字母,数字,空格和逗号。但是你可以添加任何你认为可识别的角色。

=======================

Option Explicit
Sub BadChars()
    Dim vSrc As Variant
    Dim vRes() As Variant
    Dim colRes As Collection
    Dim rRes As Range
    Dim I As Long

    'Add allowed characters between the exclamation point and the closing bracket
    Const sPat As String = "*[!A-Za-z0-9, ]*"

vSrc = Range("A1").CurrentRegion


'Process data
Set colRes = New Collection
For I = 1 To UBound(vSrc, 1)
    If vSrc(I, 1) Like sPat Then _
        colRes.Add vSrc(I, 1)
Next I

ReDim vRes(1 To colRes.Count, 1 To 1)
For I = 1 To colRes.Count
    vRes(I, 1) = colRes(I)
Next I

Set rRes = Range("F1").Resize(rowsize:=UBound(vRes, 1))
With rRes
    .EntireColumn.Clear
    .Value = vRes
    .EntireColumn.AutoFit
End With

End Sub

================================

删除副本中的字符,请尝试使用与上面类似的代码,但使用正则表达式:

========================================

Option Explicit
Sub BadChars()
    Dim vSrc As Variant
    Dim vRes() As Variant
    Dim colRes As Collection
    Dim rRes As Range
    Dim RE As Object
    Dim I As Long

    'Add allowed characters between the exclamation point and the closing bracket
    Const sPat As String = "[^A-Z0-9, ]"

vSrc = Range("A1").CurrentRegion

Set RE = CreateObject("vbscript.regexp")
With RE
    .ignorecase = True
    .Global = True
    .Pattern = sPat
End With

'Process data
Set colRes = New Collection
For I = 1 To UBound(vSrc, 1)
    If RE.test(vSrc(I, 1)) = True Then _
            colRes.Add RE.Replace(vSrc(I, 1), "")
Next I

ReDim vRes(1 To colRes.Count, 1 To 1)
For I = 1 To colRes.Count
    vRes(I, 1) = colRes(I)
Next I

Set rRes = Range("F1").Resize(rowsize:=UBound(vRes, 1))
With rRes
    .EntireColumn.Clear
    .Value = vRes
    .EntireColumn.AutoFit
End With

End Sub

===============================

删除结果:

enter image description here

答案 1 :(得分:1)

以下是基于unicode values执行此操作的简单方法。现在我只是在寻找32到122之间的代码值。您可以通过更改条件来调整此值以包含更多要包含或排除的值。

Sub findCharacters()
    Dim wks As Worksheet
    Set wks = Worksheets("Sheet1")

    Dim rng As Range
    Set rng = wks.Range("A1:A6")

    For Each cell In rng
        For Counter = 1 To Len(cell.Value)
            unicodeValue = AscW(Left(Mid(cell.Value, Counter), 1))
            If unicodeValue > 31 And unicodeValue > 123 Then
                cell.Interior.ColorIndex = 37
                Exit For
            End If
        Next
    Next cell
End Sub

结果是突出显示包含此范围之外的字符的单元格:

enter image description here

答案 2 :(得分:0)

如果这个vba也能删除这些字符会更加精彩......

相关问题