[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『切り貼り 2』(choi)
お世話になります。
[[20150428160902]] の応用ができずお助けください。
質問)
表1のA列−B列の組みで、A列の文章から表2のように
“一つながりの”カタカナ(全角、半角)“のみ”バラして表示する
−表1− A B 会社アイウ 135 A-3,カキク,営)サシス Ca =タチ=ツ= J9 −表2− E F アイウ 135 カキク Ca サシス Ca タチ J9 ツ J9
説明)
・ネット上の表、文章などからA,B列にコピペします
・表1のデータ範囲は「A2-B500」までを想定
・表2のデータ範囲は「E2-F???」(表1の内容による)
・A列の文章は一行に50字程度までとします
・A列の文章は全ての文字種を含みます
・A列にあるカタカナは、区切られているとは限りません
返信遅れがちになるかも知れませんが、よろしくお願いします。
< 使用 Excel:Excel2010、使用 OS:Windows7 >
Sub とりあえず() Dim i As Long Dim ss As String, s As String Dim dic As Object Dim w As Variant Dim c As Range Dim d As Variant
Set dic = CreateObject("Scripting.Dictionary") For Each c In Range("A2", Range("A" & Rows.Count).End(xlUp)) ss = "" For i = 1 To Len(c.Value) s = Mid(c.Value, i, 1) If StrConv(s, vbWide) = StrConv(StrConv(s, vbWide), vbHiragana) Then ss = ss & " " Else ss = ss & s End If Next
w = Split(WorksheetFunction.Trim(ss)) For Each d In w dic(dic.Count) = Array(d, c.Offset(, 1).Value) Next Next
Range("E2").Resize(dic.Count, 2).Value = WorksheetFunction.Transpose(WorksheetFunction.Transpose(dic.items))
End Sub
(マナ) 2015/07/29(水) 21:21
追記-17:38
提示いただいたコードに業務そっちのけでチャレンジしました。
一応うまくいってるようですが、何せ文字通り他の人からの
“切り貼り”なので今ひとつ自信が持てません。
詳しい方、マチガイ、改善点など添削お願いできないでしょうか?
Sub Test()
Dim i As Long Dim ss As String, s As String Dim dic As Object Dim w As Variant Dim c As Range Dim d As Variant Dim objRE As Object
Set dic = CreateObject("Scripting.Dictionary") Set objRE = CreateObject("VBScript.RegExp")
With objRE .Pattern = "[\uFF61-\uFF9F\u30A1-\u30F6ー]+" '全半角 .IgnoreCase = True .Global = True For Each c In Range("A2", Range("A" & Rows.Count).End(xlUp)) ss = "" For i = 1 To Len(c.Value) s = Mid(c.Value, i, 1) If .Test(s) = False Then ss = ss & " " Else ss = ss & s End If Next w = Split(WorksheetFunction.Trim(ss)) For Each d In w dic(dic.Count) = Array(d, c.Offset(, 1).Value) Next Next End With Set objRE = Nothing Range("E2").Resize(dic.Count, 2).Value = WorksheetFunction.Transpose(WorksheetFunction.Transpose(dic.items)) End Sub
気持ちとしては出きるだけ簡単なコードにしているつもりですが。
Sub とりあえず3() Dim i As Long Dim ss As String, s As String Dim dic As Object Dim w As Variant Dim c As Range Dim d As Variant
Set dic = CreateObject("Scripting.Dictionary") For Each c In Range("A2", Range("A" & Rows.Count).End(xlUp)) ss = c.Value For i = 1 To Len(ss) s = Mid(ss, i, 1) If StrConv(s, vbWide) = StrConv(StrConv(s, vbWide), vbHiragana) _ And Not s Like "[゙゚ーー]" Then Mid(ss, i, 1) = " " End If Next
w = Split(WorksheetFunction.Trim(ss)) For Each d In w Do While d Like "ー*" d = Mid(d, 2) Loop If Len(d) > 1 Then dic(dic.Count) = Array(d, c.Offset(, 1).Value) Next Next
Range("E2").Resize(dic.Count, 2).Value = WorksheetFunction.Transpose(WorksheetFunction.Transpose(dic.items))
End Sub
(マナ) 2015/07/30(木) 17:38
(マナ) 2015/07/30(木) 19:34
.Pattern = "[^\uFF61-\uFF9F\u30A1-\u30F6ー]+" .Global = True For Each c In Range("A2", Range("A" & Rows.Count).End(xlUp)) ss = .Replace(c.Value, " ")
w = Split(WorksheetFunction.Trim(ss))
(マナ) 2015/07/30(木) 19:54
Sub test2() Dim dic As Object Dim c As Range Dim objRE As Object Dim matches As Object Dim m As Object
Set dic = CreateObject("Scripting.Dictionary") Set objRE = CreateObject("VBScript.RegExp")
With objRE .Pattern = "[\uFF61-\uFF9F\u30A1-\u30F6ー]+" '全半角 .IgnoreCase = True .Global = True For Each c In Range("A2", Range("A" & Rows.Count).End(xlUp)) Set matches = .Execute(c.Value) For Each m In matches dic(dic.Count) = Array(m.Value, c.Offset(, 1).Value) Next Next End With
Range("E2").Resize(dic.Count, 2).Value = WorksheetFunction.Transpose(WorksheetFunction.Transpose(dic.items)) End Sub
ご指摘とおり、一文字ずつマッチさせるのは不経済です。 なお、正規表現のパターンは詳しく見ていません。
(γ) 2015/07/30(木) 20:43
以前に区切り記号を目印に抽出する方法を学んだんですが、
今回のように“一つなぎ”で処理するのには一文字ずつ
マッチさせるのは理にかなってるかな..と大いに参考に
なったんですが...
両方のやり方をご教示いただき、感謝します。
正規表現は???で、キチンと理解できるまでは無暗に?
使わない方がいいですかねぇ〜
あるいは“火傷”負うのも精進のためにはいいかも...とか。
これからもよろしくお願いします。
(choi) 2015/07/30(木) 22:32
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.