半角チルダ

ExcelVBA、その他。
覚え書きや、補足資料などのスクラップブック。
end-u(1037781)

■文章データの抽出

2012-07-15 21:00:00 | scrap
#ボツ回答シリーズ :)

Sheet1.A列に文章データが9000。抽出元。
Sheet2.A列に単語データが500。検索条件。
文章の中に単語が1つでも含まれていればSheet3.A列に抽出。

処理時間にあまり拘らないなら、AdvancedFilterメソッドを使う手法がある。
([データ]-[フィルタ]-[フィルタオプションの設定])
事前準備として、
1)抽出元文章データのSheet1.A1セルの「項目名」と
  検索条件単語のSheet2.A1セルの「項目名」を同じにする必要あり。
2)検索条件単語の頭にワイルドカード『*』を付けておく。
マクロは1行。
Sheets("Sheet1").Range("A1:A9000").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Sheets("Sheet2").Range("A1:A500"), CopyToRange:=Sheets("Sheet3").Range("A1"), Unique:=True

#データによっては激遅か..
#配列処理するなら文字数制限を考慮しないといけない?


元お題でのInStr関数を使った例。
Option Explicit
Sub test()
  Dim col As Collection
  Dim s() As String
  Dim i  As Long
  Dim v, vi, w, wi, c

  With Application
    .ScreenUpdating = False
    .EnableEvents = False
    .Calculation = xlCalculationManual
  End With

  With Sheets("Sheet1")
    v = .Range("A1", .Cells(.Rows.Count, 1).End(xlUp)).Value
  End With
  With Sheets("Sheet2")
    w = .Range("A1", .Cells(.Rows.Count, 1).End(xlUp)).Value
  End With

  ReDim s(1 To UBound(v), 0)
  Set col = New Collection

  For Each vi In v
    For Each wi In w
      If InStr(vi, wi) > 0 Then
        i = i + 1
        If Len(vi) < 912 Then
          s(i, 0) = vi
        Else
          col.Add VBA.Array(i, vi)
        End If
        Exit For
      End If
    Next
  Next

  If i > 0 Then
    With Sheets("Sheet3").Columns("A")
      .ClearContents
      .Resize(i).Value = s
      For Each c In col
        .Cells(c(0), 1).Value = c(1)
      Next
    End With
  End If

  Set col = Nothing
  With Application
    .Calculation = xlCalculationAutomatic
    .EnableEvents = True
    .ScreenUpdating = True
  End With
End Sub

Comment    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« ■Excel2010の選択したセルの... | TOP | ■Shell "cmd.exe /c md ""[dr... »
最新の画像もっと見る

post a comment

ブログ作成者から承認されるまでコメントは反映されません。

Recent Entries | scrap