[[20250723112139]] 『数字と文字が並ぶ文字列から抽出したい』(過労) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『数字と文字が並ぶ文字列から抽出したい』(過労)

閲覧ありがとうございます。

数字と文字が並んでいるセルの中から、
『A』の前にある数字はxx
『B』の前にある数字はyy
『C』は文字列に含まれていないので0
『D』の前にある数字はzz

と抽出するマクロのアドバイスお願いします。

B2から下に向かって100セルほどのデータが入力されています。

   A  B     C   D   E   F

 1    No. データ      A   B   C   D

 2  1  1A3B12C46D    1      3     12     46
 3  2  142B142C59D   0    142     142    59
 4  3  126A13B52C   126     13      52     0

B列のデータをC〜F列に抽出したのですが、
データ内で0の場合は文字も省略されており、
A,B,C,Dすべてそろっているわけではありません。
桁数も1〜4桁とバラバラです。

いっそマクロでなくても関数で抽出できるのであれば問題ないのですが、
どういった方法があるでしょうか。

0の場合でも省略されていないのであれば
FINDでAの場所を調べてLEFTで抽出して、、、
がセオリーかと思っています。

アドバイスよろしくお願いいたします。

< 使用 Excel:Excel2019、使用 OS:Windows11 >


 >関数で抽出できるのであれば問題ないのですが、

 では関数で

 C2:=IFERROR(-LOOKUP(1,-RIGHT(REPLACE($B2,FIND(C$1,$B2),100,""),{1,2,3,4})),0)
 右と下にコピー
 
(おそ松さん) 2025/07/23(水) 13:05:47

おそ松さん 様
コメントありがとうございます!
全く式の内容は読み解けていませんが、無事解決しました!!
(過労) 2025/07/23(水) 13:43:47

 老い先短い正規表現を使った例です。
 閲覧者のなんらかの参考になればと思います。

 Sub test()
     Dim re      As Object
     Dim matches As Object
     Dim s$, k&, j&
     Dim ary(1 To 4) As Long

     Set re = CreateObject("VBScript.RegExp")
     With re
         .Pattern = "(?:(\d*)A)?(?:(\d*)B)?(?:(\d*)C)?(?:(\d*)D)?"
     End With

     For j = 2 To Cells(Rows.Count, "B").End(xlUp).Row
         s = Cells(j, "B")
         Set matches = re.Execute(s)
         For k = 1 To 4
             ary(k) = matches(0).submatches(k - 1)
         Next
         Cells(j, "C").Resize(1, 4) = ary
     Next
 End Sub
 なお、C1:F1の文字が可変なら、それに応じて修正することもできるでしょう。
(xyz) 2025/07/23(水) 13:53:04

 >C2:=IFERROR(-LOOKUP(1,-RIGHT(REPLACE($B2,FIND(C$1,$B2),100,""),{1,2,3,4})),0)

 REPLACEよりLEFTの方がよかったかも

 C2:=IFERROR(-LOOKUP(1,-RIGHT(LEFT($B2,FIND(C$1,$B2)-1),{1,2,3,4})),0)
 
(おそ松さん) 2025/07/23(水) 14:09:24

 大事な確認を忘れてました。

 今後、新たな文字として「E」を追加する可能性ありですか?
 なければいいですが、 B列の文字列に「E」が含まれると問題が生じる場合があります。

 B列の文字列の途中に「E」があり、
 その直後が1桁または2桁の数字の場合です。
 例えば「26A13E52C」のようなものですね。
 どうなってしまうかは試してみて下さい。すぐに分かります。

 下の式に差し替えることで回避できます。

 C2:=IFERROR(-LOOKUP(1,-RIGHT(SUBSTITUTE(LEFT($B2,FIND(C$1,$B2)-1),"E","★"),{1,2,3,4})),0)
 
(おそ松さん) 2025/07/24(木) 13:24:39

コメント返信:

[ 一覧(最新更新順) ]


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