Vba 如何替换单词之间的空格;“独自一人”;在MS Excel中的单元格中

Vba 如何替换单词之间的空格;“独自一人”;在MS Excel中的单元格中,vba,excel,Vba,Excel,我在excel中有一列(示例单元格如下所示): 我希望用下划线替换单词之间的空格,而不是使用excel VBA在单元格中的任何其他空格,即 ABCD_PQRS;Plate;00;2 XYZ_MNO;Bracket;02,1 我试图从各种渠道找到解决方案,但没有成功地找到我需要的。许多人建议使用 =SUBSTITUTE and Replace(str, "", "_") 但它们中的任何一个实际上都会替换所有空格,甚至是数字和单词之间和/或数字和

我在excel中有一列(示例单元格如下所示):

我希望用下划线替换单词之间的空格,而不是使用excel VBA在单元格中的任何其他空格,即

            ABCD_PQRS;Plate;00;2 XYZ_MNO;Bracket;02,1
我试图从各种渠道找到解决方案,但没有成功地找到我需要的。许多人建议使用

             =SUBSTITUTE and Replace(str, "", "_")
但它们中的任何一个实际上都会替换所有空格,甚至是数字和单词之间和/或数字和数字之间的空格。 我严格地只需要替换单词之间的空格,而不需要任何其他空格

如果有人能帮我解决这个问题,我将不胜感激

提前谢谢

Sub removeSpaces()  
Dim req As String  
Range("$C$1").Activate  
Do While ActiveCell.Value <> ""  
    ActiveSheet.Select  
    '~~ code here to only choose spaces between words and ignore any other spaces
    req = Replace(ActiveCell.Value, " ", "_")  
    ActiveCell.Value = req  
    ActiveCell.Offset(1, 0).Activate  
Loop

End Sub
Sub-removespace()
Dim req作为字符串
范围($C$1”)。激活
当ActiveCell.Value“”时执行此操作
活动表。选择
“~~在此处编写代码,仅在单词之间选择空格,而忽略任何其他空格
req=替换(ActiveCell.Value,“,”和“”)
ActiveCell.Value=req
ActiveCell.Offset(1,0).激活
环
端接头

您可以尝试此自定义功能。看看是否对你有帮助

Function splitText(cellValue As Range)
    Dim arr As Variant
    Dim newText As String
    arr = Split(cellValue.Text, " ")
    For i = 0 To UBound(arr)
        If i = UBound(arr) Then
            If (IsNumeric(Right(newText, 1)) Or IsNumeric(Left(arr(i), 1))) Then
                newText = newText & " " & arr(i)
            Else
                newText = newText & "_" & arr(i)
            End If
        Else
             If i = 0 Or (IsNumeric(Right(newText, 1)) Or IsNumeric(Left(arr(i), 1))) Then
                newText = newText & " " & arr(i)
            Else
                newText = newText & "_" & arr(i)
            End If
        End If
    Next i
    splitText = newText
End Function

将函数放在一个excel单元格中,类似于
=splitText(B4)
,其中B4是要更改的文本您没有定义单词与非单词的区别。该定义在下面的代码中很容易更改。我选择将单词定义为以字母开头和结尾的序列。但如果这不起作用,可以替换其他定义:

编辑修改正则表达式模式和替换代码,以解决连续单字符单词的问题

Option Explicit
Function Underscore(S As String) As String
    Dim RE As Object
    Const sPat As String = "([A-Za-z])\s+(?=[A-Za-z])"

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

    Underscore = .Replace(S, "$1_")
End With
End Function
鉴于您提供的两个示例:


我注意到你有知情徽章。如果您阅读了本教程,您就会知道,寻求代码答案的问题应该提供一些您遇到问题的代码,并解释您遇到的错误代码或编译错误。您需要展示您尝试过的内容,但我认为正则表达式是最好的。它部分有效。代码没有替换所有必需的空格。但是,它替换了数字和单词之间的空格。RH-MNT;NA;3.2 RH-MNT;NA;3.2 15;防火墙正在更改为RH_MNT;NA;3.2_RH-MNT;NA;3.2 105;防火墙而不是RH_MNT;NA;3.2 RH_-MNT;NA;3.2 105;防火墙。我想函数需要稍作改进才能满足要求。请编辑第二个,如果是这样:如果I=0或(IsNumeric(Right(newText,1))或IsNumeric(Left(arr(I),1)),则2和RH之间的“”仍然存在,尽管现在所有带空格的单词之间都存在“”。新结果如下:RH_MNT;NA;3.2 RH_-MNT;NA;3.2 105;防火墙。。。;3;**2(右)**(右)。。。。不应存在此特定的“”(在****中突出显示)。我想是函数代码中的另一个小改动。你能给我一个转换不好的字符串吗;NA;3.2 RH-MNT;NA;3.2 105;防火墙。这是我的意见。到目前为止的结果是:RH_MNT;NA;3.2(右)MNT ;;NA;3.2 105;防火墙。希望这有帮助。耶!!工作没有瑕疵。非常感谢。:)@JeevanSBalagam I编辑了正则表达式模式和替换代码。虽然它在您给出的示例上运行良好,但我注意到它可能失败的其他一些实例。具体地说,如果有一个序列,比如X,它就无法在最后一个点上加下划线。经过编辑的代码解决了这个问题,效果很好。我已经理解了其中的区别,但我的需求不需要这种特殊的改变。然而,这绝对是伟大的。非常感谢您抽出时间!
Option Explicit
Function Underscore(S As String) As String
    Dim RE As Object
    Const sPat As String = "([A-Za-z])\s+(?=[A-Za-z])"

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

    Underscore = .Replace(S, "$1_")
End With
End Function