|
▼しん さん:
こんばんは。
>とあるwebサイトの質問箱に
>
>A B
>1行燈 芥川10,鴎外157
>2囲炉裏 独歩31,谷崎55
>3囲炉裏 独歩96
>4鵜飼い鴎外26
>5お社鴎外17
>
>というテーブルがあって、これを
>
>A B
>1行燈 芥川10,鴎外157
>2囲炉裏 独歩31,96,谷崎55
>3鵜飼い鴎外26
>4お社鴎外17
>
>のように並び替えしたいという質問がありましたが、これなどもichinoseさんの魔術にかかれば簡単に解決できるのでしょうね!
簡単ではありませんよ!!
ただ、文字列解析と言うのは、最終的には一文字ずつチェックしていけば
何とかなりそうですよね?
上記の問題は、「おまけ」みたいなもののようですから、
一部だけ・・・。
この問題の入力データの2行目、3行目の「囲炉裏」のB列
「独歩31,谷崎55,独歩96」とまとめるのはガチャガチャ(←表現難しい?)
すれば何とかなりそうですよね・・・。
では、ここから、-----「独歩31,96,谷崎55」に加工するとこだけ。
これだったら、ここで投稿したプロシジャーを使えば何とかなるもので・・。
'====================================================================
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
ques_str = "独歩31,谷崎55,独歩96,独歩100,谷崎98" '入力データ
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(), ",") '出力データ表示
End If
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
簡単なデータならOKだと思います。
Filter関数を使ってますから、また、漏れが心配だけど、
ダメならひとつづつチェックするしかないでしょうね!!
前半は、しんさん 考えてみて下さい。
|
|