• ベストアンサー

文字列から数値を抜き出して計算する関数

5t×5h×5Lとあれば、5×5×5の計算結果を返す関数をご教授くださいませ。 t×h×Lのワンセットがあれば、tの左、hの左、Lの左の数値を抜き出して計算していただけるといいです。 316L 5t×5h×2Lとなっている場合もあります。 それでも、t×h×Lの左横以外は無視です。 5×5×2で50が正解です。 よろしくご教授お願いします。

noname#241383
noname#241383

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

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.10

No2とNo9について。 No2について、すべて4桁だとオーバーフローするので データ型を変更します。 それと、tより左側の区切りが半角空白以外に直接 文字が入っていても認識できるように変更しました。 Function funcB(ByVal str As String) As Double Dim xi As Long Dim yi As Long Dim xj As Long Dim yj As Long Dim xk As Long Dim yk As Long Dim i As Long Dim j As Long Dim k As Long Dim istr As String Dim jstr As String Dim kstr As String '一番目 xi = InStrRev(str, "t") For yi = xi - 1 To 1 Step -1 If IsNumeric(Mid(str, yi, 1)) Then istr = istr & Mid(str, yi, 1) Else Exit For End If Next i = CLng(StrReverse(istr)) '二番目 xj = InStrRev(str, "h") For yj = xj - 1 To 1 Step -1 If IsNumeric(Mid(str, yj, 1)) Then jstr = jstr & Mid(str, yj, 1) Else Exit For End If Next j = CLng(StrReverse(jstr)) '三番目 xk = InStrRev(str, "L") For yk = xk - 1 To 1 Step -1 If IsNumeric(Mid(str, yk, 1)) Then kstr = kstr & Mid(str, yk, 1) Else Exit For End If Next k = CLng(StrReverse(kstr)) funcB = CDbl(i) * CDbl(j) * CDbl(k) End Function

その他の回答 (11)

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

関数といっているからエクセルの質問だよね。 エクセルはシートのデータについての学びです。シートがどうで、セル(番地を示してそこ)にどういうデータがはいているのかはっきり書くこと。 その辺からこの質問はエクセルの質問ならなってない。 ーー A1セルに5t,B1に5h,C1セルに5Lと入っているのか、 A1セルに5t×5h×5Lとはいているのか。Xは実際に入っているのか。 まれには表示形式で5を5tと見えるようにしている場合もある。その例なら簡単。 >316L 5t×5h×2L このデータ例もよくわからない。こんな突拍子もない書き方(入力)がなぜあるのか。 >t×h×Lの左横以外は無視です これもよくわからない。英字の左の1桁だけを問題にするということか。 補足か再質問すべきと思う。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.11

No10です。関数名がfuncBになっていました。 正しくは、以下です。使い方は、No2と同じです。 スレッドを長くして申し訳ないです。 Function funcA(ByVal str As String) As Double Dim xi As Long Dim yi As Long Dim xj As Long Dim yj As Long Dim xk As Long Dim yk As Long Dim i As Long Dim j As Long Dim k As Long Dim istr As String Dim jstr As String Dim kstr As String '一番目 xi = InStrRev(str, "t") For yi = xi - 1 To 1 Step -1 If IsNumeric(Mid(str, yi, 1)) Then istr = istr & Mid(str, yi, 1) Else Exit For End If Next i = CLng(StrReverse(istr)) '二番目 xj = InStrRev(str, "h") For yj = xj - 1 To 1 Step -1 If IsNumeric(Mid(str, yj, 1)) Then jstr = jstr & Mid(str, yj, 1) Else Exit For End If Next j = CLng(StrReverse(jstr)) '三番目 xk = InStrRev(str, "L") For yk = xk - 1 To 1 Step -1 If IsNumeric(Mid(str, yk, 1)) Then kstr = kstr & Mid(str, yk, 1) Else Exit For End If Next k = CLng(StrReverse(kstr)) funcA = CDbl(i) * CDbl(j) * CDbl(k) End Function

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.9

No2です。 >桁数は最高で4ケタはあります。 >また、右側に他の文字列が来ることはないですが左側には、 >316Lとか304とかアルミとか他の文字列が来る場合があります。 >よろしくお願いします。 No2は桁数に関係なく機能します。

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.8

補足と訂正です。 No7の回答に誤りがありました。 左側にLなどの単位が入っている場合は、そちらの数字を引っ張ってくる可能性がありますので、以下のようにスペースを10個続ける数式にしてください。 =PRODUCT(MID(RIGHT(SUBSTITUTE(SUBSTITUTE(" "&A1,"×"," ")," ",REPT(" ",10)),35),FIND({"t","h","L"}&" ",RIGHT(SUBSTITUTE(SUBSTITUTE(" "&A1,"×"," ")," ",REPT(" ",10)),35)&" ")-4,4)*1) 数式中の「35」の数字は、積算する項目数(3)にスペースの数(10)をかけた数字に、最大桁数(4)を足して、さらに+1してください。

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.7

>桁数は最高で4ケタはあります。 また、右側に他の文字列が来ることはないですが左側には、316Lとか304とかアルミとか他の文字列が来る場合があります。 この条件なら、すでに回答があるように、キーとなる文字列の位置を文字列関数で求めて、それを利用して対象の数字を求めて掛け算するのが基本ですが、かける数字が多くなる(例えば6組の数字がある)などの条件がある場合は、数式は解読しにくくなりますが、以下のような配列を利用した数式にしたほうが便利な場合もあります。 =PRODUCT(MID(RIGHT(SUBSTITUTE(SUBSTITUTE(" "&A1,"×"," ")," "," "),30),FIND({"t","h","L"}&" ",RIGHT(SUBSTITUTE(SUBSTITUTE(" "&A1,"×"," ")," "," "),30)&" ")-4,4)*1) 先の回答でも述べましたが、実際のデータのパターンによって使用する数式が大きく異なりますので、このようなご質問ではエクセルのバージョンを明示するとともに実際に入力されているデータ例を数多く例示するようにしてください。

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.6

いわゆるチカラワザで。 =PRODUCT(MID(LEFT(A1,FIND("t×",A1)-1),IF(ISNUMBER(FIND(" ",A1)),FIND(" ",A1),1),99),MID(LEFT(A1,FIND("h×",A1)-1),FIND("t×",A1)+2,99),MID(LEFT(A1,LEN(A1)-1),FIND("h×",A1)+2,99))

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.5

>No3さんにお伺いしたいのですが。 No3さんの場合、 10t×5h×2L や 5t×5h×10L などのように数値の一の位が0の場合 計算値が0になりますが? 回答でもお断りしたように、必要以上に数式を複雑化しないために、例示のデータのように単位の左側の数字が1ケタの場合の数式を提示しています。 例えば、数字が2ケタまであるなら以下のような数式になります。 =PRODUCT(IF(ISERR(MID(A1,FIND({"t","h","L"}&"×",A1&"×")-2,2)*1),MID(A1,FIND({"t","h","L"}&"×",A1&"×")-1,1)*1,MID(A1,FIND({"t","h","L"}&"×",A1&"×")-2,2)*1))

noname#241383
質問者

補足

質問が簡単すぎてしまいました。 こちらで補足させてください。 桁数は最高で4ケタはあります。 また、右側に他の文字列が来ることはないですが左側には、316Lとか304とかアルミとか他の文字列が来る場合があります。 よろしくお願いします。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

No2です。 >316L 5t×5h×2L という例以外に、 316L 5t×5h×2L 200t というようにthLの連続した組み合わせの右側に、 別のものがくっつくものはないでしょうね? No3さんにお伺いしたいのですが。 No3さんの場合、 10t×5h×2L や 5t×5h×10L などのように数値の一の位が0の場合 計算値が0になりますが?

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.3

例示された文字列データのパターンだけでよいなら(t×h×Lの左の数字1ケタの掛け算をするなら)、以下のような数式で計算できます。 =PRODUCT(MID(A1,FIND({"t","h","L"}&"×",A1&"×")-1,1)*1) #このようなケースでは、実際のデータの種類やパターンによって使用する関数が異なりますので(必要以上に複雑な回答をすることにならないように)、実際のデータをできる限り多く例示するようにしてください。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

>316L 5t×5h×2L このような形式以外の例外が他にあるのかはっきり しませんが、以下の関数を標準モジュールに 貼り付け、保存します。 あとは、A1から下にデータがあるものとして、B1に、 =funcA(A1) として、B1をコピーし、B2からデータがある行まで下に 向かって選択し、形式を選択して貼り付けから、 数式にチェックを入れ、OKとし、保存してください。 Function funcA(ByVal str As String) As Long Dim i As Long Dim j As Long Dim k As Long '最初の数値 If InStr(1, str, " ") > 0 Then i = CLng(Mid(str, InStr(1, str, " ") + 1, (InStr(1, str, "t") - 1) - (InStr(1, str, " ")))) Else i = CLng(Mid(str, 1, InStr(1, str, "t") - 1)) End If '二番目 j = CLng(Mid(str, InStr(1, str, "t") + 2, (InStr(1, str, "h") - 1) - (InStr(1, str, "t") + 1))) '三番目 k = CLng(Mid(str, InStr(1, str, "h") + 2, (InStrRev(str, "L") - 1) - (InStr(1, str, "h") + 1))) funcA = i * j * k End Function

関連するQ&A

  • 文字列から数値を抜き出して計算

    あいう 1200t×398h×1200L こういった数字混じりの文字列があります。 "あいう"とかの文字列が含まない場合もあります。 要は、thLの左の数値を抜き出して掛け算する関数はできますでしょうか? お手数かけますがよろしくお願いします

  • 数値計算と文字列

    JavaScript 数値計算の式と値を表示させたいです。 10+5=15 document.write("10+5"+10+5);というのを関数で表わせないでしょうか? function foo(計算式){ document.write(計算式の文字列+計算結果); } 1+4-15など2つ以上の数値も対応したいです。

  • 2つの関数の積を数値計算で解く

    時間tで微分すると、共にtの関数であるS(t)、I(t)の積の形で表せる関数F(t)を 数値計算で解きたいのですが、やり方がわかりません。 関数が1つだけの時のやり方はわかるのですが、関数が2つ、しかも積となるとお手上げで…。 式の形は dF(t)/dt=-αS(t)I(t)   (αは係数) となります。このような形の式を数値計算で解くやり方を解説しているページ、 または書籍をご存知の方がいらっしゃいましたらご教授願います。

  • 数値データの抜出

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

  • エクセルで計算の結果がある数値の場合のみ文字列を表示させたいです・・・。

    エクセルで計算の結果がある数値の場合のみ文字列を表示させたいのですが、IF関数を使うのかなと思いますが関数がよく解かりません。。。 やりたいことはこんな感じです。 セルG1にはA1-B1、H1にはC1-D1、I1にはE1-F1と計算式が入っています。 計算の結果、▲1になるセルだけを文字列『売上』と表示させたいのですが・・・。 なお、計算の結果は、必ず『1』か『▲1』のどちらかにしかなりません。 つたない質問ですが解決したく困っています。よろしくお願いします。

  • 数値でも文字列でもない? 【Excel】

    シート内の値はCSV形式のものをコピーしたもので、文字列の表示(左詰め)になっています。 因みにセル間の足し算や引き算はできます。 しかし 数値の最大値を計算しようと思い MAX関数にて計算しても”0”の表示 文字列なのかと思い MAXA関数にて計算しても”0”の表示 関数(その他SUMやCOUNTA)での計算ができません。 そこで質問ですが、 この場合のセルの表示形式はどうなっているのでしょうか? また計算する方法を教えて下さい。 お願いします。<(_ _)>

  • 畳み込み積分の数値計算方法

    y(t)=∫f(τ)h(t-τ)dτ, 積分区間 0≦τ≦t. この畳み込み積分のfとhの関数形が具体的にわかっているときに、y(t)の値を求めるにはどうすればいいのでしょうか。積分が解析的な式で表される場合はその式にtの値を代入すれば済むと思いますが、解析的な式でかけない場合は数値計算しないといけないと思います。数値計算はどのようにするのでしょうか? ラプラス変換とかフーリエ変換とか使うのでしょうか? 数値積分をするのでしょうか? 常套手段があると思うので、教えて下さい。

  • EXCEL関数 文字列の一部の数字文字を数値化して計算につかいたい

    EXCEL関数について質問です。 あるセルの文字列に記載されている一部の数字文字を 数値化して計算につかいたいと思っています。 <例>  あるセルの文字列(A1)⇒あいうえお12345番目の方  出力したい数字文字⇒12345 知る限りの関数を使って以下の関数式を作ってみました。 (1) MID関数を使う  最初の文字「あいうえお」は10バイトなので開始は「11」としました。 (2)後に登録されている「番目の方」を除きたいので  SEARCHB関数を使って、「番目」の開始バイトを見つけ  そこから最初の文字バイト「11」を引き、抽出するバイトを求める。 (3)抽出した文字列を数値に変換するVALUE関数を使う。 次の関数式を作ってみました。   =VALUE(MIDB(A1,11,SEARCHB("番目",A1,1)-11)) でも結果は「」となります。 何がいけないのかわかりません。エラーの原因がわかれば教えて下さい。 ほかによい方法があれば教えてください。 よろしくお願いします。  

  • iphone開発環境で数式文字列から計算結果の数値を得たいのですが、

    iphone開発環境で数式文字列から計算結果の数値を得たいのですが、 その用途にあう関数やクラスライブラリはありますでしょうか? たとえば、"1+2"を渡すと、数値3を返すようなものを探しています。 .Net環境ではJScriptEvaluate()関数などで実現できるようですが…。

  • エクセル2000:B列に入っている関数をSUM関数だけ残し、そのほかは一括数値に変換したい

    よろしくお願いします。 エクセル2000で、 A列に勘定科目、B列に縦にSUM関数ほか、VLOOKUP関数などいろいろ関数を入れて数字が表示されています。 具体的には予算を作成する過程での資料です。 そこで、B列のSUM関数だけをのこして、それ以外の関数をすべて「数値」(関数で現在計算結果として表示されている数値)に変換したいのです。その方法をお教えくださいませ。 よろしくお願いいたします。

専門家に質問してみよう