- ベストアンサー
Excelでの文字列から数字を抽出する方法
- Excel又はスプレッドシートで、文字列から不特定の数値を抽出する方法を教えてください。
- タイトルに含まれる品番を検索し、他の列に抽出する方法も知りたいです。
- 商品カタログなどから一致する品番を検索して抽出する方法も教えてください。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
今までの補足でデータの形がわかってきたので修正版を作成しました。 EXCEL B2セルに =INDEX(TEXTSPLIT(INDEX(TEXTSPLIT(A2,"/"),COUNTA(TEXTSPLIT(A2,"/"))),{" ","×"}),1) Google スプレッドシート B2セルに =INDEX(TO_TEXT(SPLIT(INDEX(TO_TEXT(SPLIT(A2,"/")),COUNTA(SPLIT(A2,"/")))," ×")),1) 考え方は、スラッシュで区切って配列を作って、一番最後の値を取ってきて、今度は"空白"と"×"マークで区切って最初の値を取ってくる。ということを数式でやっています。 TO_TEXTは、一部の値が日付に自動変換されてしまうのを防ぐためです。
その他の回答 (7)
- imogasi
- ベストアンサー率27% (4737/17069)
#2,#5です。 補足の画像を見ると、 下記のように、文章表現して、(当初)質問すべきだと思うが、どうだろう。 (1)各セルデータ文字列で、「/」に注目し、最後に出現する「/」を見つける。 (2)最後の「/」の後に続く文字列で、文字列の終端までの文字列を割りだす。 (3)(2)の中で、スペース(半角?)で2つに分けて、最初の文字列(数字、英字など構わず)を取り出す。 ただ(3)のスペースがなく、円マークが入っているのが見えたが(規則性を崩す状態だが)、誤りではないのか?どうにかならないか?。 ーー #5で(1)、(2)の処理は実現済み(微修正で)と言えると思う。 ーーー それと例外的に、「/」が、存在しないとか,規則を乱すデータが現れたとき、手修正でもよいかなど、 決める必要はあると思うが。
- HohoPapa
- ベストアンサー率65% (455/693)
正確な仕様が把握できないものの おそらく、 "/"、いくつかの数字、"-"、いくつかの数字 がつながった文字列 このデータをテキストファイル(タイトル?)から探すこととなるものと思います。 であれば、後記コードはいかがでしょうか? なお、条件を満たす文字列が複数回登場する場合は、最初に登場する文字列を拾ってみました。 Function GetSBan(tgCell As Range) As String Dim i As Long Dim j As Long Dim HitPos As Long Dim tgLen As Long Dim HitText As String Dim tgStr As String Dim HitFlg As Boolean tgStr = tgCell.text HitFlg = False GetSBan = "Not Found Text" tgLen = Len(tgStr) If tgLen <= 4 Then Exit Function If HitFlg = True Then Exit Function 'n-nを探す HitPos = 0 HitText = "" For i = 1 To tgLen - 2 If ( _ (IsNumeric(Mid(tgStr, i, 1)) = True) And _ (Mid(tgStr, i + 1, 1) = "-") And _ (IsNumeric(Mid(tgStr, i + 2, 1)) = True) _ ) Then HitPos = i HitText = Mid(tgStr, i, 3) HitFlg = True '後方向の数字がなくなるまで、末尾に文字列加算 For j = HitPos + 3 To tgLen If IsNumeric(Mid(tgStr, j, 1)) = True Then HitText = HitText & Mid(tgStr, j, 1) Else Exit For End If Next j '前方向の数字がなくなるまで、先頭に文字列加算 For j = HitPos - 1 To 1 Step -1 If HitFlg = True And Mid(tgStr, j, 1) = "/" Then GetSBan = HitText Exit Function End If If IsNumeric(Mid(tgStr, j, 1)) = True Then HitText = Mid(tgStr, j, 1) & HitText Else HitFlg = False End If Next j End If Next i End Function
補足
お世話になっております。 詳細な説明を記述しておらず申し訳ありません。 以下画像が完成形となりますのでご確認いただければと思います。 それとFunctionの記述は標準モジュールだと思うのですが、VBA名がありませんと表記されます。 よろしくお願いいたします 画像サイト https://d.kuku.lu/b36c18875
- imogasi
- ベストアンサー率27% (4737/17069)
#2です。 補足を頂き有難うございます。しかし 例データとして、A列が5行以上と結果をB列でも5例以上欲しかったが、B列の回答がありません。 それでは、答えようがない。 ーーー 勝手に、想像して、やって見ると、VBAでは A列の各セルで、「/」(半角文字とする)の現れる最後の「/」の、後続部分と1つ前のカタマリを捉えるのは 例データ 当方で、元のデータを多少修正して勝手に作ったが、 A列データは、A1:A5 タイトル 10x28mm ボルト(省略) xx/zz/ 小型 /58-44×2 G-1 段ボール 特大サイズ(省略)/yy /4-20 G-1 スピーカー 低音強め(省略) 小型 /97-84 G-1 ドライバー プラス(省略) 電動/sss /58-44+55-78 G-1 ーー VBAのコードは標準モジュールに Sub test01() lr = Range("A100000").End(xlUp).Row MsgBox lr ’最終行番号確認 '--- For i = 2 To lr ’全行上から繰り返し処理 x = Cells(i, "A") ’A列データについて y = Split(x, "/") ’/で文字列分割 s1 = UBound(y) '最終の文字列のカタマリ MsgBox y(s1) s2 = UBound(y) - 1 ’最終の1つ前のカタマリ MsgBox y(s2) Next i End Sub ーー 結果は 上記の、どちらか1つ(S1)、または最後の2つ(s2&s1など)をB列同行にセットすることになるだろう。質問では不明確。 上記例でも 第4行目の「スピーカー 低音強め(省略) 小型 /97-84 G-1」 では(/が1つしかなく)論理が破綻しているようで、実際のデータのタイプに関して、十分説明を受けて、手を加える必要があるが、 補足でも、説明がなく、そのままで打ち切らざるを得ない。 ・関数でもできそうだが、略。 ・VBAで上記を私製関数化はできる。 ・正規表現(VBA、Fso)などの、「パターン」についても、出来そうだが、略。
補足
ご回答いただきありがとうございます。 お世話になっております。 度々説明不足で申し訳ありません。 どういう情報が必要かどういう情報を伝えればよいか 正直迷っているところです。 (どう伝えればよいか迷っています) 下記Excelでの説明画像ですので、 ご確認いただけると助かります。 よろしくお願いします。 https://ibb.co/jT8vbZL
- micnak
- ベストアンサー率60% (3/5)
Googleスプレッドシートの場合です。 B2セルに =Transpose(FILTER(TRANSPOSE(TO_TEXT(SPLIT(A2,"/ ×+"))),IFERROR(FIND("-",TRANSPOSE(SPLIT(A2,"/ ×+"))),false))) として下にコピーします。 Excelでもできますが、Office365バージョン限定で =TRANSPOSE(LET(title,TRANSPOSE(TEXTSPLIT(A1,{"/"," ","×","+"})),FILTER(title,IFERROR(FIND("-",title),FALSE))))
補足
ご回答いただきありがとうございます 上記関数にて大体抽出できました。 説明になかったのですが スピーカー 低音強め(省略) 小型 /97-84 G-1 省略の箇所にN-001 N-002 N-003という風な文字が入る場合にはじかれてしまいました。 スピーカー 低音強め N-001 N-002 N-003 小型 /97-84 G-1 上記のような感じです よろしくお願いいたします
- INOUE_AOSHIMA
- ベストアンサー率0% (0/1)
例えば、A1に 段ボール 特大サイズ(省略) /4-20 G-1 が入力されていて、その中から、4-20を抽出するとすると、その関数を B1に記載するならば、関数のネストが重複して見辛いですが、以下の関数の組み合わせになります。 =LEFT(MID(A1,FIND("/",A1,1)+1,LEN(A1)-FIND("/",A1,1)),FIND(" ",MID(A1,FIND("/",A1,1)+1,LEN(A1)-FIND("/",A1,1)))-1) 要は、例文の文字列には、必ず/(スラッシュ)が一つ存在し、その次の数字から、右に抽出し、その抽出に於いて、半角スペースまでとしています。
補足
お世話になっております。 説明文に記載していなく申し訳ありません。 スピーカー 低音強め M1/M2/M3 N-001 N-002 N-003 小型 /97-84 G-1 のように/や-を使用している場合の商品があります。 この商品の場合にはじかれてしまいました。 よろしくお願いいたします。
- imogasi
- ベストアンサー率27% (4737/17069)
質問の書き方が不完全と思う。 元データがA列にあるとして 結果はB列に、どういう文字列(数字と記号?)に(結果文字列に)なってほしいのか、模擬例として、対応各行について書くべきだ。 結果の方を明示しない質問者が多いがそれでは、役に立たない。 その他に注釈として、文章で、「/は1セルに2個以上ない」、とか書くものだ。 ーー 回答が出ているが、 (1)スラッシュの位置を見つけて、そこから終りまでを抜き出す(作り出す)でよいのか。 MID関数などを使うことになる。 FIND関数 =FIND("/",A1) 位置の発見 LEFT関数、MID関数 切りだし (2)ほかに、/で、「データ」ー「区切り位置」を使って、その左右部分を別セルに分離 (3)もう少し、複雑になれば、正規表現、VBAのFindメソッドなどの利用になるだろう。
補足
ご回答いただきありがとうございます。 imogasi 様のおっしゃる通りでこちらの説明不足でした。 ご指摘いただきありがとうございます。 改めてご説明させていただきますと A列に商品タイトル一覧を記載 ↓ タイトルの最後付近に商品品番があるので 商品品番(58-44など)をB列かそれ以降の列に抽出 この動作を関数でできますでしょうか? (関数またはVBA) またご指摘いただいたように商品によってタイトルには 「10x28mm ボルト M1/M2/M3 小型 /58-44×2 G-1」 複数のスラッシュを使用しておりました。 よろしくお願いします。
- aokii
- ベストアンサー率23% (5210/22062)
スラッシュ以降が品番のようですので、以下の式で品番を抽出してはいかがでしょうか。(A2セルのデータから品番を抽出) =MID(A2,FIND("/",A2)+1,100)
補足
回答いただきありがとうございます。 一歩完成に近づきました! 上記関数を使用し大体の部分は抽出ができました。 下記関数を使用し抜き出したデータです。 14-44×2 G-1 あとは×2 G-1 が不必要なのですが この部分のみ消すことは可能でしょうか? よろしくお願いします。
お礼
修正ありがとうございます。 今回の関数を当ててみたところ 希望の通りに品番が抽出されました。 何点であった複数の/や- も解決でき、 作業の効率化になります。 ありがとうございました
補足
修正ありがとうございます。 今回の関数を当ててみたところ 希望の通りに品番が抽出されました。 何点であった複数の/や- も解決でき、 作業の効率化になります。 ありがとうございました