2016-05-11 6 views
1

Excel VBAでファイルを1行ずつ読み込みます。私は、例えば、いくつかの文字列を持っている文字列の前後の空白の数を数えます。

"    ooo" 
"   ooo     " 

私は、文字列の前の空スペースの数を見つけたいです。トリムを使うと、文字列の前と後ろの両方から空白が削除されます。

答えて

2
Function test(s As String) As Integer 
    Dim str As String 
    str = "[abcdefghijklmnopqrstuvwxyz]" 

    Dim spaceCounter As Integer 

    For i = 1 To Len(s) 
     If Not Mid(s, i, 1) Like str Then 
      spaceCounter = spaceCounter + 1 
     Else 
      Exit For 
     End If 
    Next i 

    test = spaceCounter 
End Function 

を:なぜなど、代わりにTrimLTrimのこの機能を使用できますか?

the full explanationを要約すると、すべてのスペースがTrimで削除されるわけではありません。しかし、この機能で削除されます。

この例(Iは、説明の目的のためにPhilS' solutionを借りましょう)考えてみましょう:私たちは、文字列は明らかに3つのスペースが含まれていることを確認することができますが、解決策を使用してここ

"  a" 
2 
3 

Sub testSpaceRemoval() 
    Dim str1 As String 
    str1 = " " & Chr(32) & Chr(160) & "a" 
    Debug.Print Chr(34) & str1 & Chr(34) 
    Debug.Print NumberOfLeadingSpaces(str1) 
    Debug.Print test(str1) 
End Sub 

結果LTrimは数えただけです。

だから何を使うのですか?

まあ、それは異なります。あなたが壊れていない文字を取得しないことを知っているデータセットをお持ちの場合は、好きなだけTrimを使用してください!改行しない文字を入力できると思うならば、Trimだけでは十分ではありません。

リーディング、末尾、または複数の埋め込みスペース文字(Unicode文字セットは、32の値および160)、または非印刷文字(ユニコード:、上にリンクされた説明から引用されているため

文字は、外を見るために文字セットの値は0〜31、127、129、141、143、144、および157)

Trim32 is the regular space and 160 is a non-breaking spaceので、chr(160)上記示されたように(chr(32)を除去)はできません。

あなたの後ろをカバーするためにこだわるなら、このトータルソリューションを検討:OPの特定の質問について

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 

を、それはもう少し仕立てでなければならないであろう。

+3

そのパターンは '[a-z0-9 ] 'btw –

+0

私はそれを正規表現に使うが、yは知らなかったouは 'Like 'でもそれを使うことができます。ヘッドアップをありがとう。 – Vegard

+0

ええ、それは感謝することができますようないくつかのものの一つです! –

0
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 
+0

ありがとうございます。LTrimはスペースだけを前面から削除しますか? – Jeevan

+0

あなたはすぐに直接ウィンドウに 'Len(LTrim(" ooo "))'と入力することでそれを見ることができます – user3598756

+0

ありがとう、それは助けました。私は働いています。 – Jeevan

0
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 
6

あなたはLTrimRTrim機能を使用することができます。 - 文字列をループして文字比較をするよりも速いと思います。

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 
+1

それに私を打つ、あなたがポップアップしたときにこれを入力していた。ハハ – DDuffy

+0

もし私が間違っていれば、LTrimは前のスペースを取り除き、RTrimは背中のスペースを取り除きます。 – Jeevan

+0

おそらく速く(実装が簡単です)、私は同意します。欠点は、いくつかのユースケースでは動作しません(しかし、文字比較を行うことです)。もちろん、そのようなユースケースは、あなたのデータセットによってはまったく発生しないかもしれません! – Vegard

関連する問題