[[20081012185737]] 『文字列の計算式を計算』(alalfa) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『文字列の計算式を計算』(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
 をどうなさりたいんでっか?
          (弥太郎)


説明不足ですみません。
セルのスペース上、計算式を2行にしたとします。
それらの範囲を指定して例のような感じで計算できないでしょうか?


        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.