- ベストアンサー
文字列から数値を抜き出して計算する関数
5t×5h×5Lとあれば、5×5×5の計算結果を返す関数をご教授くださいませ。 t×h×Lのワンセットがあれば、tの左、hの左、Lの左の数値を抜き出して計算していただけるといいです。 316L 5t×5h×2Lとなっている場合もあります。 それでも、t×h×Lの左横以外は無視です。 5×5×2で50が正解です。 よろしくご教授お願いします。
- みんなの回答 (12)
- 専門家の回答
質問者が選んだベストアンサー
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/17069)
関数といっているからエクセルの質問だよね。 エクセルはシートのデータについての学びです。シートがどうで、セル(番地を示してそこ)にどういうデータがはいているのかはっきり書くこと。 その辺からこの質問はエクセルの質問ならなってない。 ーー 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)
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)
No2です。 >桁数は最高で4ケタはあります。 >また、右側に他の文字列が来ることはないですが左側には、 >316Lとか304とかアルミとか他の文字列が来る場合があります。 >よろしくお願いします。 No2は桁数に関係なく機能します。
- MackyNo1
- ベストアンサー率53% (1521/2850)
補足と訂正です。 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)
>桁数は最高で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/7941)
いわゆるチカラワザで。 =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)
>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))
- piroin654
- ベストアンサー率75% (692/917)
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)
例示された文字列データのパターンだけでよいなら(t×h×Lの左の数字1ケタの掛け算をするなら)、以下のような数式で計算できます。 =PRODUCT(MID(A1,FIND({"t","h","L"}&"×",A1&"×")-1,1)*1) #このようなケースでは、実際のデータの種類やパターンによって使用する関数が異なりますので(必要以上に複雑な回答をすることにならないように)、実際のデータをできる限り多く例示するようにしてください。
- piroin654
- ベストアンサー率75% (692/917)
>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
- 1
- 2
補足
質問が簡単すぎてしまいました。 こちらで補足させてください。 桁数は最高で4ケタはあります。 また、右側に他の文字列が来ることはないですが左側には、316Lとか304とかアルミとか他の文字列が来る場合があります。 よろしくお願いします。