Excel VBA

【Excel VBA】【マクロ】【Tips】ハイフンで区切られた数字を一つずつ配列に入れたい

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

今回は配列についてのTips回です!!!

ハイフンで区切られた数字を一つずつ配列に入れたい

以下のような処理をしたいと思ったことはありませんか?
「1-3」とあったとき、配列に「1」「2」「3」といれたい。
「5-10」とあったとき、配列に「5」「6」「7」「8」「9」「10」といれたい。
どんな状況かはそれぞれだと思いますが、とにかくハイフンの間の数字を取得し、全ての数字を配列に入れたい!ということがあるかもしれません。

A1セルの内容を見て、A列の2行目以降に配列の内容を出力していくというマクロをご紹介します。
今回は例としてA1に「1-3」と入っていた場合でご説明します。

呼び出し元「Main」のコード

まず呼び出し元「Main」のコードです。

Dim tgtArray As Variant

Sub Main()
    Dim temp As String
    Dim i As Long
    

    temp = Sheets("Sheet2").Range("A1")
    
    Call IncludeHyphenValueToArray(temp)
    
    For i = 0 To UBound(tgtArray)
        Sheets("Sheet2").Cells(i + 2, "A") = tgtArray(i)
    Next i

End Sub
 

コードの説明

Subで囲っているコードのひとかたまりをプロシージャと言いますが、
プロシージャの外で宣言しているtgtArrayは、この後紹介する呼び出し先のプロシージャでも使っています。
プロシージャをまたいで使いたい変数のため、プロシージャの外で宣言しています。
変数宣言の段階では要素数が分からないため、この時点では設定していません。
そのあと、temp変数にA1の内容「1-3」を格納しています。
Callでハイフンを含んだ文字列を配列に振り分けるプロシージャを呼び出しています。引数として、先ほどのtempを渡しています。

呼び出し先「IncludeHyphenValueToArray」のコード

続いて呼び出し先「IncludeHyphenValueToArray」のコードです。

Sub IncludeHyphenValueToArray(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
 

コードの説明

まず、引数として受け取った「1-3」をハイフンを基準にして「1」を変数startNに、「3」を変数endNに入れています。

    startN = Left(str, InStr(str, "-") - 1)
    endN = Right(str, Len(str) - InStr(str, "-"))


続いてReDimで配列を再定義します。endNには「3」、startNには「1」が入っているため、
Redim tgtArray(2)と宣言したことになり、3つの枠が用意されます。

ReDim tgtArray(endN - startN)


For文で配列に数値を入れていきます。
初期値にstartN「1」、最後の値にendN「3」を設定することでiの値が1~3の間繰り返す処理になります。
配列の要素数はindexという変数を使っていて、最初は0が入っています。
配列の要素数0のところに1、要素数1に2、要素数2に3が入っていく処理となります。

    For i = startN To endN
        tgtArray(index) = i
        index = index + 1
    Next i
 

そして呼び出し元「Main」の処理に戻り、

    For i = 0 To UBound(tgtArray)
        Sheets("Sheet2").Cells(i + 2, "A") = tgtArray(i)
    Next i
 

上記のFor文で、配列の内容をA列2行目以降に出力しています。

さいごに

このままのマクロでは使いどころがなさそうですが、
何かの処理と組み合わせ、うまく使ってみてください!

Lenoco

COMMENT

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