Excelでの文字列から数字を抽出する方法

このQ&Aのポイント
  • Excel又はスプレッドシートで、文字列から不特定の数値を抽出する方法を教えてください。
  • タイトルに含まれる品番を検索し、他の列に抽出する方法も知りたいです。
  • 商品カタログなどから一致する品番を検索して抽出する方法も教えてください。
回答を見る
  • ベストアンサー

Excelでの文字列から数字を抽出方法ありますか?

こんにちは。 Excel又はスプレッドシートにて 文字列(一つのセルでタイトル)から不特定の数値(商品品番)を抽出をしたいです。 (以下タイトルの感じ)  l            A           l B l C  1 タイトル 2 10x28mm ボルト(省略) 小型 /58-44×2 G-1 3  段ボール 特大サイズ(省略) /4-20 G-1 4 スピーカー 低音強め(省略) 小型 /97-84 G-1 5 ドライバー プラス(省略) 電動 /58-44+55-78 G-1 このような感じです。(品番は58-44など) 省略部分には詳細な説明などが入ります。 この品番を検索し他の列に抽出という流れになればと思います。 因みに商品カタログなどから検索して一致したものをという感じでも大丈夫です。 よろしくお願いします

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

  • ベストアンサー
  • micnak
  • ベストアンサー率60% (3/5)
回答No.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は、一部の値が日付に自動変換されてしまうのを防ぐためです。

kuro0331
質問者

お礼

修正ありがとうございます。 今回の関数を当ててみたところ 希望の通りに品番が抽出されました。 何点であった複数の/や- も解決でき、 作業の効率化になります。 ありがとうございました

kuro0331
質問者

補足

修正ありがとうございます。 今回の関数を当ててみたところ 希望の通りに品番が抽出されました。 何点であった複数の/や- も解決でき、 作業の効率化になります。 ありがとうございました

その他の回答 (7)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.7

#2,#5です。 補足の画像を見ると、 下記のように、文章表現して、(当初)質問すべきだと思うが、どうだろう。 (1)各セルデータ文字列で、「/」に注目し、最後に出現する「/」を見つける。 (2)最後の「/」の後に続く文字列で、文字列の終端までの文字列を割りだす。 (3)(2)の中で、スペース(半角?)で2つに分けて、最初の文字列(数字、英字など構わず)を取り出す。 ただ(3)のスペースがなく、円マークが入っているのが見えたが(規則性を崩す状態だが)、誤りではないのか?どうにかならないか?。 ーー #5で(1)、(2)の処理は実現済み(微修正で)と言えると思う。 ーーー それと例外的に、「/」が、存在しないとか,規則を乱すデータが現れたとき、手修正でもよいかなど、 決める必要はあると思うが。

  • HohoPapa
  • ベストアンサー率65% (454/690)
回答No.6

正確な仕様が把握できないものの おそらく、 "/"、いくつかの数字、"-"、いくつかの数字 がつながった文字列 このデータをテキストファイル(タイトル?)から探すこととなるものと思います。 であれば、後記コードはいかがでしょうか? なお、条件を満たす文字列が複数回登場する場合は、最初に登場する文字列を拾ってみました。 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

kuro0331
質問者

補足

お世話になっております。 詳細な説明を記述しておらず申し訳ありません。 以下画像が完成形となりますのでご確認いただければと思います。 それとFunctionの記述は標準モジュールだと思うのですが、VBA名がありませんと表記されます。 よろしくお願いいたします 画像サイト https://d.kuku.lu/b36c18875

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.5

#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)などの、「パターン」についても、出来そうだが、略。

kuro0331
質問者

補足

ご回答いただきありがとうございます。 お世話になっております。 度々説明不足で申し訳ありません。 どういう情報が必要かどういう情報を伝えればよいか 正直迷っているところです。 (どう伝えればよいか迷っています) 下記Excelでの説明画像ですので、 ご確認いただけると助かります。 よろしくお願いします。 https://ibb.co/jT8vbZL

  • micnak
  • ベストアンサー率60% (3/5)
回答No.4

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))))

kuro0331
質問者

補足

ご回答いただきありがとうございます 上記関数にて大体抽出できました。 説明になかったのですが スピーカー 低音強め(省略) 小型 /97-84 G-1 省略の箇所にN-001 N-002 N-003という風な文字が入る場合にはじかれてしまいました。 スピーカー 低音強め N-001 N-002 N-003 小型 /97-84 G-1 上記のような感じです よろしくお願いいたします

回答No.3

例えば、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) 要は、例文の文字列には、必ず/(スラッシュ)が一つ存在し、その次の数字から、右に抽出し、その抽出に於いて、半角スペースまでとしています。

kuro0331
質問者

補足

お世話になっております。 説明文に記載していなく申し訳ありません。 スピーカー 低音強め M1/M2/M3 N-001 N-002 N-003 小型 /97-84 G-1 のように/や-を使用している場合の商品があります。 この商品の場合にはじかれてしまいました。 よろしくお願いいたします。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

質問の書き方が不完全と思う。 元データがA列にあるとして 結果はB列に、どういう文字列(数字と記号?)に(結果文字列に)なってほしいのか、模擬例として、対応各行について書くべきだ。 結果の方を明示しない質問者が多いがそれでは、役に立たない。 その他に注釈として、文章で、「/は1セルに2個以上ない」、とか書くものだ。 ーー 回答が出ているが、 (1)スラッシュの位置を見つけて、そこから終りまでを抜き出す(作り出す)でよいのか。 MID関数などを使うことになる。 FIND関数 =FIND("/",A1) 位置の発見 LEFT関数、MID関数     切りだし (2)ほかに、/で、「データ」ー「区切り位置」を使って、その左右部分を別セルに分離 (3)もう少し、複雑になれば、正規表現、VBAのFindメソッドなどの利用になるだろう。

kuro0331
質問者

補足

ご回答いただきありがとうございます。 imogasi 様のおっしゃる通りでこちらの説明不足でした。 ご指摘いただきありがとうございます。 改めてご説明させていただきますと A列に商品タイトル一覧を記載 ↓ タイトルの最後付近に商品品番があるので 商品品番(58-44など)をB列かそれ以降の列に抽出 この動作を関数でできますでしょうか? (関数またはVBA) またご指摘いただいたように商品によってタイトルには 「10x28mm ボルト M1/M2/M3 小型 /58-44×2 G-1」 複数のスラッシュを使用しておりました。 よろしくお願いします。

  • aokii
  • ベストアンサー率23% (5210/22062)
回答No.1

スラッシュ以降が品番のようですので、以下の式で品番を抽出してはいかがでしょうか。(A2セルのデータから品番を抽出) =MID(A2,FIND("/",A2)+1,100)

kuro0331
質問者

補足

回答いただきありがとうございます。 一歩完成に近づきました! 上記関数を使用し大体の部分は抽出ができました。 下記関数を使用し抜き出したデータです。 14-44×2 G-1 あとは×2 G-1 が不必要なのですが この部分のみ消すことは可能でしょうか? よろしくお願いします。

関連するQ&A

  • EXCELで一致する文字列を抽出する方法

    EXCELに関する質問です。 ファイル1に売上デ-タがあります。    A    B   C   D 1 商品名 品番 単価 個数 2  あ    A1  100   3 3  い    A2  110   10 4  う    A3   120   5 5  は    A4  130   3 6  ひ    A5  140   7 7  ふ    A6  150   11 8  へ    A7  160   6 9  ほ    A8  170   3 ファイル2に特定の商品名のリストがあります。   A    B   C 1 商品名 2  い 3  ろ 4  は 5  に 6  ほ 7  へ 8  と 9  ち 10  り 11  ぬ ファイル1のSHEET2に    A    B  C  D 1 商品名 品番 単価 個数 2  い    A2  110  10 3  は    A4  130   3 4  へ    A7  160   6 5  ほ    A8  170   3 の様に抽出する方法ですが、商品名が単純な文字列のときは フィルタ-の詳細設定で出来ますが、 商品名が  [8/1発売] 20%OFF  い A2 の様なキャッチコピ-付の文字列の場合、抽出することが出来ません。 (ファイル1・2共にキャッチコピ-付の商品名です。) この場合でも抽出できる方法をご教授いただけないでしょうか? 宜しくお願い致します。

  • エクセルで特定文字列の抽出する方法を教えてください。

    エクセルで特定文字列の抽出する方法を教えてください。 たとえばG00X-483.931Y-412.2R5.0 と書かれてるセルからXの値「-483.931」だけを抽出したいのですが分からなくて困ってます。 またこの数値は8文字と決まってないのでX~Yの間の数値と言う感じで抽出したいです。 よろしくお願いします。

  • エクセル マクロ 文字列の検索と抽出

    エクセル2010を使っています。 画像の様に、【Sheet3】のA列~CQ列に 空白・エラー・数値・文字 の入った表があります。 そのL列には、画像の様な形で様々な地域の名前が入っています。 やりたいのは、L列に 検索対象文字が複数、例えば 福岡 か 大阪 が入っていたら、その表ごと抽出し、【Sheet1】の上から順に枠線ごと貼り付けて行きたいと思います。 この時、両方一致ではなく、検索対象の文字列が一つでも含まれていたら抜き出したいと思います。 その時に 【Sheet3】から抽出した部分は削除し、上に詰めて行きたいと思います。 ちなみに検索対象が、福岡・大阪・名古屋等、増える場合もありますので、増えたとき対応が出来る形が理想です。 ちなみにL列の文字と文字の間は ・ だったり / だったりします。 詳しい方、よろしくお願い致します。

  • エクセル2003  データ抽出に関して

    1列目に品番があります。 4534 5346 5745 3453 等…600ぐらいあります。 別のファイルには 品番 商品名 重さ 4534 商品○○ 3kG 1250 商品■■ 1kg 5745 商品×× 2kg …と3000品目ぐらいあります。 何をしないといけないかと申しますと、 3000品目の中から 600品目分の品番を元に 品番 商品 重さ というように 抽出しないといけないのですが、何か一括でやるいい方法はありますでしょうか? 文章が稚拙でわかりにくいかも知れませんが、該当の品番だけ与えられていて、 マスターのデータを元に商品名と重さを入力しなければいけないのです。 よろしくお願いします。

  • EXCEL 文字列条件抽出

    特定の文字列を検索条件として別シートに抽出する方法を御教授願います。 使用する関数はLEN,MID,LEFT,ISERR,もしくはワイルドカードなどを使用すればいいのかと考えておるのですがいまいちやりたいような数式を組めず悩んでおります。 やりたいことを言葉で表現するならば以下のような感じとなります。 「sheet1のF列に<107>という文字が含まれていた場合」 ・顧客別シートのD列に顧客ごとに分けて抽出 ・含まれていない場合、抽出しない と、単純なことなのです。が、制約がある為にうまくいきません。 制約は以下となります。 ・検索対象の文字列が以下のように決まった形ではない。 (1)A-BB-107○#----- (2)A-BB-107○#----- (3)ABB107○C #----- (4)ュウリABB-107○#----- (5)ュウリABB107○#----- (6)BB-107○C-D9#-----  など、その他にも数種類存在。(○部分には違う数字が入ります) ・上記でも分かるように<107>が始まる文字列の位置が決まっていない。 という具合です。 操作しているブック構成は下記のとおりです。 ・sheet1・・・参照用シート 4行目 /D列・・・顧客No / E列・・・顧客名 / C列・・・製品仕様 (A列,B列,G~AD列まで使用中) 5行目 / 1 / A / A-BB-107○#----- 6行目 / 2 / B / ュウリABB-107○#----- 7行目 / 1 / A / BB-107○C-D9#----- 8行目 / 3 / C / A-BB-107○#----- 9行目 / 3 / C / BB-107○C-D9#-----  10行目 / 4 / D / A-BB-107○#----- (会社のサーバーで管理している情報がそのままエクセルに打ち出されたシート。 情報量として約1000行ほど) ・sheet2,3,4,5(開始行,項目列は同じ位置)・・・特定の顧客別ごとに分け、特定の製品仕様だけを抽出したシート(参照用から引用)。 4行目/ B列・・・顧客No / C列・・・顧客名 / D列・・・製品仕様 5行目 / / A-BB-107○#----- 6行目 / / ュウリABB-107○#----- 7行目 1 / A / BB-1234C-D9#----- 8行目 / / A-BB-1115#----- 9行目 / / BB-107○C-D9#-----  10行目 / / A-BB-3498○#----- 特定の顧客NoをB列(一つのセルになってます。C列も同様一つのセルになってます)に入力すると、製品仕様すべてを抽出するように作成したシート。このシート内のG列から新たに表を作成し<107>の文字列が含む製品仕様を抽出しようと考えております。 出来れば、このような一度段階を踏んでから特定の仕様を抽出するのではなく各シートに対象となる顧客Noを入力すると特定の仕様が一回で抽出できるようなシートを作成したいのですが、関数初心者の為、うまく組めずこのような形となりました。(現在、参照用シートに作業列を作り対応。作業列ばかりが増えて正直困っているのも確かなのです) 【御教授頂きたいこと】 ・<107>の文字列を条件として別表に抽出する関数の数式 です。 また、出来ればでいいのですが、 ・顧客Noを入力すると特定の仕様が一回で別表に抽出できるような方法が御座いましたら、そちらも合わせてお願いしたいと思っております。 長々と書き綴り、大変申し訳御座いませんが、宜しくお願い致します。

  • エクセルでデータの抽出する際に困っています

    エクセルで特定の行のデータを抽出する方法を教えてください。 抽出方法を以下に示します。     A   B   C   D   E   F   G   ---------------------------------- 1l  10   11   0   0   0   0   0 2l  12   13   0   0   0   0   0 3l  14   15   1   2   3   4   5 4l  16   17   0   0   0   0   0 5l  18   19   0   0   0   0   0 6l  20   21   6   7   8   9   10 7l  22   23   0   0   0   0   0 というような感じのエクセルデータに対して、     A   B   C   D   E   F   G    ---------------------------------- 1l  14   15   1   2   3   4   5 2l  20   21   6   7   8   9   10 というように、C~G列が0でない行のA~Gのデータを別シートに抽出したいのですが、 簡単な方法があれば教えていただきたいです。 よろしくお願いします。

  • エクセルのデータ抽出で列が飛び飛びなんですが

    仕事でエクセルを使い始めた初心者です。 シート1に B    D    E     G       K    L   ←列番号 品名 型番 メーカー 数量 ~~ 発注先 単価 ~~ ○○ △△ ××    5  ~~ ◎◎◎ 100 ~~ ●● ▽▽ ××    3  ~~ ■■■ 500 ~~ ∵∵ □□ ▲▲    1  ~~ ◎◎◎ 400 ~~ といった感じで何百件もデータを入力してありまして これをシート2で 発注先 ◎◎ ←ここに発注先名をいれる A    D    H     J    L 品名 型番 メーカー 数量 単価 ○○ △△ ××    5  100 ∵∵ □□ ▲▲    1  400 こうやって必要なところだけを抽出させたいのですが 範囲の指定の仕方がわかりません。 VLOOKUPだと一つ一つ入力しないといけなそうですし AdvancedFilterだと飛び飛びの列の指定の仕方がよくわからないのです。 列番号が飛んでるのは、セルの結合などが多々まぎれてるからです。 どんな構文をかけばいいんでしょうか?

  • Excel 複数列を同じ条件で抽出・合計する方法

    Excelの抽出・合計について教えてください。 配列を用いた方法などいろいろ検索しましたが式が長くなるので、 もう少しわかりやすくできないかと思っていろいろ探した結果、 ここに辿り着きました。 作業対象のSheetは次のとおりです。 ・行数はその月によって可変です。 ・A~L列まであると仮定します。これは固定です。 ・合計を求めたいのはL列の値となります。 抽出条件(AND条件) ・A~E列とI列が0(ゼロ) ・F~H列が0(ゼロ)でない、つまり数値が入っている 上述の条件をともに満たすデータのL列の数値の合計を求めたいと いうのが、今回の作業です。 現在はSUMPRODUCT関数を使って1列ずつ条件を設定しています。 しかし、式がたいへん長くなるので、もう少し簡略化したいです。 できればピボットテーブルやデータベース関数は余分な列を使うので 避けたいと思っています。 アドバイス、よろしくお願いいたします。

  • -excel-違うブックの文字列を含む行の抽出

    商品の価格を一括で変更できる方法を探しているのですが見つからず困っています。 全ての商品データが載ってるブックAがあります。価格を変更する商品のIDと値下げ後の値段が載っているブックBがあります。ブックAの商品価格をブックBの値下げ後価格に変更したいのですが、関数か、マクロなど何か良い方法はないでしょうか? 最悪価格は手動で変更するとしてせめてブックBのIDと合致するセルを持つブックAの行を抽出する方法はないでしょうか?抽出した行は別ブックにまとめてくれるとなお助かります。 ちなみにブックAには7000行、ブックBには1000行のデータがあります。 ブックA(商品データ) A列・・・・・・    F列・・・・・・・・ ID         価格 1234        2500 2345        3200 3456        1200 4567        3000 5678        1800 ブックB(価格変更データ) A列        B列 ID         価格 2345        2600 5678        1500 ↓ ブックA(商品データ)もしくは新規ブックC A列・・・・・・    F列・・・・・・・・ ID          価格 1234        2500 2345        2600 3456        1200 4567        3000 5678        1500 といった感じです。どなたかお知恵をお貸しください。よろしくお願いいたします。

  • エクセルで隠したい列がある。

    得意先に委託商品リストをメールに添付して送る事になりました。品番・アイテム等入れ、E列を納価、F列を上代とし、G列に当社のコストを入力し、EF列は関数を入力して自動計算しました。リストを送る際、コスト部分のG列は相手に見せたくないのですが、どの様にしたら良いでしょうか。G列をデリートするとEF列が0になりますし、G列の幅を最小にして見えなくしても、列がEFHとなり気づけば広げられる可能性もあります。 何か良い方法があればお教え願います。

専門家に質問してみよう