[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『文字列の計算式を計算』(alalfa)
下記の様に列Aに文字列の計算式があるとします。
この計を別のセル(列C)に表示させたいのですが、列Cのセルにどんな関数を入れればいいでしょうか?
列A 列B 列C
(1.1+1.1+1.1)×1.3÷2 = 2.145
=(1.1+1.1+1.1)*1.3/2 (TAKE)
こんな便利な関数もあります。
Alt+F11 → 挿入 → 標準モジュール 下のコードをコピペ
戻って=txtcalc(a1) と書き込みます。
√ 上付文字(ベキ乗)なども計算でけます。
例えば3√4(2×3) +{(3÷2)(5×4)} とかの計算もおKです。
(弥太郎)
'--------------------------------
Function txtcalc(adrs As Range) As Double
Dim data As String, d_1 As String, Cnt As Integer
Dim i As Integer, flag As Boolean, mch, d_2 As String
data = Replace(Replace(Replace(Replace(Replace(Replace(StrConv(adrs, vbNarrow), "÷", "/"), _
"×", "*"), "{", "("), "}", ")"), "[", "("), "]", ")")
If data = "" Then txtcalc = 0: Exit Function
With CreateObject("vbscript.regexp")
.Global = True
If adrs Like "*" & adrs.Font.Superscript & "*" Then
Do While i < Len(adrs)
i = i + 1
If adrs.Characters(i, 1).Font.Superscript Then
d_1 = d_1 & "^"
If adrs.Characters(i + 1, 1).Font.Superscript Then flag = True
End If
If flag Then
d_1 = d_1 & Mid$(data, i, 2)
i = i + 1
flag = False
Else
d_1 = d_1 & Mid$(data, i, 1)
End If
Loop
data = d_1
d_1 = ""
End If
data = Replace(data, "√", "Sqr")
.Pattern = "\d+\("
If .test(data) Then data = Replace(data, "(", "*(")
.Pattern = "\)\d"
If .test(data) Then data = Replace(data, ")", ")*")
.Pattern = "\)\("
If .test(data) Then data = Replace(data, ")(", ")*(")
.Pattern = "(\+|\-|\/)(\*)"
If .test(data) Then data = .Replace(data, "$1")
.Pattern = "(\*)(\+|\-|\/|\))"
If .test(data) Then data = .Replace(data, "$2")
If data Like "*Sqr*" Then
.Pattern = "(\d+|\))Sqr"
If .test(data) Then
For Each mch In .Execute(data)
data = Replace(data, mch, Split(mch, "S")(0) & "*" & "Sqr")
Next
End If
.Pattern = "Sqr\d+"
If .test(data) Then
For Each mch In .Execute(data)
data = Replace(data, mch, Sqr(Split(mch, "r")(1)))
Next
End If
.Pattern = "Sqr\("
If .test(data) Then
d_2 = data
For Each mch In .Execute(data)
Cnt = 1
For i = mch.firstindex + 5 To Len(d_2)
If Mid(d_2, i, 1) = "(" Then
Cnt = Cnt + 1
ElseIf Mid(d_2, i, 1) = ")" Then
Cnt = Cnt - 1
If Cnt = 0 Then Exit For
End If
d_1 = d_1 & Mid(d_2, i, 1)
Next i
data = Replace(data, "Sqr(" & d_1 & ")", Sqr(Evaluate(d_1)))
d_1 = ""
Next
End If
End If
.Pattern = "\D"
If .test(data) Then
For Each mch In .Execute(data)
.Pattern = "(\*|\/|\+|-|\)|\(|\.|\^|%)"
If Not .test(mch) Then
data = Replace(data, mch, "")
End If
Next mch
.Pattern = "^\*|\*$"
If .test(data) Then data = .Replace(data, "")
txtcalc = Evaluate(data)
Else
txtcalc = data
End If
End With
End Function
(alalfa)
txtcalc使ってみてすごく便利と思いました。
ただ、文字列の数式が2行のセルにある時、CONCATENATEで数式を連結させる関数を引数にしたらエラーになります。
引数に文字列数式を直接入力してもエラーになります。
これらに対応できないでしょうか?
ご教授お願いします。
(alalfa)
意味が良くわかりまへん。
セル番地で具体的な例を示してくらはい。
例
A B
1 3√4+2×4(3÷2) =txtcalc(a1) → 18
2 4(2+8+5)(13÷4) =txtcalc(a2) → 195
をどうなさりたいんでっか?
(弥太郎)
例
A B
1 3√4+2×4(3÷2) =txtcalc(CONCATENATE(a1:a2)) または =txtcalc(a1:a2) → 213
2 +4(2+8+5)(13÷4)
こちらの方、直接数字を入れての計算です。
A
1 =txtcalc(3√4+2×4(3÷2)) → 18
よろしくお願いします。
(alalfa)
この関数は未だ発展途上の関数ですからさういった計算には不向きです。
せいぜい =txtcalc(a1)+txlcalc(a2) で凌ぐのが精一杯でんなぁ。
若しくはどっかのセルに例えばB1に=CONCATENATE(a1:a2) として=txtcalc(b1)とでも
するべきですワ。
(弥太郎)
(alalfa)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.