A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
私の作った関数で、
http://oshiete.goo.ne.jp/qa/9448573.html
の問題を解いてみました。その上で、少し手を加え、完成形とさせていただくことにしました。
---------
元データ
A1234B-1X-BQQ,120-140cm
A2542C-6R-BQQ,120-140cm
A3642D-11X-BQQ,180-200cm
A3642D-1111-B QQ, 180-200 cm
--------------
検索後のデータ
A1234B-1X
A2542C-6R
A3642D-11X
--------------
数式:
=FindRegEx("(A\d{4}\w\-\d{1,2}[XRHF]).*",$A$1:$A$10,,ROW(A1))
() でくくることで、必要な部分だけを取り出すことが可能です。
INDEX関数が不要になりました。
すでに、私の関数コレクション・アドインに加えました。
私は、とても便利なものができたと思っています。
Function FindRegEx(serTxt As String, rng As Range, Optional ig As Boolean = True, Optional idx As Long = 0)
'para1:正規表現, para2:範囲, para3:オプション ig=大文字小文字無視(デフォルト無視),index
Dim Re As Object
Dim Ms As Object
Set Re = CreateObject("VBScript.RegExp")
Re.Pattern = serTxt
Re.Global = True
If ig = False Then
Re.IgnoreCase = False
Else
Re.IgnoreCase = True
End If
Dim c As Range
Dim gl As String
Dim arArea
Dim i As Long
ReDim arArea(1 To 30)
For Each c In rng.SpecialCells(xlCellTypeConstants, 23).Cells
If Re.Test(c.Value) Then
Set Ms = Re.Execute(c.Value)
i = i + 1
If Ms(0).Submatches.Count > 0 Then
arArea(i) = Ms(0).Submatches(0)
Else
arArea(i) = c.Value
End If
End If
Next
If i > 0 Then
ReDim Preserve arArea(1 To i)
Else
arArea(1) = 0
End If
If UBound(arArea) >= idx Then
FindRegEx = arArea(idx)
Else
FindRegEx = ""
End If
End Function
No.2
- 回答日時:
#1の回答者です。
補足で、同じような説明をされても、私のほうとしては、申し訳ありませんが、今の段階で、手を加えるつもりはありません。目的にはかなっていると思うからです。
ただ、正規表現自体は、今回は必須です。
=FindRegEx("KB\d{1,2}_\dA1",$A$1:$H$10)
"KB\d{1,2}_\dA1" 検索値
$A$1:$H$10 検索範囲
結果:KB10_1A1
KB12_2A1
KB2_1A1
が検出されます。
もちろん、ご質問の前言を翻して、マクロは不可とするなら、それも結構ですが、マクロ以外のお答えをする予定はしておりませんので、あらたに関数の質問を出してください。
>自分で考えたのは検索値をひたすらIFで判定しまくるってやつですが、
そういう部分を見せると相手には良く伝わるはずです。何に対して、どのようにして、結果を得ようとしているか、ワークシートに数式で、このように検出しているのだという、より具体的なイメージを与えるのがよろしかろうと思います。
No.1
- 回答日時:
ご質問が、わかりにくいです。
>「KB10_1A1」という検索値に対して参照先が「KB*_*A1」と
ワイルドカードの用語に意味を取り違えていませんか?
もし、その質問どおりなら、無理です。逆ではありませんか?
KB*_*A1 という検索値(正規表現なら、KB\d{1,2}_\dA1)
に対して、「KB10_1A1」などが被検索値があるというのではないでしょうか。
>「DZ5」というのに対し「DZ1~32」といった感じで参照値がワイルドカードを使
ではなくて、
「DZ* (正規表現なら DZ\d{1,2})
>検索値はSh4-C5、参照値はSh3-G4、返す値はSh3-E4です。
返す値?それもヘンです。
正規表現なら、Sh\d\-C\d
ということになります。
正規表現自体を理解していないと、話が見えないとは思いますが、簡単ですから、それは勉強してください。
-------------
'標準モジュール
Function FindRegEx(serTxt As String, rng As Range, Optional ig As Boolean = True)
'para1:正規表現, para2:範囲, para3:オプション ig=大文字小文字無視(デフォルト無視)
Dim Re As Object
Set Re = CreateObject("VBScript.RegExp")
Re.Pattern = serTxt
Re.Global = True
If ig = False Then
Re.IgnoreCase = False
Else
Re.IgnoreCase = True
End If
Dim c As Range
Dim gl As String
Dim arArea
Dim i As Long
ReDim arArea(1 To 30)
For Each c In rng.SpecialCells(xlCellTypeConstants, 23).Cells
If Re.Test(c.Value) Then
i = i + 1
arArea(i) = c.Value
End If
Next
If i > 0 Then
ReDim Preserve arArea(1 To i)
Else
arArea(1) = 0
End If
FindRegEx = arArea
End Function
数式例:
=FindRegEx("KB\d{1,2}_\dA1",$A$1:$H$10)
出力は配列ですから、INDEX関数を使い、複数の解を求めます。
=INDEX(FindRegEx("sh\d\-C\d",$A$1:$H$10),ROW(A1))
ドラッグコピーします。
大文字・小文字を分ける場合 (Falseが入る)
=INDEX(FindRegEx("sh\d\-C\d",$A$1:$H$10,FALSE),ROW(A2))
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excel 参照元の値を参照したい 1 2022/08/20 18:58
- Excel(エクセル) エクセルの複数のセルを一括で絶対参照にする方法 3 2023/06/14 15:57
- Excel(エクセル) エクセル バーコード作成で他のシートを参照するには? 2 2023/05/03 16:57
- Excel(エクセル) Excel セルに入っている日付を参照して、別シートのリストを表示させたい 1 2022/04/12 17:02
- Excel(エクセル) エクセル関数についてお教えください 3 2023/07/24 12:33
- Excel(エクセル) Excel 表の作成について 3 2022/06/16 12:15
- Excel(エクセル) エクセル 関数参照範囲のセルの表示 1 2023/03/16 14:55
- Excel(エクセル) エクセルのINDEXについて 2 2022/04/17 21:41
- Excel(エクセル) シート参照を含む数式を連続コピー 3 2022/12/10 11:42
- Excel(エクセル) VBA マクロ名のパスをとるには 2 2022/06/07 12:58
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセル 文字を増やしたい。
-
エクセルの計算
-
セルの内容表示が邪魔になる
-
Excel
-
Microsoft365に変えたのですが...
-
エクセル:一覧表に存在する文...
-
エクセルで日付を数字+アルフ...
-
エクセルでの作業計算方法について
-
エクセルで年休を管理する方法...
-
はがきについて。
-
【マクロ】その時、その時で変...
-
excelの不要な行の削除ができな...
-
Microsoft1Officeの互換ソフト...
-
エクセル関数を教えてください
-
Excel ピボットテーブルで日付...
-
【マクロ】読取専用のファイル...
-
【関数】適切な文字数の数字を...
-
時間によってファイル名が変わ...
-
ある列、或いは、ある行のセル...
-
UNIQUE関数が使えないバージョ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel 2019 のピボットテーブル...
-
[関数得意な方]教えて下さい・...
-
Excelにてある膨大なデータを管...
-
[関数について]わかる方教えて...
-
Excel初心者です。 詳しい方、...
-
excelの不要な行の削除ができな...
-
エクセル関数に詳しい方教えて...
-
INDIRECTを使わず excelで複数...
-
[オートフィルタ]で抽出された...
-
エクセルの神よ、ご回答を! エ...
-
エクセル関数に詳しい方、教え...
-
各ページの1番上の表示について
-
Excelで写真のような表を作った...
-
エクセルで不等号記号(≠)が上に...
-
数学 Tan(θ)-1/Cos(θ)について...
-
Excel 2019 は、SPILL機能があ...
-
Excelで全角を半角にしたいので...
-
条件付き書式を教えてください
-
Excel フィルターを掛けた状態...
-
[オートフィルタ]の適用範囲の...
おすすめ情報
わかりづらくて申し訳ないです。
ID「KB10_A1」がこの範囲「KB*_*A1」(条件?)で検索したいみたいなことなんですけど...
KB*_*A2やKB*_*A3などと条件があるので困ってます。
例えばセルC5の値(KB10_A1)の、頭(KB)と尾(A1)で検索(参照)かけたりってできますでしょうか?
「DZ5」のほうは頭(DZ)で検索できるとは思うのですが...
頭と尾がつくかどうかも何とかなりそうですが、できるだけ勝手に探してくれる(IF記述少)ものにしたいと思ってます。
自分で考えたのは検索値をひたすらIFで判定しまくるってやつですが、それだと150以上もあほみたいになりまして、PCがふるいのであまり重くすると落ちちゃうのですっきりスリムな方法がないかと思いまして...