こんばんは。
試してみましたが、どうやら、切り分けの仕方が、二種類あるようなので、切り分けの仕方を二つに分けてみました。大量になると、目では追えませんが、抜けのチェックをしてみました。サンプルでは、抜けは出ていませんが、以下のコードの、Stop のコメントブロックを外すとできます。なお、VBAでは、全角と半角の区分けがややこしいので、一旦、半角にできるものは半角にして、出力の際に全角にしました。原本と食い違いが若干出てきます。
たぶん、必要はないとは思いますが、あまり何度も繰り返して使うようでしたら、
ツール-参照設定で、Microsoft VBScript Regular Express 5.5 にチェックを入れて、
前:Dim Re As Object
↓
Dim Re As VBScript_RegExp_55
前:Set Re = CreateObject("VBScript.RegExp")
↓
Set Re = New VBScript_RegExp_55
としてください。(こちらは、XP + IE7 ですから、若干、その表示が変わることがあります。)
'-----------------------------------------------------
Dim Re As Object
Dim j As Long
'出力先
Const oSH As String = "Sheet2" 'シート名
Const COL As Integer = 1 '出力列
'これを実行
Sub LinePickUp1()
Dim rng As Variant
Dim ret As Variant
Dim n As String
Dim c As Variant
Dim k As Long
Set Re = CreateObject("VBScript.RegExp")
If WorksheetFunction.CountA(ActiveSheet.Cells) < 2 Then
MsgBox "シートには何もありません。", vbInformation
Exit Sub
End If
Set rng = Range("A1", Range("A65536").End(xlUp))
j = 1
For Each c In rng
If Len(c.Value) > 0 And InStr(1, c.Value, "(会議概要)", vbTextCompare) > 1 Then
n = Mid(Trim(c.Value), 1, InStr(1, c.Value, "(", vbTextCompare) - 1)
k = k + 1
ElseIf Len(Trim(c.Value)) > 0 And k > 3 Then
n = ""
End If
If Len(c.Value) > 0 And InStr(Trim(c.Value), "▲") > 0 Then
ret = Pickup(c.Value)
Listup n, ret
ElseIf Len(c.Value) > Len(n) And InStr(c.Value, n) = 0 Then
ret = Pickup(c.Value)
Listup n, ret
End If
Next c
Set Re = Nothing
Application.Goto Worksheets(oSH).Range("A1")
MsgBox "出力されました。", vbInformation
End Sub
Private Function Pickup(strLine As Variant)
Dim Matches As Object
Dim Match As Object
Dim Ar() As String
Dim j As Integer
Dim ArStr As Variant
Dim v As Variant
Dim a As Variant
strLine = Trim(strLine)
strLine = StrConv(strLine, vbNarrow) '一旦半角
strLine = Replace(strLine, "(", "(", , , vbBinaryCompare)
strLine = Replace(strLine, ")", ")", , , vbBinaryCompare)
If InStr(1, strLine, "(", vbTextCompare) = 1 Then
strLine = Mid(strLine, InStr(1, strLine, ")", vbTextCompare) + 1)
End If
ArStr = Split(strLine, "▲")
With Re
.Pattern = "([^(]+)[\s(]*(([^)]+))*([A-龠]+)$"
.Global = True
For Each v In ArStr
If InStr(1, v, "、", vbTextCompare) Then
a = Split(v, Chr(164)) '「、」半角
ReDim Preserve Ar(j + 2)
a(0) = StrConv(a(0), vbWide) '全角に戻す
Ar(j) = a(0)
Ar(j + 1) = ""
a(1) = StrConv(a(1), vbWide) '全角に戻す
Ar(j + 2) = a(1)
j = j + 3
ElseIf .test(v) Then
Set Matches = .Execute(v)
For Each Match In Matches
On Error Resume Next
With Match
ReDim Preserve Ar(j + 2)
Ar(j) = StrConv(.Submatches(0), vbWide) '全角に戻す
Ar(j + 1) = StrConv(.Submatches(1), vbWide)
Ar(j + 2) = StrConv(.Submatches(2), vbWide)
End With
On Error GoTo 0
j = j + 3
Next
End If
Next v
End With
Pickup = Ar()
End Function
Private Sub Listup(n As String, ret As Variant)
Dim dum As Variant
'出力
Dim i As Integer
With Worksheets(oSH)
On Error Resume Next
dum = Empty
dum = UBound(ret)
On Error GoTo 0
If Not IsEmpty(dum) Then
For i = 0 To UBound(ret) Step 3
On Error Resume Next
.Cells(j, COL).Value = n
.Cells(j, COL + 1).Value = ret(i) & ret(i + 1)
.Cells(j, COL + 2).Value = ret(i + 2)
On Error GoTo 0
j = j + 1
Next i
Else
'Stop '抜けのチェック用
End If
End With
End Sub
お礼
上手くいきました ありがとうございます。 長時間お付き合いさせてすいませんでした。 ですが、本当に助かりました。 Wendy02さんのような方がいらっしゃって本当に感謝しております。 本当にありがとうございました。