我试图用换行符代替单个字符串中的每个空格。字符串取自特定的单元格,看起来像:
现在,我尝试在换行符缩写后替换每个空格。缩写可以是任何缩写,因此预缓存我要替换的空格的最佳方法是:数字后和字母前的每个空格?
我想要获得的输出如下:
下面是我的代码,但是它将更改每个空格以在单元格中换行。
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
答案 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
)实际上有助于遵循最初的想法来查看空白首先:但是代替将它们全部替换为vbLf
或Chr(10)
,这种方法
" "
分隔符处将字符串拆分为一个从零开始的tmp
数组,并立即将任意缩写abbr
标识为第二个标记,即tmp(1)
因此您可以将作业更改为
'...
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 ,但可以 从一个项目到另一个项目。