適材適所

システム屋のくらげが気ままに書いているブログです。PowerShellやVBAなどプログラミング系の話をメインに書いています。

MENU

Excel VBAでセル内の数字だけを抽出する

Excel業務あるある

なぜかセルの中に数字と一緒に単位がはいっている・・・。

セルの中から数字項目だけを取り出したい。

そんな経験ありませんか?

今回のExcel業務あるあるは、「セルの内の数字だけを抽出する」です。

他の人が作ったExcelに多かった経験が。。。

手作業で取り出すのは、かなり面倒。

単位のように一発で置換できればいいのですが、

場合によっては単純にはいかないことも。

今回紹介するのは、

そんなあるあるのときに使えるかも知れない、

数字だけを取り出す関数です。

GETNUMBER自作関数

GETNUMBERという関数にしてみました。

これならVBAの中でも使えますし、

ワークシートでも使えます。

f:id:shinmai_papa:20210217173818p:plain

単純に数字だけを取り出すのでは芸がないので、

・全角・半角の指定

・取り出し方向の指定

・区切り文字の指定

機能を付けてみました。

コード

実際のコードです。

 
'引数から数字だけを抽出する。
'GETNUMBER(対象を指定する, 全角を半角にするかどうか, 右から取り出すかどうか, 区切り文字を指定)
'Reverse=falseのとき a1b2⇒12
'Reverse=true のとき a1b2⇒21
'isNarrow = true のとき a1b2⇒12
'isNarrow = falseのとき a1b2⇒12
'Delimiter=","のとき a1b2=1,2

Function GETNUMBER(Target As Variant, Optional isNarrow As Boolean = True, Optional Reverse As Boolean = False, Optional Delimiter As String = "") As String
    '文字数
    Dim varLen As Long: varLen = Len(Target)
    '結果格納用の変数
    Dim returnNumber As String
    'カウント用変数
    Dim i As Long
    '文字を検査する文字
    Dim tmpChar As String
    '検査の開始位置
    Dim startPosition As Long
    '検査の終了位置
    Dim endPosition As Long
    '検査の方向
    Dim stepCount As Long
    'オプションのReverse変数の値により開始・終了位置・変数の増減をセットする
    If Reverse Then
        startPosition = varLen
        endPosition = 1
        stepCount = -1
    Else
        startPosition = 1
        endPosition = varLen
        stepCount = 1
    End If
    '1字ずつ検査する
    For i = startPosition To endPosition Step stepCount
        tmpChar = Mid$(Target, i, 1)
        '数値かどうかチェックする
        If IsNumeric(tmpChar) Then
            returnNumber = returnNumber & tmpChar & Delimiter
        End If
    Next i
    '数値が検出されなかった場合は空白を返して終了
    If returnNumber = Delimiter Then
        GETNUMBER = ""
        Exit Function
    End If
    '余分なDelimiterの削除
    returnNumber = Left$(returnNumber, Len(returnNumber) - 1)
    '半角のチェック
    If isNarrow Then
        returnNumber = StrConv(returnNumber, vbNarrow)
    End If
    GETNUMBER = returnNumber
End Function

なんだか長くなってしまいましたが・・・

順番に追ってみると、単純なことを素直にやっているだけです・・・。

終わりに

Excel業務あるあるで、セルから数字だけを取り出す関数の紹介でした。

これで数字だけを抽出するために

いちいち作業用のシートを用意して、置換して、また元のシートに貼り付け直して・・・

などといった無駄な工程を省くことができそうですね!

ここまでお読みいただき、ありがとうございました。

VBA・Excelの関数系の関連記事

www.tekizai.net

www.tekizai.net