[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『文字列の計算式を計算』(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.