如何使用VBA从Excel工作表中删除表情符号?

时间:2019-03-29 13:22:58

标签: excel vba

我有一个电子表格,其中包含表情符号,例如,并且我正在寻找一种解决方案,以使用Excel VBA将表情符号替换为null。

可以使用Excel替换操作删除表情符号,因此我记录了一个宏来自动进行替换。我打开了录制的宏,它显示如下:

Sub Remove_Emojis()

    Cells.Replace What:="??", Replacement:="", LookAt:=xlPart, SearchOrder _
        :=xlByRows, MatchCase:=True, SearchFormat:=False, ReplaceFormat:=False
End Sub

问题是VBA无法识别表情符号()并将其替换为“ ??”,即VBA无法识别高于某个值的Unicode字符。

我尝试替换“ ??”与ChrW()

Sub Remove_Emojis()

    Cells.Replace What:=ChrW(128515), Replacement:="", LookAt:=xlPart, SearchOrder _
        :=xlByRows, MatchCase:=True, SearchFormat:=False, ReplaceFormat:=False
End Sub

但这会导致错误:

  

参数的无效过程调用

因为ChrW()函数不允许大于65535的值。注意:如果参数的值在-32,767到65,535之间,则ChrW()函数将起作用。

我希望应该在VBA中支持这样做,因为它可以在Excel中完成。

2 个答案:

答案 0 :(得分:6)

我做了一个小实验,将您的笑脸放入excel并运行以下代码:

Dim s
s = ActiveCell
Dim i As Long
For i = 1 To Len(s)
    Dim c
    c = Mid(s, i, 1)
    Debug.Print i, c, AscW(c)
Next i

我的结果是

 1            ?             -10179 
 2            ?             -8701 

因此,很明显,单个字符在VBA中被分成2个。 AscW和它的ChrW垂饰处理16位,而表情符号是32位字符,因此在VBA中,此表情符号字符的处理方式就像字符串中有2个字符一样。

我添加了以下代码并添加了代码,笑脸字符消失了:

Dim x
x = ChrW(-10179) & ChrW(-8701)

s = Replace(s, x, "(smiley)")
ActiveCell.Offset(0, 1) = s

可能您必须尝试面对的不同表情符号,并在替换例程中建立一个列表。

答案 1 :(得分:1)

感谢FunThomas指出表情符号在VBA中以2个字符表示。修改后的VBA代码可基于此进行工作:

Sub Remove_Emojis()

    Cells.Replace What:=ChrW(-10197) & ChrW(-8701), Replacement:="", LookAt:=xlPart, SearchOrder _
        :=xlByRows, MatchCase:=True, SearchFormat:=False, ReplaceFormat:=False
End Sub

在我的实际解决方案中,我将其放入循环中以删除所有不同的表情符号。

相关问题