文字と数値を切り分ける

ラボ

はじめに

 文字列の中から、文字と数値を切り分けたり、数値のみを切り分ける方法を考えてみましょう。
ます、Mid関数を使って、先頭から順番に1文字ずつ取り出して、IsNumelic関数で数値かどうかを判断します。
数値に小数点がある場合も考慮してドット(.)も考慮する必要があるでしょう。

 数値が始まった、数値が終わった位置を把握するためブーリアン型の変数をフラグとして使います。

数値と文字列を切り出す

 まずは、以下のように数値と文字列を切り分けるコードです。

'文字列から数値と文字列を取り出す
Function splitStringNum(str As String) As Variant
    Dim i As Long
    Dim b As Boolean
    Dim temp As String, str2 As String
    
    Dim delimiter As String
    Dim arr
        
    delimiter = ","     ' 区切り文字
    
    For i = 1 To Len(str)
        
        temp = Mid(str, i, 1)
        If IsNumeric(temp) Or temp = "." Or temp = "." Then
            If b Then
                str2 = str2 & temp
            Else
                If str2 = "" Then
                    str2 = temp
                Else
                    str2 = str2 & delimiter & temp
                End If
                b = True
                
            End If
        Else
            If b Then
                str2 = str2 & delimiter & temp
                b = False
            Else
                str2 = str2 & temp
            End If
        End If
    Next i
    
    splitStringNum = Split(str2, delimiter)
End Function

'実行コード///////////////
Sub testCode()
    Dim str As String
    Dim arr
            
    Dim i As Long, j As Long
    For i = 2 To 6
        arr = splitStringNum(Cells(i, "B"))
        
        For j = LBound(arr) To UBound(arr)
            Cells(i, j + 3) = arr(j)
        Next j
    Next i
End Sub

 ここでは、splitStringNum関数に文字列を入れると、切り分けた配列を返すようにしています。
この関数では、数値を見つけると区切り文字の変数 delimiter を付加します。ここでは区切り文字をカンマ(,)にしていますが、 文字列にカンマがあると上手く機能しません。その場合は、文字列に出現しない文字を区切り文字に指定してください。

 testCode から splitStringNum関数を呼び出しています。

文字列から数値のみ取り出す

 上記のコードを利用して、文字列内にある数値のみを取り出すように改造してみます。

'文字列から数値のみ取り出す
Function splitNum(str As String) As Variant
    Dim i As Long
    Dim b As Boolean
    Dim temp As String, str2 As String
    
    Dim delimiter As String
    Dim arr
        
    delimiter = ","     ' 区切り文字
    
    For i = 1 To Len(str)
        temp = Mid(str, i, 1)
        If IsNumeric(temp) Or temp = "." Or temp = "." Then
            If b Then
                str2 = str2 & temp
            Else
                If str2 = "" Then
                    str2 = temp
                Else
                    str2 = str2 & delimiter & temp
                End If
                b = True
            End If
        Else
            If b Then
                b = False
            End If
        End If
    Next i
    
    splitNum = Split(str2, delimiter)
End Function

'実行コード//////////////////
Sub testcode2()
    Dim str As String
    Dim arr
            
    Dim i As Long, j As Long
    For i = 2 To 6
        arr = splitNum(Cells(i, "B"))
        
        For j = LBound(arr) To UBound(arr)
            Cells(i, j + 3) = arr(j)
        Next j
    Next i
End Sub

 文字列を取り出す部分を省略するだけです。

文字列中の数値部分を隠す

 今度は文字列中の数値部分を xxx のように変更してみましょう。

'文字列中の数値部分を隠す
Function NumToxxx(str As String) As String
    Dim i As Long
    Dim b As Boolean
    Dim temp As String, str2 As String
    
    Dim delimiter As String
        
    delimiter = ","     ' 区切り文字
    
    For i = 1 To Len(str)
        
        temp = Mid(str, i, 1)
        If IsNumeric(temp) Or temp = "." Or temp = "." Then
            str2 = str2 & "x"
        Else
            str2 = str2 & temp
            If b Then
                b = False
            End If
        End If
    Next i
    
    NumToxxx = str2
End Function

'実行コード////////////////////
Sub testcode3()
    Dim str As String
    Dim arr
            
    Dim i As Long
    For i = 2 To 6
        Cells(i, "C") = NumToxxx(Cells(i, "B"))
    Next i
End Sub

 こちらは、配列でなく文字列を出力する形になります。

まとめ

 今回は、文字列から文字部分と数値部分を切り分けるプログラムを考えてみましたが、ちょっとした工夫で、数値のみを取り出したり、数値部分を別の文字に切り替えたりできるプログラムが書けます。

 何かのお役に立てれば幸いです。

コメント

タイトルとURLをコピーしました