忍者ブログ

リストにある文字列を含むか判定

2021年06月13日
テーブルを作ったのはいいけど、不要なデータが紛れ込んでいた!!

正しいデータのリストがあって、不要データか判別したい。
そんなニーズを叶えるマクロを作ってみた。




いきなり作りたくなる気持ちを抑えて、まずはネットで検索。
クリーンヒット!

https://kirinote.com/excelvba-listcharacter/

もろにやりたいことを実現するページを発見。

参考サイトでは色分けをしていたけど、
右側のセルにキーワードをいくつ含むかカウントする処理を入れた。


リストの内容を配列に格納するのがポイントで、
セルを参照した処理だと行数の多いリストでは処理しきれない。

行ループについても配列にして、出力も配列に格納したほうが早いけど
手間の割に劇的な効果はないと思うのでこのまま。

対象のシート名、テーブルのタイトル行、参照列、出力列を定数化した。



以下、ソース。




Sub リストの文字があるかどうか探す()
'https://kirinote.com/excelvba-listcharacter/

Const KeySHname = "keyData"
Const TableSHname = "tableData"
Const TitleRow = 1
Const KeyCol = 3 '検索対象列
Const ColOut = 4 '出力列

Dim LastRow As Long
Dim Key1List() As String
Dim Key2List() As String
Dim Gyo As Long, i As Long, j As Long

'GCTデータを配列に格納
With Worksheets(KeySHname)
LastRow = .Cells(Rows.Count, 1).End(xlUp).Row
ReDim Preserve Key1List(LastRow - 2) '配列の要素数を指定
ReDim Preserve Key2List(LastRow - 2) '配列の要素数を指定

'リストの文字列を配列に格納
For Gyo = 2 To LastRow
i = Gyo - 2
Key1List(i) = .Cells(Gyo, 1)
Key2List(i) = .Cells(Gyo, 2)
Next Gyo

End With

'格納前に初期化
Worksheets(TableSHname).Select
Range(Cells(TitleRow, ColOut), Cells(Rows.Count, ColOut + 1)).ClearContents
Cells(TitleRow, ColOut) = "Hit1"
Cells(TitleRow, ColOut + 1) = "Hit2"

LastRow = Cells(Rows.Count, KeyCol).End(xlUp).Row '最終行を更新

For Gyo = TitleRow + 1 To LastRow
Application.StatusBar = "データ処理中(" & Gyo - 1 & "/" & LastRow - 1 & ")"
For j = 1 To UBound(Key1List)
'リストの文字列が含まれている場合、
If InStr(Cells(Gyo, KeyCol), Key1List(j)) > 0 Then Cells(Gyo, ColOut) = Cells(Gyo, ColOut) + 1
If InStr(Cells(Gyo, KeyCol), Key2List(j)) > 0 Then Cells(Gyo, ColOut + 1) = Cells(Gyo, ColOut + 1) + 1
Next j
Next Gyo

Application.StatusBar = ""

End Sub


PR
Comment
  Vodafone絵文字 i-mode絵文字 Ezweb絵文字