Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 计算字符串前后的空格数_Vba_Excel - Fatal编程技术网

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

我正在Excel VBA中逐行读取文件

我有一些字符串,例如

"             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
及其近亲无法删除所有类型的空格。我不是提问者,所以这不取决于我