老親介護に悩む30~60代の方へ
老親介護ねっと[老人ホーム編]
トップ 老人ホームの選び方 介護関連ニュース 新規オープンホーム情報 老人ホーム取材レポート お問い合わせ リンク集 Q&A

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Like検索で一致した%の中身を解析できますか?

SQLのあいまい検索で
抽出条件 WHERE 項目1 LIKE 'A%B%C'
で抽出されたのが 'A1B2C'
だとすると、%に該当するのは1と2ですが、
これを導き出すことはできますか?

いくつかのパターンに当てはまる場合は、いずれか1つで構いません。
例えば、抽出条件'A%B%C'に対して'A1B2B3C'が抽出された場合
1と2B3 と 1B2と3 の両方の可能性がありますがどちらか一方がわかれば良いです。


まとめると
<入力>
パターン文字列 A%B%C
対象文字列 A1B2B3C

<出力>
1と2B3
または
1B2と3

こういうことはSQLまたはVBA(Excel、Access)で簡単にできるでしょうか?

1文字ずつ地道に調べればいつかは解析できるのでしょうが
同じことを他に誰かやっていないかと思い質問させていただきした。


【背景】
あるエラーメッセージが、メッセージマスタのどれに該当するかを調べたいです。

具体的に『氏名が入力されていません』というエラーメッセージを例にすると
これが『(項目)が入力されていません』というパターンのメッセ―ジであり、
(項目)に入るのが『氏名』であることを解析したいです。
パターンはSQLのLIKE検索で特定できたのですが、
(項目)に入る文字を調べるところで困ってしまいました。

よろしくお願いします。

投稿日時 - 2018-03-19 10:57:03

QNo.9479427

困ってます

質問者が選んだベストアンサー

Q、'A1B2C'で'A'と'B'とC'とに挟まれた文字を抽出できますか?
A、できますよ。

ただし、

1、'A'と'B'とC'とが必ず存在すること。
2、'A'と'B'とC'とが重複していないこと。
3、'A'と'B'とC'とが順番が固定であること。

が条件です。

>'A1B2B3C'

この場合は、"1"は条件に合致しているので簡単です。
が、"1B2"は例外処理となります。
VBAでシコシコとやるしかないと思います。
ということで、条件を満たしているとして・・・。
その場合は、CutStr()で抜き出せます。

Public Function CutStr(ByVal Text As String, _
            ByVal Separator As String, _
            ByVal N As Integer) As String
  Dim strDatas() As String
  
  strDatas = Split("" & Separator & Text, Separator, , 0)
  CutStr = strDatas(N * Abs((N <= UBound(strDatas))))
End Function

【補足】敢えて CutStr()で例外を抽出する場合は・・・

? CutStr(CutStr("A111B222B333C", "A", 2),"B",1) "B" & CutStr(CutStr("A111B222B333C", "A", 2),"B",2)
111B222

ということは、

Function MyCutStr(XXXX,XX,XX,A) AS String
 ・・・・・
End Funccion

A=0・・・標準抽出
A=1・・・例外抽出

という関数を用意すれば、シコシコとコードを書く必要はありません。

投稿日時 - 2018-03-19 12:34:37

お礼

早速の回答ありがとうございます。

やはり例外処理も考慮に入れると、いくらかはコードを書かないと実現できないんですね。
MyCutStrの使い方はわかりませんでしたが、
CutStrでやっていることは理解できるので流用させてもらいます!

投稿日時 - 2018-03-19 14:29:19

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

>事前に標準抽出か例外抽出かを調べた上で
>CutStrかMyCutStrを使い分けるのですね。

いや、それは手間でしょう。

今、MyCutStr()は、4番目の引数がなけりゃ《標準抽出》処理に分岐しています。4番目の引数が1であれば《例外抽出》に分岐しています。この所を改善せべきかと思います。

改善1、4番目の引数はなくす。
改善2、《標準抽出》と《例外抽出》の分岐を自動化する

 if strCount(Text, Separetor2)=0 Then
   標準抽出
 Else
   例外抽出
 End if

 このように、区切子が幾つ存在するのかを調べるstrCount()を用意して自動分岐させたがよいかもしれません。まあ、先の補足回答では、そこまでは、質問者の事情もあって踏み込んでいませんが・・・。

投稿日時 - 2018-03-19 17:24:48

お礼

No.2のお礼コメントは、回答No.2で提示してもらったコードの使い方について確認したかっただけなので
そのまま使おうと考えてるわけではないので大丈夫です。
いろいろ使いやすいように工夫してみます。

回答ありがとうございました。

投稿日時 - 2018-03-20 08:54:39

ANo.2

【補足】MyCutStr()について



Public Function MyCutStr(ByVal Text As String, _
            ByVal Separator1 As String, _
            ByVal Separator2 As String, _
            Optional P As Integer = 0) As String
  Dim strReturn As String
    strReturn = CutStr(CutStr(Text, Separator1, 2), Separator2, 1)
  If P = 0 Then
  Else
    strReturn = CutStr(CutStr(Text, Separator1, 2), Separator2, 1) & Separator2 & CutStr(CutStr(Text, Separator1, 2), Separator2, 2)
  End If
  MyCutStr = strReturn
End Function

投稿日時 - 2018-03-19 15:19:34

お礼

ありがとうございます。
事前に標準抽出か例外抽出かを調べた上で
CutStrかMyCutStrを使い分けるのですね。

投稿日時 - 2018-03-19 16:40:36