dポイントプレゼントキャンペーン実施中!

あいう 1200t×398h×1200L

こういった数字混じりの文字列があります。
"あいう"とかの文字列が含まない場合もあります。
要は、thLの左の数値を抜き出して掛け算する関数はできますでしょうか?

お手数かけますがよろしくお願いします

A 回答 (7件)

No.6です!


たびたびごめんなさい。
前回のコードは一文字ずつ舐めるように検索しています。
小数点以下の数値がある場合対応できません。
もう一度コードを載せておきます。

Sub test() 'この行から
Dim i, j As Long
Dim str, buf As String
For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
'↑データが1行目からあれば「2」を「1」に変更
For j = 1 To Len(Cells(i, 1))
str = StrConv(Mid(Cells(i, 1), j, 1), vbNarrow)
If str Like "[0-9]" Or str = "+" Or str = "-" Or str = "×" _
Or str = "÷" Or str = "." Then
buf = buf & str
End If
Next j
buf = WorksheetFunction.Substitute(WorksheetFunction.Substitute(buf, "×", "*"), "÷", "/")
Cells(i, 2) = "=" & buf
buf = ""
Next i
End Sub 'この行まで

何度も失礼しました。m(__)m
    • good
    • 0

こんばんは!


VBAでの一例です。

余計なお世話かも知れませんが、加減乗除に対応できるようにしてみました。
尚、掛け算に「×」を使っているということは割り算には「÷」が使ってあるという前提です。
(データ内には「*」や「/」がない)

データはA列の2行目からあるとし、B列に計算結果を表示するようにしています。

画面左下にある操作したいSheet見出し上で右クリック → コードの表示 → VBE画面が出ますので
↓のコードをコピー&ペーストしてマクロを実行してみてください。
(Alt+F8キー → マクロ → マクロ実行です)

Sub test() 'この行から
Dim i, j As Long
Dim str, buf As String
For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
'↑データが1行目からあれば「2」を「1」に変更
For j = 1 To Len(Cells(i, 1))
str = StrConv(Mid(Cells(i, 1), j, 1), vbNarrow)
If str Like "[0-9]" Or str = "+" Or str = "-" Or str = "×" Or str = "÷" Then
buf = buf & str
End If
Next j
buf = WorksheetFunction.Substitute(WorksheetFunction.Substitute(buf, "×", "*"), "÷", "/")
Cells(i, 2) = "=" & buf
buf = ""
Next i
End Sub 'この行まで

こんな感じではどうでしょうか?m(__)m
    • good
    • 0

A1セルから下方にお示しのような数値があるとしてB1セルには次の式を入力して下方にオートフィルドラッグします。



=IF(A1="","",IF(ISNUMBER(FIND(" ",ASC(A1))),MID(A1,FIND(" ",ASC(A1))+1,FIND("t×",A1)-FIND(" ",ASC(A1))-1)*MID(A1,FIND("t×",A1)+2,FIND("h×",A1)-FIND("t×",A1)-2)*MID(A1,FIND("h×",A1)+2,FIND("L",A1)-FIND("h×",A1)-2),LEFT(A1,FIND("t×",A1)-1)*MID(A1,FIND("t×",A1)+2,FIND("h×",A1)-FIND("t×",A1)-2)*MID(A1,FIND("h×",A1)+2,FIND("L",A1)-FIND("h×",A1)-2)))

なお、式の中の" "の間隔は半角のスペースにします。実際のデータで半角のスペースになっているか、全角のスペースになっているかは問いません。
    • good
    • 0

使用ソフトが書いてない。

エクセルにしても質問には明記するもんだ。
 1200tなどはセルに入っている(エクセルの場合は文字をくっつけると文字列データとなる)のか。
398hも別セルだよね。
だからエクセルで言えば=A1*B1*C1 的な計算をしたいのか。
thlはエクセルの表示形式でそのように、見えているのではないよね。この辺の意識がない初心者の質問者が多いので聞く。表示形式適用の場合は簡単。=A1*B1*C1 。エクセルでは本来単位らしい記号は、表示形式の設定で付けるべきなんだ。
ーー
1セルに1200t×398h×1200Lが
入っている場合は下記VBAが一解法例。

単位らしい記号は必ず1文字か。
単位らしい記号は必ず終わりに付いているのか。途中は無いよね。
あるいは1200t×398h×1200Lの文字列の途中にあるのか。Xがセパレータの薬をするのか。
付いてない場合は無いのか。
コンピュターをやる場合は、こういう想像を働かせて、質問・問題文を書くべきなんだ。
それによって、がらりと解法が変わることも多い。
エクセル関数には数字と文字列を分ける便利な単一関数がない。従って複雑な式になる。
VBA向きの問題かな。
ーーー
単位らしき文字の半角全角、大文字小文字に注意。
A1の文字列を計算しB1に
A列全体の各行データなどに対し行う場合は、少々変更が必要。
Sub test01()
x = Cells(1, "A")
m = 1
s = Split(x, "×")
For i = o To UBound(s)
y = s(i)
If Right(y, 1) = "h" Or Right(y, 1) = "L" Or Right(y, 1) = "t" Then
v = Val(Left(y, Len(y) - 1))
MsgBox v
m = m * v
End If
Next i
Cells(1, "B") = m
End Sub
    • good
    • 0

昔々の何かの立体データのようですが、このようなデータをもらうと面倒ですね。


しかしデータ量が多いときはエクセルの作業列を使えば、最初の変換だけちょっと面倒でも
あとは簡単になります。

1、まずデータをコピーしてエクセルにテキスト形式で貼りつけます。並べ替えの都合で番号を付与しておきます。
2、asc関数を使って、可能なものは半角にします。
記号のh,t,lは1か2の段階で、空白と「置換」して消しておきます。

3、データをセルに分割する都合で、並べ替えをして数字からはじまるものを1列右へ移動します。
4、「データ」→「区切り位置」で数値として取り出し、右側に計算式をいれます。
「文字列から数値を抜き出して計算」の回答画像3
    • good
    • 0

エクセルですよね?


作ってみました。一応動作確認済みです。


標準モジュールを作成し下記をコピーしてください。

Option Explicit
Function KEISAN(strArg As String) As Double
Dim strFormula As String
Dim strChar As String
Dim i As Integer
strFormula = ""
For i = 1 To Len(strArg) '1文字ずつ取り出してループ
strChar = StrConv(Mid(strArg, i, 1), vbNarrow)
If InStr(1, "0123456789×÷/+*()", strChar) <> 0 Then '計算式に使える文字のみ取り出し
Select Case strChar '**** ×と÷は数式に使える記号に変換
Case "×"
strChar = "*"
Case "÷"
strChar = "/"
End Select
strFormula = strFormula & strChar

End If
Next i
KEISAN = Evaluate(strFormula) '数式を計算評価して返す
End Function

使い方は
=KEISAN(セル名)です
あいう 1200t×398h×1200L

の場合
573120000
の結果がでました。


使える記号は掛け算だけでなく *-/+のほか()かっこ、÷×も使えます。

例えば 「あいう (1000t+398h÷4343)/1200L かきくけこ
など自由な式も計算できます。四則演算のみで関数は使えません
    • good
    • 0

>thLの左の数値を抜き出して掛け算する関数はできますでしょうか?


 ⇒出来ますが、訳が判らない長い数式になりますのでお勧めしません。
  それより、データ配列を再構成すれば、数式やデータ編集もシンプルになります、
  データ→区切り位置、編集→置換等を活用してTHL毎に列を割当てみては如何でしょうか。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!