如何替换字符串中的某些字符

时间:2020-10-12 11:14:59

标签: excel vba

我试图用换行符代替单个字符串中的每个空格。字符串取自特定的单元格,看起来像:

enter image description here

现在,我尝试在换行符缩写后替换每个空格。缩写可以是任何缩写,因此预缓存我要替换的空格的最佳方法是:数字后和字母前的每个空格?

我想要获得的输出如下:

enter image description here

下面是我的代码,但是它将更改每个空格以在单元格中换行。

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

    On Error GoTo Exitsub
    
    If Not Intersect(Target, .Columns(6)) Is Nothing Then
        Application.EnableEvents = False
        Target.Value = Replace(Target, " ", Chr(10))
    End If
    Application.EnableEvents = True
    
Exitsub:
    Application.EnableEvents = True
    
End Sub

3 个答案:

答案 0 :(得分:4)

您可以尝试

Target.Value = Replace(Target, "kg ", "kg" & Chr(10))

如果您可以使用其他缩写词,例如“ g”或“ t”,则对它们进行类似的操作(也许在Sub中),请谨慎使用顺序(先替换“ kg”,然后替换“ g”)

更新:如果您事先不知道可能的缩写,则可以尝试使用正则表达式。我对它们不太满意,但是似乎可以使用以下例程:

Function replaceAbbr(s As String) As String
    Dim regex As New RegExp
    regex.Global = True
    regex.Pattern = "([a-z]+) "
    replaceAbbr = regex.Replace(s, "$1" & Chr(10))
End Function

答案 1 :(得分:2)

以下内容将用回车符替换第二个空格。出于我未知的原因,工作表函数Replace将按预期工作,但VBA Replace不会

这将遍历定义区域中的每个字符,您可以将其更改为所需的任何内容。

if语句就这样细分了

(SpaceCount Mod 2) = 0这部分使它能够获取每个第二个字符。 附带说明,(SpaceCount Mod 3) = 0将获得第三个字符,(SpaceCount Mod 2) = 1将首先获得第一个字符,然后每隔一个字符

Cells(1, 1).Characters(CountChr, 1).Text = " "是为了确保我们正在替换一个空格,如果用户输入的有趣内容看起来像一个空格但不是,那应该在他们身上

我相信类似这样的东西可以满足您的需求

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

On Error GoTo Exitsub

Application.EnableEvents = False

For CountChr = 1 To Len(Target.Value)
    If Target.Characters(CountChr, 1).Text = " " Then
        Dim SpaceCount As Integer
        SpaceCount = SpaceCount + 1
        If (SpaceCount Mod 2) = 0 Then
            Target.Value = WorksheetFunction.Replace(Target.Value, CountChr, 1, Chr(10))
        End If
    End If
Next CountChr


Application.EnableEvents = True

Exitsub:
Application.EnableEvents = True

    
End Sub

答案 2 :(得分:0)

首先确定任意缩写

“不确定缩写...”

了解不同的缩写,但是每个字符串中的相同(此处为kg)实际上有助于遵循最初的想法来查看空白首先:但是代替将它们全部替换为vbLfChr(10),这种方法

  • a)在此" "分隔符处将字符串拆分为一个从零开始的tmp数组,并立即将任意缩写abbr标识为第二个标记,即tmp(1)
  • b)执行负过滤以获取数字数据,并最终
  • c)使用给定字符串现在已知的缩写将它们连接在一起。

因此您可以将作业更改为

    '...
    Target.Value = repl(Target)      ' << calling help function repl()

可能的帮助功能

Function repl(ByVal s As String) As String
'a) split into tokens and identify arbitrary abbreviation
    Dim tmp, abbr As String
    tmp = Split(s, " "): abbr = tmp(1)
'b) filter out abbreviation
    tmp = Filter(tmp, abbr, Include:=False)
'c) return result string
    repl = Join(tmp, " " & abbr & vbLf) & abbr
End Function

编辑 // 回应FunThomas的评论

ad a):如果数字和缩写之间可能缺少空格,则可以将上述方法修改如下:

Function repl(ByVal s As String) As String
'a) split into tokens and identify arbitrary abbreviation
    Dim tmp, abbr As String
    tmp = Split(s, " "): abbr = tmp(1)
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'b) renew splitting via found abbreviation (plus blank)
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    tmp = Split(s & " ", abbr & " ")
'c) return result string
    repl = Join(tmp, abbr & vbLf): repl = Left(repl, Len(repl) - 1)
End Function

ad b):在OP中引用了例如"10 kg 20 kg 30,5kg 15kg 130,5 kg"(如上所述)的假设是,对于一个字符串中的所有值,缩写为 same ,但可以 从一个项目到另一个项目。