【问题标题】:CleanName not cleaning " in Excel VBA?CleanName 不清理 Excel VBA 中的“?
【发布时间】:2012-09-16 05:39:38
【问题描述】:

在从此处添加行之前,我正在更新问题以显示我已经拥有的内容...

Function CleanName(strName As String) As String
'will clean part # name so it can be made into valid folder name
'may need to add more lines to get rid of other characters

    CleanName = Replace(strName, "/", "")
    CleanName = Replace(CleanName, "*", "")
    CleanName = Replace(CleanName, ".", "")
    CleanName = Replace(strName, "\", "")

End Function

【问题讨论】:

  • 嗨,马特。我已根据您更新的帖子编辑了我的答案。

标签: regex string vba excel


【解决方案1】:

您可以使用regexp而不是多个字符串替换

Function KillChars(strIn As String) As String
Dim objRegex As Object
Set objRegex = CreateObject("vbscript.regexp")
With objRegex
.Global = True
.Pattern = "[\/\*\.\\""""]+"
KillChars = .Replace(strIn, vbNullString)
End With
End Function

【讨论】:

  • + 1 篇!当我看到 ooo 解决方案时,我想给出一个正则表达式示例,但后来决定反对它,因为问题已经解决了:D 然而这是迄今为止最好的答案
  • 这是一个完整的列表,可以添加到上面的.Pattern (大于):(冒号)“(双引号)/(正斜杠)\(反斜杠) ) | (竖条或竖管) ? (问号) * (星号)
  • +1 要快得多,但前提是您每次调用函数时都不Set objRegex = :)
  • +1 更干净,更快。爱它。我需要更多地使用它:) 谢谢 brettdj
  • @oo 谢谢:)。我写这个假设它是一个UDF。如果核心代码正在处理来自数组、范围等的许多字符串,那么是的,将函数嵌入到主子中会更干净。尽管对于 UDF,我认为它不会对时间开销产生巨大影响。
【解决方案2】:

这是另一种选择:)

Option Explicit

    Function CleanName(ByRef str As String) As String
    Dim removeChars As String
    Dim i As Long
        removeChars = "/*."""

        For i = 1 To Len(removeChars)
            str = Replace(str, Mid(removeChars, i, 1), vbNullString)
        Next i
        CleanName = str

    End Function

测试

Sub Test()
Dim messyString As String

    messyString = "/*It Works!""."
    Debug.Print CleanName(messyString)

End Sub

【讨论】:

    【解决方案3】:

    将其粘贴到模块中

    Public Function CleanName(rng As Range) As Variant
        CleanName = Replace(rng.Value, Chr(34), "")
    End Function
    

    跟进

    Option Explicit
    
    Public Function CleanName(rng As Range) As Variant
        On Error GoTo Whoa
    
        Dim vVal As Variant
    
        vVal = rng.Value
        vVal = Replace(vVal, Chr(34), "") ' "
        vVal = Replace(vVal, Chr(42), "") ' *
        vVal = Replace(vVal, Chr(46), "") ' .
        vVal = Replace(vVal, Chr(47), "") ' /
        vVal = Replace(vVal, Chr(92), "") ' \
    
        CleanName = vVal
    Whoa:
    End Function
    

    【讨论】:

    • 你告诉我让它工作的最好方法是写字符值?再次感谢。有时我想知道人们如何在不发疯的情况下编写这段代码......
    • 您可以使用 Chr(34) 或喜欢 @nutsch 建议的 """"
    • @MattRidge。这是最好的方法吗,我不知道。但这是一种方式。我在下面的答案和坚果的答案也将起作用。请参阅我对如何使用引号的说明。
    • 更新了我的问题,以显示正在使用的内容。我想使用你的 Sid,但我认为它不会起作用。
    • @MattRidge -> 请告诉我我的代码哪里出错了?它对我来说就像一个魅力。如果它不适合你,我很想知道在哪里。
    【解决方案4】:

    更新

    马特,在您更新的帖子中,将代码更改为:

    Function CleanName(strName As String) As String
    'will clean part # name so it can be made into valid folder name
    'may need to add more lines to get rid of other characters
    
        CleanName = Replace(strName, "/", "") '-> only use strName the first time, since you are passing that string to the Function
        CleanName = Replace(CleanName, "*", "")
        CleanName = Replace(CleanName, ".", "")
        CleanName = Replace(CleanName, "\", "") '-> if you use strName here, you lose your first 3 replacments
        CleanName = Replace(CleanName, """", "") '-> this is the correct syntax to remove the "
        '-> to Sid's point, this should work too
        'CleanName = Replace(CleanName, Chr(34), "")
    
    End Function
    

    既然其他人都在回答,那我就把评论改成回答入群了!

    试试

    CleanName = Replace(CleanName, """", "")

    您需要将引号括在双引号中,以告诉 VBA 您要查找实际的实际引号,而不是它自动识别的特殊字符。 (丹尼尔库克下面的评论也涉及到它。)

    为了他人的利益,CleanName 是一个自定义函数,用于清除不需要的字符串。有关更多信息,请参阅此链接:CleanName

    【讨论】:

    • + 1 我在发布答案后看到了您的评论,想知道您为什么将其发布为评论,因为它是一个有效的答案:)
    • @SiddharthRout -> 我想我认为这是一件如此简单的事情,评论更容易,但我明白这会如何影响其他人搜索 SO 的有效性见。
    • 吹毛求疵...如果您要“将引号括在双引号中”,那么您需要提供 5 个引号将 1 个引号表示为字符串(您可能知道,这将是IDE 自动更正为 6 个引号)。四个引号是按顺序排列的。 #1:表示字符串开头的左引号。 #2 & #3:双引号,表示你想在字符串中加引号。 #4:右引号表示字符串的结尾。
    • @Daniel ...谢谢。我忘了更新我的措辞以更准确。现在正在做。
    • 除非我执行 """"",否则我会收到 Expected: list separator or ) 错误消息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 2017-04-02
    • 1970-01-01
    • 2022-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多