Excel VBA

【Excel VBA】【マクロ】【Tips】ハイフンで区切られた文字列の数字を出力するマクロ

こんにちは!Lenocoです。本日も見てくださりありがとうございます。

今回はハイフンで区切られた文字列の隠れた数字を出力するマクロです!

ハイフンで区切られた文字列の数字を出力するマクロ

例えば「1-5」とあった場合、ハイフンで省略されている数字がありますよね。
それを一つずつ数字として扱いたいとき、こちらのマクロを使ってみてください!

今回は以下の図のようにB列の2行目から5行目にデータがあり、
「1-5」だったら、D列に「1 2 3 4 5」のように半角スペースで区切った数字の羅列を出力します。

汎用性を高めるため、メインのプロシージャから連番を振るマクロを呼び出すコードにしています。必要に応じて呼び出し側の引数を変更してください。

コード

Dim tgtArray As Variant

Sub Main()
    Dim i As Long
    Dim j As Long

    For i = 2 To 5
        Call AddHyphenValueToArray(Cells(i, "B"))
            
        For j = 0 To UBound(tgtArray)
            If Cells(i, "D") = "" Then
                Cells(i, "D") = "'" & Cells(i, "D") & tgtArray(j)
            Else
                Cells(i, "D") = Cells(i, "D") & " " & tgtArray(j)
            End If
        Next j
    Next i
End Sub

Sub AddHyphenValueToArray(str As String)
    
    Dim startN As Long
    Dim endN As Long
    Dim i As Long
    Dim index As Long
    
    startN = Left(str, InStr(str, "-") - 1)
    endN = Right(str, Len(str) - InStr(str, "-"))
    ReDim tgtArray(endN - startN)
    
    For i = startN To endN
        tgtArray(index) = i
        index = index + 1
    Next i
End Sub

コードの説明

プロシージャの外に、配列用の変数を宣言します。
そうすることでモジュール内のどのプロシージャでも使用することができるようになります。

●呼び出し元のプロシージャ

ループ用のカウンタ変数を宣言します。
2行目から5行目をループします。
ハイフンで区切られた数字の文字列を配列にいれるプロシージャをCallで呼び出します。
引数にB列の文字列を指定します。

●呼び出し先のプロシージャ(ハイフンで区切られた数字の文字列を配列にいれるマクロ)

パラメーターはString型のstrとしています。
2行目の「1-5」が引数として渡されたと仮定して見ていきましょう!
Long型のStartNにハイフンの左側の数字を格納します(最小数:1)。
Long型のendNにハイフンの右側の数字を格納します(最大数:5)。
Redimステートメントを使用して配列のtgtArrayを再定義し、配列を必要な枠分作成します。
なお、Redimのみで定義すると配列の中身は空になります。
値を保持したい場合は「Redim Preserve」と指定する必要がありますが、今回は毎回新しい値をいれるため
配列をリセットしたいので、RedimでOKです。
今回は「1-5」なので5枠必要となります。配列の要素数は0からスタートするため、
Redim tgtArray(4)と指定する必要があります。
最大数から最小数を引けば導き出せます!!
続いて、配列に数値を入れていきます。
最小数を初期値として、最大数までカウントするループを作成します。
変数indexは、初期値は0が入っていて配列の要素数を設定します。
indexはループの中で1ずつ増やします。

●呼び出し元のプロシージャ(続き)

tgtArrayに数値が入った状態で呼び出し元のプロシージャに戻ります。
配列の要素数分ループをします。
D列に直接入力していきます。
配列の中身を半角スペースで区切り出力したいのですが、
セルの設定によっては数値とみなされスペースが消えてしまうため、
先頭に「’」(アポストロフィー)をつけています。
配列1つ目だった場合は先頭にアポストロフィーをつけ数値を出力、
2つ目以降は半角スペースと数値を出力していきます。

さいごに

マクロの使用者が数値を指定するときに「1-5」のような書き方ができて、
それをマクロ側で処理できればとても便利ですよね。
今回は値を一つずつセルに出力していますが、文字列の変数を作り、
変数内でスペース区切りの文字列を作成してセルに出力するのでも全く問題ありません。
また、セルの書式が文字列になっていれば先頭のアポストロフィーも不要です!
必要に応じていろいろ変更して使ってみてくださいね。

Lenoco

COMMENT

メールアドレスが公開されることはありません。