[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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.