[[20190807160758]] 『VBA 正規表現を使いたい』(ぽすと) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBA 正規表現を使いたい』(ぽすと)

VBAで検索する際、正規表現を使って色々試行錯誤してるのですが上手くいかないためどこが問題なのかお教え願います。

RegExpオブジェクトでExecuteメソッドを使用したいと思ってます。

表は例えば以下のようになっています。

        A        B        C         D        E         F
1               結果             **済**A    **取消     ****A
2                                 **A      *済*A     ****済
3                                 ***済     ***A
4                                **済*A    ***取消

B1に検索条件に合うものの件数を表示させます。検索データはD1からF4にあります。検索条件は「"済"があり"A"で終わらないもののみ」で、その件数を数えたいです。

(最終的に、1行ずつ検索条件に合致してる数をカウントするけれど1以上なら1とカウントするようにしたいと思ってますが、そこまでは出来ていません。)

以下が自分で書いたVBAです。
よろしくお願いします。

Sub kensaku ()

Dim e As Object, r As Object, g As Object
Dim p As String
Dim u As Long, i As Long

Set e = CreateObject("VBScript.RegExp")
p = "(^.*? = 済.*)(.*?!A$)"
´済を含みAで終わらない

With e

         .Pattern = p
         .IgnoreCase = True
         .Global = True

For i = 1 To 4
For u = 4 To 6

Set r = .Execute(Cells( i, u))

If r.Count > 0 Then
Set g = r(0).submatches
Range("B1").Value = g.Count
End If

Next u
Next i

End With
Set r = Nothing
Set e = Nothing

End Sub

< 使用 Excel:Excel2010、使用 OS:Windows10 >


 こういうこと?

 Sub test()
     Dim rng As Range, i As Long, ii As Long, n As Long
     Set rng = [d1:f4]
     With CreateObject("VBScript.RegExp")
         .Pattern = "(?=済)(?=[^A]*$)"
         For ii = 1 To rng.Columns.Count
             For i = 1 To rng.Rows.Count
                 If .test(rng(i, ii).Value) Then n = n + 1
             Next
             rng(rng.Rows.Count + 1, ii) = n: n = 0
         Next
     End With
     [b1] = Application.Sum(rng.Rows(rng.Rows.Count + 1))
 End Sub
(seiya) 2019/08/07(水) 16:37

 Like 演算子の方が簡単?

 Sub testLike()
     Dim rng As Range, i As Long, ii As Long, n As Long
     Set rng = [d1:f4]
     For ii = 1 To rng.Columns.Count
         For i = 1 To rng.Rows.Count
             If (rng(i, ii) Like "*済*[!A]") + (rng(i, ii) Like "*済") Then n = n + 1
         Next
         rng(rng.Rows.Count + 1, ii) = n: n = 0
     Next
     [b1] = Application.Sum(rng.Rows(rng.Rows.Count + 1))
 End Sub
(seiya) 2019/08/07(水) 16:43

ご返信頂きありがとうございます
早速実行してみまして、カウントしたい件数が出ました

色々調べて正規表現でのパターンの書き方を勉強したつもりが
違っていました
またExecuteメソッドは使わずTestメソッドにしているのはよくわかりませんでした
Like演算子の方がExcel関数っぽくて使いやすそうですね

正規表現の方を実行したのですが、
実行した後、データの下(D5からF5)にカウントした件数の数値が現れてしまいました
それはどのように表示させないようにできるのでしょうか?

また最終目標は行ごとにカウントして1以上なら1とカウントしたいのですが
上記の現象よりD1からD4をまとめて計算しているので
D1,E1,F1をまとめて計算するにはどのように書いたらいいでしょうか?

よろしくお願い致します

(ぽすと) 2019/08/09(金) 00:12


 >最終的に、1行ずつ検索条件に合致してる数をカウントするけれど1以上なら1とカウントするようにしたいと思ってます
 勘違いしました。

 Sub testLike()
     Dim rng As Range, i As Long, ii As Long, n As Long
     Set rng = [d1:f4]
     For i = 1 To rng.Columns.Rows.Count
         For ii = 1 To rng.Columns.Count
             If (rng(i, ii) Like "*済*[!A]") + (rng(i, ii) Like "*済") Then n = 1
         Next
         rng(i, rng.Columns.Count + 1) = n: n = 0
     Next
     [b1] = Application.Sum(rng.Columns(rng.Columns.Count + 1))
 End Sub

 行ごとの結果をデータ範囲の最終列の隣列に表示、全体の結果をB1。
 ですね?

 VBAでの正規表現のPatternを詳細な具体例を挙げて説明をしているサイトが無いので(私は見たことがありません)
 VBAでは正規表現の本来の全ての機能が使用できるわけではないので、試行錯誤を繰り返すしかないのでしょうね。

 正規表現のtestメソッドは、PatternにマッチしていればTrueを返します。
 この場合Execute メソッドでカウントする必要がないのでtestメソッドです。
(seiya) 2019/08/09(金) 09:54

ご返信ありがとうございます

さらに教えていただいたコードはまだ試せていないのですが、
以下ご指摘いただいたところで疑問があります

 >行ごとの結果をデータ範囲の最終列の隣列に表示、全体の結果をB1。
 >ですね?

行ごとの結果をデータ範囲の最終行の隣の列には表示したくありません。
全体の結果だけB1に欲しいのですが、
どこの部分で「行ごとの結果をデータ範囲の最終行の隣の列には表示」という
指示がされているか読み取れません

非表示にするコードが難しければ、
物理的に行を非表示にしてしまった方が早いでしょうか?
(ぽすと) 2019/08/10(土) 17:13


 ということは、行単位でマッチした行数をB2に表示。
 ですか?

 Sub testLike()
     Dim rng As Range, i As Long, ii As Long, n As Long
     Set rng = [d1:f4]
     For i = 1 To rng.Columns.Rows.Count
         For ii = 1 To rng.Columns.Count
             If (rng(i, ii) Like "*済*[!A]") + (rng(i, ii) Like "*済") Then
                 n = n + 1: Exit For
             End If
         Next
     Next
     [b1] = n
 End Sub
(seiya) 2019/08/10(土) 17:39

ご返信ありがとうございます

>行単位でマッチした行数をB2に表示

その通りです。B1に表示させたいです。
難しく考えてしまって色々いらない情報まで書いてしまいました。
すみませんでした。

頭で繰り返しの部分(nの部分)が上手くピンとこず、さらに勉強が必要だと思いました。

実行してみたらまたコメントさせて下さい
(ぽすと) 2019/08/12(月) 12:52


実行してみまして、実行されました。
ありがとうございます。

Like演算子でさらに条件を足してみたのですが実行すると思うように動きませんでした

例えば「****済**3」という最後に3がある物はさらに除きたい場合

If (rng(i, ii) Like "*済*[!A]") + (rng(i, ii) Like "*済") + (rng(i, ii) Like "*済*[!3]") Then

としても動きませんでした。書き方がおかしいのでしょうか?

(ぽすと) 2019/08/14(水) 22:19


 []は Character listのどれか一文字、!が先頭に付くとそれ以外。

 If (rng(i, ii) Like "*済*[!A3]") + (rng(i, ii) Like "*済") Then

 感に頼っても無駄なので、きっちり調べた方がいいと思いますよ?
(seiya) 2019/08/14(水) 22:58

ご返信ありがとうございます

調べが足らず質問しすみませんでした

実行出来ました。

色々な質問にご親切にお答え頂きありがとうございました
(ぽすと) 2019/08/15(木) 12:18


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.