|
▼ichinose さん:
こんばんは、しんです。
さっそくおまけのVBAコードまで教えて頂きありがとうございました。
さすがichinoseさんは相変わらず凄いですね。
ところで
>前半は、しんさん 考えてみて下さい。
ということなので、あちこち重複データ処理法を参考にして、ichinoseさんのコードとドッキングした結果、下記コード
'Option Explicit
Public i, j, k, NumberOfData
'====================================================================
Sub test()
Dim ans() As String
Dim sep1() As String
Dim sep2() As String
Dim ques_str As String
Dim moto_array() As String
Dim s_clct As Collection
Call DeleteDuplicates(NumberOfData)
'ques_str = "独歩31,谷崎55,独歩96,独歩100,谷崎98" '入力データ
For k = 1 To NumberOfData
ques_str = Cells(k, 2).Value
Call 文字列分解(ques_str, sep1(), "[0-9]+") '半角数字を取り出す
no_num = ques_str
For idx = LBound(sep1()) To UBound(sep1())
no_num = Replace(no_num, sep1(idx), "") '数字のない文字列作成
Next
moto_array() = Split(ques_str, ",") '元データをカンマ分割
sep2() = Split(no_num, ",") '数字のないデータをカンマ分割
Set s_clct = mk_unique_collection(sep2()) '重複なし作成
kdx = 0
For idx = 1 To s_clct.Count
wk = Filter(moto_array(), s_clct.Item(idx))
For jdx = LBound(wk) To UBound(wk)
ReDim Preserve ans(1 To kdx + 1)
If jdx = LBound(wk) Then
ans(kdx + 1) = wk(jdx)
Else
ans(kdx + 1) = Replace(wk(jdx), s_clct.Item(idx), "")
End If
kdx = kdx + 1
Next jdx
Next idx
If kdx > 0 Then
'MsgBox Join(ans(), ",") '出力データ表示
Cells(k, 5) = Join(ans(), ",") '出力データ表示
End If
Next k
End Sub
'=================================================================
Sub 文字列分解(strng, a_array() As String, pat As String)
'文字列分解というプロシジャーをちょっと拡張しました
'(というより、私の元コレクションはこっち)
Dim regEx, Match, Matches ' 変数を作成します。
Set regEx = CreateObject("VBScript.RegExp")
' 正規表現を作成します。
regEx.Pattern = pat
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() As String)
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
'=========重複行の削除と文字列の結合=================================
Sub DeleteDuplicates(NumberOfData)
Sheets("Sheet1").Activate
NumberOfData = Application.CountA(ActiveSheet.Range("A:A"))
For j = 1 To 6
i = 2
Do While i <= NumberOfData
If Cells(i, 1) = Cells(i - 1, 1) Then
Rows(i).Select
Cells(i - 1, 2).Value = Cells(i - 1, 2).Value & "," & Cells(i, 2).Value
Selection.Delete Shift:=xlUp
NumberOfData = NumberOfData - 1
End If
i = i + 1
Loop
Next
End Sub
により、題意のデータ列
A B
行燈 芥川10,鴎外157
囲炉裏 独歩31,谷崎55
囲炉裏 独歩100
囲炉裏 独歩96
鵜飼い 鴎外26
お社 鴎外17,谷崎51
は、次のように変換することができました。題意のデータ列はA列であらかじめソートしておく必要はありますが・・・。
A B E
行燈 芥川10,鴎外157 芥川10,鴎外157
囲炉裏 独歩31,谷崎55,独歩100,独歩96 独歩31,100,96,谷崎55
鵜飼い 鴎外26 鴎外26
お社 鴎外17,谷崎51 鴎外17,谷崎51
ichinoseさんのおかげで大変勉強になりました。これからもこれに懲りずまたいろいろ教えて頂けることを祈っております。どうかよろしくお願い致します。
|
|