Vba 计算字符串前后的空格数
我正在Excel VBA中逐行读取文件 我有一些字符串,例如Vba 计算字符串前后的空格数,vba,excel,Vba,Excel,我正在Excel VBA中逐行读取文件 我有一些字符串,例如 " ooo" " ooo " 我想找出字符串前面的空格数。如果我使用Trim,它将从字符串的后面和前面删除空白 Sub main() Dim strng As String Dim i As Long strng = " ooo " i = 1 Do While
" ooo"
" ooo "
我想找出字符串前面的空格数。如果我使用Trim,它将从字符串的后面和前面删除空白
Sub main()
Dim strng As String
Dim i As Long
strng = " ooo "
i = 1
Do While Mid(strng, i, 1) = " "
i = i + 1
Loop
MsgBox "number of front empty spaces: " & i - 1
End Sub
或使用LTrim
功能:
Sub main2()
Dim strng As String
strng = " ooo "
MsgBox "number of front empty spaces: " & Len(strng) - Len(LTrim(strng))
End Sub
或使用LTrim
功能:
Sub main2()
Dim strng As String
strng = " ooo "
MsgBox "number of front empty spaces: " & Len(strng) - Len(LTrim(strng))
End Sub
根据大众要求:为什么要使用此功能而不是Trim
、LTrim
等
总之,并非所有空格都可以通过Trim
删除。但它们将通过此功能被删除
考虑这个例子(为了说明原因,我将借用):
结果:
" a"
2
3
在这里,我们可以看到字符串显然包含3个空格,但是使用LTrim
的解决方案只计算了2个空格
那么,用什么呢
那要看情况了。如果你有一个数据集,你知道你不会得到不间断的字符,那就尽量使用Trim
!如果您认为可以获得不间断字符,那么仅使用Trim
是不够的
需要注意的字符引用了上面链接的解释:
前导、尾随或多个嵌入空格字符(Unicode字符集值32和160)或非打印字符(Unicode字符集值0到31、127、129、141、143、144和157)
Trim
可以移除chr(32)
(如上所示),但不能移除chr(160)
,因为
如果你是一个掩护你的幕后黑手,考虑一下这个整体解决方案:
Function cleanSpecialCharacters(str As String) As String
bannedChars = Chr(127) & "," & Chr(129) & "," & Chr(141) & "," & Chr(143) & "," & Chr(144) & "," & Chr(157) & "," & Chr(160)
str = Application.WorksheetFunction.Clean(str)
str = Application.WorksheetFunction.Trim(str)
For Each c In Split(bannedChars, ",")
str = Replace(str, c, "")
Next
cleanSpecialCharacters = str
End Function
对于OP的特殊问题,它必须更加量身定做
Sub blanks()
cadena = Cells(1, 1)
i = Len(cadena)
Do Until Mid(cadena, i, 1) <> " "
If Mid(cadena, i, 1) = " " Then contador = contador + 1
i = i - 1
Loop
Cells(2, 1) = contador
End Sub
根据大众要求:为什么要使用此功能而不是Trim
、LTrim
等
总之,并非所有空格都可以通过Trim
删除。但它们将通过此功能被删除
考虑这个例子(为了说明原因,我将借用):
结果:
" a"
2
3
在这里,我们可以看到字符串显然包含3个空格,但是使用LTrim
的解决方案只计算了2个空格
那么,用什么呢
那要看情况了。如果你有一个数据集,你知道你不会得到不间断的字符,那就尽量使用Trim
!如果您认为可以获得不间断字符,那么仅使用Trim
是不够的
需要注意的字符引用了上面链接的解释:
前导、尾随或多个嵌入空格字符(Unicode字符集值32和160)或非打印字符(Unicode字符集值0到31、127、129、141、143、144和157)
Trim
可以移除chr(32)
(如上所示),但不能移除chr(160)
,因为
如果你是一个掩护你的幕后黑手,考虑一下这个整体解决方案:
Function cleanSpecialCharacters(str As String) As String
bannedChars = Chr(127) & "," & Chr(129) & "," & Chr(141) & "," & Chr(143) & "," & Chr(144) & "," & Chr(157) & "," & Chr(160)
str = Application.WorksheetFunction.Clean(str)
str = Application.WorksheetFunction.Trim(str)
For Each c In Split(bannedChars, ",")
str = Replace(str, c, "")
Next
cleanSpecialCharacters = str
End Function
对于OP的特殊问题,它必须更加定制。subblanks()
Sub blanks()
cadena = Cells(1, 1)
i = Len(cadena)
Do Until Mid(cadena, i, 1) <> " "
If Mid(cadena, i, 1) = " " Then contador = contador + 1
i = i - 1
Loop
Cells(2, 1) = contador
End Sub
cadena=细胞(1,1)
i=莱恩(卡德纳)
一直干到中午(卡德纳,i,1)”
如果Mid(cadena,i,1)=“那么contador=contador+1
i=i-1
环
单元格(2,1)=contador
端接头
子空格()
cadena=细胞(1,1)
i=莱恩(卡德纳)
一直干到中午(卡德纳,i,1)”
如果Mid(cadena,i,1)=“那么contador=contador+1
i=i-1
环
单元格(2,1)=contador
端接头
您可以使用LTrim
和RTrim
功能。-我认为这比在字符串中循环并进行字符比较要快
Public Function NumberOfLeadingSpaces(ByVal theString As String) As Long
NumberOfLeadingSpaces = Len(theString) - Len(LTrim(theString))
End Function
Public Function NumberOfTrailingSpaces(ByVal theString As String) As Long
NumberOfTrailingSpaces = Len(theString) - Len(RTrim(theString))
End Function
您可以使用
LTrim
和RTrim
功能我认为这比在字符串中循环并进行字符比较要快
Public Function NumberOfLeadingSpaces(ByVal theString As String) As Long
NumberOfLeadingSpaces = Len(theString) - Len(LTrim(theString))
End Function
Public Function NumberOfTrailingSpaces(ByVal theString As String) As Long
NumberOfTrailingSpaces = Len(theString) - Len(RTrim(theString))
End Function
先告诉我,当你的出现时,我正在打这个。哈哈,如果我错了,请纠正我,LTrim删除前面的空间,RTrim删除后面的空间可能更快(更容易实现),我同意。缺点是,对于某些用例,它不起作用(但进行字符比较会起作用)。当然,根据您的数据集,这些用例可能根本不会出现@当然,它只适用于chr(32)空间。对于其他字符,如不间断空格,您必须使用另一种解决方案,正如您出色地说明的那样。请告诉我,当您的字符弹出时,您正在键入此字符。哈哈,如果我错了,请纠正我,LTrim删除前面的空间,RTrim删除后面的空间可能更快(更容易实现),我同意。缺点是,对于某些用例,它不起作用(但进行字符比较会起作用)。当然,根据您的数据集,这些用例可能根本不会出现@当然,它只适用于chr(32)空间。对于其他字符,如不间断空格,您必须使用另一种解决方案,正如您出色地说明的那样。该模式也可以写成
[a-z0-9]
btwI将其用于正则表达式,但不知道您也可以将其用于like
。谢谢你的提醒。是的,谢天谢地,这是所允许的为数不多的事情之一!该模式也可以写成[a-z0-9]
btwI,用于regex,但不知道也可以与类似的一起使用。谢谢你的提醒。是的,谢天谢地,这是所允许的为数不多的事情之一!谢谢,LTrim是否只删除前面的空格?您可以通过在即时窗口中键入Len(LTrim(“oo”))
自己查看,但您放弃了我的答案。。。吼叫声不管怎么说,“维加德解决方案不会考虑像<代码>这样的字符!”“$/<代码>等等。而两个矿山解决方案都没有这样的限制。而<代码> LTrim <代码>实际上是非常之一。simple@user3598756:虽然这是事实,但将它们添加到列表中很容易(只需键入).你和PhilS的回答的缺点是Trim
及其近亲无法删除所有类型的空格。我不是提问者,所以这不取决于我