共通文字を削除 ②

昨日は、文字列内にある共通文字を「意味が通じる範囲に於いて」削除し、文字列全体を短くしてみた。
infoment.hatenablog.com
今日は昨日に引き続き、別パターンの文字列に対応してみる。

f:id:Infoment:20190509222847p:plain

今回のパターンは、こんな感じ。
f:id:Infoment:20190509222922p:plain

最小値と最大値を、ニョロ(~)でつなぐタイプの人にも対応できるようにする。
ちなみに昨日のパターンは、同じ内容でも、こんな表現だった。
f:id:Infoment:20190508223818p:plain

昨日の繰り返しになるが、こういう人も居る。
f:id:Infoment:20190508223116p:plain

今回の方針は、以下の通り。

  1. 正規表現を用いる。
  2. 一文字以上の英字ののち「-」で繋がれた一桁以上の数字があって、その最小値と最大値が「~」で繋がれている。
  3. 「~」内に省略された数字は、必ず「連続」している(1,3,5,6のような飛び飛びの値ではない)。

以上を踏まえたコードがこちら。

Sub HogeTest()
    Dim str As String
        str = Range("C5").Value

 ' Microsoft VBScript Regular Expressions 5.5 参照済み。
    Dim myReg As RegExp
    Set myReg = New RegExp
        ' 後ほど「~」は半角に矯正するため、パターンも「~」としている。
        myReg.Pattern = "([A-Z]+)\-(\d+)~([A-Z]+)\-(\d+)"
    Dim MC As MatchCollection
    Dim SM As SubMatches
    
        ' 大文字と小文字、全角と半角の混在をここで矯正する。
        str = StrConv(str, vbNarrow + vbUpperCase)
        
        If myReg.test(str) Then
            Set MC = myReg.Execute(str)
            Set SM = MC(0).SubMatches
            
            Dim Min As Long
                Min = SM(1)
            Dim Max As Long
                Max = SM(3)
            Dim i As Long
            Dim v() As Variant
            ReDim v(Min To Max)
                For i = Min To Max
                    v(i) = i
                Next
                str = SM(0) & "-" & Join(v, ",")
        End If
        MsgBox str
End Sub

f:id:Infoment:20190509223543p:plain

今回も、何とかうまくいったようだ。
そしてまた一つ、運用時のルール不在が温存され、VBAerの例外対応力だけが勢いよく育まれるのでした。

参考まで。