『数字と文字が並ぶ文字列から抽出したい』(過労)
閲覧ありがとうございます。
数字と文字が並んでいるセルの中から、
『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
老い先短い正規表現を使った例です。 閲覧者のなんらかの参考になればと思います。
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.