我在每个单元格中都有一列文本,其中许多单词的末尾都有字符串null
。我想解析列中的每个单元格,如果单元格的内容以该字符串结尾,则从单元格中删除 null
。
我目前所写的内容如果它与前一个单词之间有空格,则会成功删除null
,但会删除整个单元格如果前一个单词与null
之间没有空格,则为内容。
Sub TruncateNulls()
Dim strPattern As String: strPattern = "\w*null\b"
Dim strReplace As String: strReplace = ""
Dim regEx As New RegExp
Dim strInput As String
ActiveSheet.Range("A2").Select
Do While ActiveCell.Value <> ""
strInput = ActiveCell.Value
With regEx
.Global = False
.MultiLine = True
.IgnoreCase = True
.Pattern = strPattern
End With
If regEx.Test(strInput) Then
ActiveCell = regEx.Replace(strInput, strReplace)
End If
ActiveCell.Offset(1, 0).Select
Loop
End Sub
示例输入数据:
words
null
wordsnull
words null
nullwords
所需的输出数据:
words
words
words
nullwords
如何将此调整为仅删除结尾null
,而不考虑前面的字符?
或者,我可以使用Excel的Find
功能,或者搜索&amp;中的特定通配符/通配符组合。如果其中任何一个选项有效,请替换窗口。
答案 0 :(得分:3)
如果您更喜欢当前的方法,则需要用
替换模式\s*null\s*$
请参阅regex demo
<强>详情
\s*
- 0+空格(用空格替换\s
,如果不想跨越行溢出,则为[^\S\r\n]
)null
- null
子字符串\s*
- 一个或多个空格(请参阅上面的相同说明)$
- 行尾(将.Multiline
标记设置为 False 以匹配字符串的结尾)。 答案 1 :(得分:2)
在这种情况下,比正则表达式更简单,只需使用Right()
函数检查最后4个字符。您的代码可以缩减为
Do While ActiveCell.Value <> ""
strInput = ActiveCell.Value
If Right(strInput, 4) = "null" Then
ActiveCell.Value = Left(strInput, Len(strInput)-4)
End If
ActiveCell.Offset(1, 0).Select
Loop
根据我的理解,这也更有效(并且可以通过定义范围并将其值复制到数组来提高效率。)
答案 2 :(得分:2)
使用SELECT * FROM a,aa,aaap,aabvf WHERE date='2017-07-21'
模式.Replace
删除每个单元格末尾的所有匹配项。您还应该考虑在数组中加载范围以缩短执行时间。
\s*null$