読者です 読者をやめる 読者になる 読者になる

スラッシュ区切り文字を最後の要素を除いて表示

するマクロを組みました。

動きとしては下記の通りです。

【実行前】

f:id:zizamo2193:20170427212053p:plain

【実行後】

f:id:zizamo2193:20170427212105p:plain

 

 

以下ソースです。

/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/

Sub Macro2()
Dim In_str As String
Dim Out_str As String
Dim cls As Range
Dim cellB As Range
Dim cnt As Integer
cnt = 1
'シート1をアクティブに
Worksheets("Sheet1").Activate
In_str = ActiveSheet.Range("A" & cnt).Value
Do While In_str <> ""
    '列名の時は処理なし
    If In_str = "dt1" Then
    '処理なし
    Else
        Out_str = CreatePath(In_str)
        ActiveSheet.Range("B" & cnt).Value = Out_str
    End If
'次のセルを選択
cnt = cnt + 1
In_str = ActiveSheet.Range("A" & cnt).Value
Loop
End Sub
 
Function CreatePath(ByVal pValue As String)
Dim Arr As Variant
Dim ArrLen As Integer
Dim cnt As Integer
Dim RetStr As String
cnt = 0
'引数を"/"で千切って配列として取得
Arr = Split(pValue, "/")
'取得した配列の長さを取得
ArrLen = UBound(Arr)
Do While cnt < ArrLen
'"/"で千切った配列を最初から最後の一つ前まで文字列変数に入れていく
RetStr = RetStr & Arr(cnt)
'最後以外は配列要素の間に"/"を挿入する
    If cnt <> ArrLen - 1 Then
        RetStr = RetStr & "/"
    End If
'カウント変数をインクリメント
cnt = cnt + 1
Loop
'完成した文字列を戻り値に設定
CreatePath = RetStr
End Function

/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/

 

取り立てて解説するほどのところはありませんが、しいて言うなら、

In_str = ActiveSheet.Range("A" & cnt).Value

ここのところは、例えば今回のように、「A列にある要素を上から順にひとつづつ処理して、隣のB列に結果を書いていきたい」というような場合に便利だと思うのでポイントです。

Range()の中の部分で文字列結合をInteger変数を使って行えるというのがなんとも乱暴な感じがします。

 

あと

Dim Arr As Variant

の記載について、今回のようにSplitから返される配列の長さが不定の場合、あらかじめ格納する変数を宣言するときはこのVariant型で配列を宣言するといいみたいです。そのあとの処理で普通に文字列配列として使えていますが、配列に要素を格納した時点で型が決まったりするのでしょうか…

 

長さが不定の配列の宣言の仕方としてはRedimとPreserveというやり方もあるみたいですが、こちらの方がお手軽です。

 

以上二点がポイントです。