|
▼しん さん:
おはようございます。
>Excelワークシートのあるセルに下記のような任意の文字列データ
>
>A02A02B12B13C22C22C23A02B13D345A02E99
>
>が入っていたとき、この文字列を英文字を先頭にした文字列群に分解し、その個数を文字列名と共に知りたい、すなわち
>
>A02:4, B12:1, B13:2, C22:2, C23:1, D345:1, E99:1
>
>のような解答(文字列データ)を得たいのですが、どのようなVBAコードを書けばいいのでしょうか?
以下の例はアクティブシートのセルE1に上記の
「A02A02B12B13C22C22C23A02B13D345A02E99」等の文字列が入っていた場合、
A列の1行目から「英文字を先頭にした文字列群」B列の1行目から「個数」を
セットします。
'======================================================================
Sub test()
Dim co As Collection
Dim ans()
Call 文字列分解(Range("e1").Value, ans())
Set co = mk_unique_collection(ans()) '重複なしの集合体の作成
For idx = 1 To co.Count
wk = Filter(ans(), co.Item(idx), , vbTextCompare)
cnt = UBound(wk) - LBound(wk) + 1 '個数の計算
Cells(idx, 1).Value = co.Item(idx)
Cells(idx, 2).Value = cnt
Next
Set co = Nothing
End Sub
'=====================================================================
Sub 文字列分解(strng, a_array())
Dim regEx, Match, Matches ' 変数を作成します。
Set regEx = CreateObject("VBScript.RegExp")
' 正規表現を作成します。
regEx.Pattern = "[A-Za-z][0-9]*"
regEx.IgnoreCase = True ' 大文字と小文字を区別しないように設定します。
regEx.Global = True ' 文字列全体を検索するように設定します。
Set Matches = regEx.Execute(strng) ' 検索を実行します。
idx = 1
For Each Match In Matches ' Matches コレクションに対して繰り返し処理を行います。
ReDim Preserve a_array(1 To idx)
a_array(idx) = Match.Value
idx = idx + 1
Next
Set regEx = Nothing
Set Match = Nothing
Set Matches = Nothing
End Sub
'======================================================================
Function mk_unique_collection(myarray())
Dim myclct As New Collection
On Error Resume Next
For idx = LBound(myarray()) To UBound(myarray())
myclct.Add myarray(idx), myarray(idx)
Next
Set mk_unique_collection = myclct
Set myclct = Nothing
On Error GoTo 0
End Function
これでプロシジャー「test」を実行してみて下さい。
A列B列の1行目から、
A02 4
B12 1
B13 2
C22 2
C23 1
D345 1
E99 1
という結果が得られました。
確認してみて下さい。
|
|