• ベストアンサー

数値データの抜出

ss 6t×50h×1000L 6t×50h×1000L 上記のようなデータがあります。 tの前の6、hの前の50、Lの前の1000を取り出す関数をそれぞれご教授くださいませ。 パターンとしては・・ *t×*h×*L * *t×*h×*L ←最初にssなどの文字列がある時があります。ただし、抜き出すtの数値の前には半角スペースがあります。 お手数掛けますが、よろしくおねがいします。

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

  • ベストアンサー
回答No.5

要望があったので説明します。(添付図参照) 数式は中から考えていきます 1..B2セル =B$1&"×"  「t」と「×」をつなげます。  対象文字列前方にtが含まれていた時に対応するための布石  よって、「t×」「h×」「L×」が前方に含まれているときは使えない。 2.C2セル =FIND(B2,$A2&"×")  「t×」の場所を文字の左から検索します。  $A2&"×"は「L×」検索用 3.D2セル =LEFT($A2,C2-1)  「t×」の手前までの文字を取り出すために 2.から-1しています 4. E2:I2セル =RIGHT($D2,E$1)*1  文字を取出し、*1で数値化できるものを数値にする。  違うものは#VALUE!エラーとなる  この部分が配列 5. J2セル =8^8 単なる大きな数値。16,777,216  7文字(7桁)取り出しているので、9,999,999よりも大きな数値であればよい 6. K2セル =LOOKUP(J2,E2:I2)  配列部のエラーを無視してくれる。  5.の条件の時、一番右(列方向なら下)の数値を拾ってくれる。  という特性を持ったLOOKUP関数を使用しています

noname#241383
質問者

お礼

いろいろ考えていたのですが、とても難しかったです。 しかしながら、とても役に立ち感謝しています。 ありがとうございました。

その他の回答 (6)

noname#204879
noname#204879
回答No.7

[No.5]へのコメント、 CoalTarさん、懇切丁寧な解説を多謝です。 御蔭様で良く理解出来ましたが、私には思い付かない手法でした。 特に『$A2&"×"は「L×」検索用』なる手法に感銘を受けました。 その手法を利用させて戴いても、私が考え付くのは精々添付図の様な作業列を用いる方法です。参考迄に載せて置きます。ワーストアンサーでも私は辞退しません。(^_^) F1: =IF(ISERROR(FIND(" ",A1)),0,FIND(" ",A1)) G1: =FIND("×",$A1&"×",F1+1) セル G1 をズズーッと右2列にドラッグ&ペースト B1: =VALUE(MID($A1,F1+1,G1-F1-2)) セル B1 をズズーッと右2列にドラッグ&ペースト 範囲 B1:I1 をズズーッと下方にドラッグ&ペースト 【独白】それに付けても、何故質問者は梨の礫を決め込んで居るのだらう?

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.6

こんばんは! VBAになってしまいますが、一例です。 ↓の画像のようにデータは2行目以降にあり、C~E列に表示するとします。 画面左下の操作したいSheet見出し上で右クリック → コードの表示 → VBE画面に ↓のコードをコピー&ペーストしてマクロを実行してみてください。 (Alt+F8キー → マクロ → マクロ実行です) Sub test() 'この行から Dim i As Long, j As Long, k As Long, cnt As Long Dim str As String For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row j = 3 For k = 1 To Len(Cells(i, 1)) str = Mid(Cells(i, 1), k, 1) If str Like "[0-9]" Then cnt = k Do While Mid(Cells(i, 1), cnt, 1) Like "[0-9]" cnt = cnt + 1 Loop Cells(i, j) = Mid(Cells(i, 1), k, cnt - k) j = j + 1 k = cnt End If Next k Next i End Sub 'この行まで ※ 単に数値の連続を判断して、それを順番にC~E列に表示しているだけです。 ※ 関数でないので、データ変更があるたびにマクロを実行する必要があります。m(_ _)m

noname#204879
noname#204879
回答No.4

[No.1]の CoalTarさんへ、 いつも参考にさせていただいております。 今回もお見事な回答と思っておりますが、私には難解です。 》 説明は要望があれば。 質問者がご「要望」してくれることを待っているのですが、一向にそうしてくれないので私から… どうかご「説明」をお願いします。

回答No.3

一発で求めるなら、No.1さんの配列数式など。ベストアンサーは辞退します。 他の簡単な方法としては、「区切り位置」の機能でセルを分割。 「ss 6t×50h×1000L」などのデータを 1 列に並べ( 1 列ずつしか処理できません)、列全体を選択した状態で、リボン「データ」の「区切り位置」ウィザード起動。「カンマやタブなどの…」を指定し、「次へ」。「その他」をチェックしてその右のボックスに「×」を入力し、完了。 「×」の代わりに「 」(半角スペース)で同じことをすれば、スペースの位置で分割されます。 続いて、新しくできた 3 列に上と同じことを繰り返します。「カンマやタブなどの…」の代わりに「スペースによって…」を選ぶと、その次に出てくるプレビュー画面で、区切り位置とする縦線の位置をクリック、ドラッグ、ダブルクリックによって決められます。つまり「t」、「h」、「L」の記号だけ、別の列に分けられます。 なお添付図では、 C1 セルに「=if(b1="",a1,b1)」と入力し、 C 列をコピーして D 列に値複写してから、「スペースによって…」での処理を実行しました。 注意点。「区切り位置」は、複数の列を同時には処理できません。また、列の分割によって右方の既存データが上書きされてしまう場合は、ウィザードの完了時に警告が出ます。それを防ぐため、列の挿入などによって十分な間隔を空けてから、ウィザードを開始します。

回答No.2

ちょっとゴチャゴチャしてるけど、空白文字が適当に散らばっていても大丈夫、、、 B~C列:空列 D1~F1:単位文字t/h/L D2: =SUBSTITUTE(MID($G2,1,FIND(D$1,$G2)-1),B2&B$1&C2&C$1,"") E2,F2にコピー G2: =SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(TRIM($A2)," ",""),"×",""),"ss","") D2~G2: 下方向にもまとめてコピー

回答No.1

小数点も数えて、7桁までとして =LOOKUP(8^8,RIGHT(LEFT($A2,FIND(B$1&"×",$A2&"×")-1),{1,2,3,4,5,6,7})*1) 添付図参照 説明は要望があれば。

関連するQ&A