[[20110407171229]] 『計算式内の文字列を無視して計算結果を表示する』(アロハー) ページの最後に飛ぶ

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

 

『計算式内の文字列を無視して計算結果を表示する』(アロハー)
スミマセンお助け下さい、下記のとおり計算式のセルに文字列混合(数字と注釈文)
の計算式を入力し、結果は答えのセルに表示する表を作成したいのですが、
うまくいきません、関数でもマクロでも良いので教えて下さい。
宜しくお願い申し上げます。
(Excel2007,Windows Vista)

    計算式のセル        答えのセル

 20*3(追加)+15*4(新規)+0.55    122.55

 25*2+15*4+0.75(変更)       110.75


 細かく検証していませんが、こんな感じで対応できますでしょうか?
 
 ユーザー定義関数ですb
 
Function EVAL(rng As Range)
    EVAL = Evaluate(Replace(Replace(Replace(StrConv(rng, vbNarrow), "(新規)", ""), "(追加)", ""), "(変更)", ""))
End Function
 
 =EVAL(A1)
 のように入力してください。
 
 ※追加、新規、変更のみで考えています。
 
 (キリキ)(〃⌒o⌒)b 

 正規表現で。
 (文字列) というパターンをすべて排除します。

 Function spaeval(rng As Range)
    With CreateObject("VBScript.RegExp")
       .Pattern = "\([^0-9]+\)"
       .Global = True
       spaeval = Evaluate(.Replace(rng.Value, ""))
    End With
 End Function
  
(純丸)(o^-')b

 純丸さん、お久し〜♪
 
 正規表現に挑戦しようとした仲間として、ちょいイチャモンw
 
 2重に括弧があったばやいどないします?
 例 : 25*2+15*4+(0.75+0.25(変更))
 
 調べたら、2バイト文字を検出するのに
 こんなのを発見しましたb
 
 [^\x01-\x7E]
 
 ついでに、純丸さんのコードを勝手に変更して考えてみましたw
 
Function spaeval(rng As Range)
Dim MyStr As String
Dim x As Variant
    MyStr = StrConv(rng.Value, vbNarrow)
    With CreateObject("VBScript.RegExp")
        .Pattern = "\([^\x01-\x7E]+\)"
        .Global = True
        For Each x In .Execute(MyStr)
            MyStr = Replace(MyStr, x, "")
        Next x
        spaeval = Evaluate(MyStr)
    End With
End Function
 
 #正規表現、すっかり頭から消えてましたw
 思い出すのに時間かかったw
(キリキ)(〃⌒o⌒)b 


 面白そうなので、私もイチャイチャ(笑)

 25*2+15*4+(0.75+0.25(変更1))
 25*2(変更1)+15*4+(0.75*(1+2)+0.25(変更2))

 こんな場合どうします?
 キリキさんのコードをお借りして〜♪

  Function momoeval(rng As Range)
  Dim MyStr As String
  Dim buf As Variant
  Dim obj As Object
  MyStr = StrConv(rng.Value, vbNarrow)
  With CreateObject("VBScript.RegExp")
    .Pattern = "\([^()]*\)"
    .Global = True
    While MyStr Like "*(*)*"
      For Each obj In .Execute(MyStr)
        buf = Application.Evaluate(obj.Value)
        If IsError(buf) Then
          MyStr = Replace(MyStr, obj, "")
        Else
          MyStr = Replace(MyStr, obj, buf)
        End If
      Next obj
    Wend
    momoeval = Application.Evaluate(MyStr)
  End With
  End Function
 (momo)

みなさん、ありがとうがざいます
 震災後は人の温かさつくづく感じます、感謝!
 昨夜も大きな地震が有り、身の回りの整理がつきましたら
 みなさんのアイディアを試してみます。
 ありがとうございました。
 (アロハー)

 実は昨日の時点で、(変更1) のような文字列があるとエラーになると
 気づいていたのですが、時間がなくて 見切り発車してしまいました。
 二重カッコまでは気が付きませんでしたが、、。

 momoさんにフォローしていただいたので安心です。

 キリキさん、以前のようにまた「突っ込み合い」をやりたいですね。
 
(純丸)(o^-')b

 >実は昨日の時点で、(変更1) のような文字列があるとエラーになると
 >気づいていたのですが、時間がなくて 見切り発車してしまいました。
 流石です!
 momoさんも、純丸さんも、そういった事まで想定していたなんて・・・
 いつも見切り発車のσ(^_^;)ですwww
 
 >キリキさん、以前のようにまた「突っ込み合い」をやりたいですね。
 やりたいですね〜♪
 やるためには、もう少しスキルを上げていかねば^^;
 
(キリキ)(〃⌒o⌒)b 

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.