エクセルのできそうでできない技。

A1セルに「500×2」を文字列として入力します。A2ではA1を参照して、関数を使い計算できる式に変換します。要するに「500*2」ですね。最後にA3で、A2の式を参照して、500*2を計算させた結果1000を表示したいのですが、計算されず式のまま表示されどうもうまくいきません。A3にはどのような設定をするとうまくいくんでしょうか?

回答の条件
  • 1人1回まで
  • 登録:2007/03/30 01:59:45
  • 終了:2007/03/31 01:47:54

回答(3件)

id:nandedarou No.1

nandedarou回答回数230ベストアンサー獲得回数342007/03/30 02:23:50

ポイント20pt

A2の「500*2」はあくまで文字としてエクセルは認識し、それを参照しただけでは、計算しようとはしません。次のようにしてみて下さい。


A2に次のように入力

=SUBSTITUTE(A1,"×","*")

A3に次のように入力

=LEFT(A2,FIND("*",A2)-1)*RIGHT(A2,LEN(A2)-FIND("*",A2))

※ただし、上記の方法では、「500÷2」、「500×2×3」などには対応しておりません。

id:keronimo

汎用的に使えないと厳しい。

欄外のコメントによりおまけポイント。

2007/03/31 01:44:21
id:Mook No.2

Mook回答回数1312ベストアンサー獲得回数3912007/03/30 02:53:41

ポイント100pt

標準関数では難しいですが、マクロの Evaluate 関数を使用することで、文字列を計算することが出来ます。


ちょうど、今回のケースと同じ内容が掲載されているますので、下記が参考になるかと思います。

文字列の数式を計算する

id:keronimo

よく回答していただいる方ですね。

今回は標準モジュールとeval関数を採用しました。

2007/03/31 01:46:19
id:llusall No.3

llusall回答回数505ベストアンサー獲得回数612007/03/30 07:36:35

ポイント50pt

ポイント

C1セルは、VBAの「Evaluate」関数を利用したユーザ定義関数を使用して、

式を評価させます。

ユーザ定義関数の作成

1.メニューから、[ツール]-[マクロ]-[VisualBasicEditor]から、VBAのエディタを起動します。

2.エディタのメニューから、[挿入]-[標準モジュール]から、標準モジュールを作成します。

3.以下の関数を記述します。

Option Explicit

'(標準モジュール)

Function Eval(ByVal expr As String)

Eval = Evaluate(expr)

End Function

ワークシートの記述

A1セル

500×3   <--全角の数字でも可!


B1セル

=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,"+","+"),"-","-"),"×","*"),"÷","/")


C1セル

=eval(B1)

参考

SHOJI's Code

数式文字列を評価 (EXCEL VBA)

Excel(エクセル)基本講座:文字列の関数

文字列中から検索文字列を探し、置換文字列に置き換えます

id:keronimo

トラックバックの内容についていけませんが、参考になりました。

2007/03/31 01:46:58
  • id:nandedarou
    回答した後に、四則演算に対応する方法を思いつきました。
    1回しか回答できないので、ここに書きます。

    (1)A2に以下の数式を書き
    =SUBSTITUTE(SUBSTITUTE(A1,"×","*"),"÷","/")

    (2)シートのマクロとして以下のコードを書く
    Private Sub Worksheet_Change(ByVal Target As Range)
    Range("A3") = "=" & Range("A2")
    End Sub

    例えば、「((500+2)÷2-10)*4」でも計算できます。
  • id:llusall
    Mookさんと同じですね。
    そもそもユーザ定義関数を使用するのであれば、B1セルの数式は不要ですね。
    演算子の置換もユーザ定義関数の中で行えば済むことですし。
  • id:SALINGER
    Evaluate関数を使えば済むんだけど、nandedarouさんのアプローチの仕方も好きですねぇ。
    If Target = Range("A2") Then Range("A3") = "=" & Range("A2")
    にするともっといいですねぇ。
  • id:llusall
    >SALINGER さん
    試してないのですが、ちょっと違くないですか?

    A1:入力
    A2:数式
    A3:計算表示
    とすると、
    Addressで比較して、こんな感じでしょうか。

    Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = Range("A1").Address Then
    Range("A3").Formula = "=" & Range("A2")
    End If
    End Sub


  • id:nandedarou
    >llusallさん
    引数が、Target As Rangeとなっているので、SALINGERさんのように、TargetとRangeをIFで比較して大丈夫だと思いますよ。

    >そもそもユーザ定義関数を使用するのであれば、B1セルの数式は不要ですね。
    >演算子の置換もユーザ定義関数の中で行えば済むことですし。
    なるほど、標準モジュールに書けばワークシートから呼び出せますね。うっかりしてました。
    llusallさんの提示した回答のユーザ定義関数Evalに次のコードを含めれば、B1セル不要ですね。

    expr = Replace(expr, "÷", "/")
    expr = Replace(expr, "×", "*")
    expr = Replace(expr, "+", "+")
    expr = Replace(expr, "-", "-")
  • id:llusall
    nandedarou さん
    フォローありがとうございます。

    >TargetとRangeをIFで比較して大丈夫
    そうなんですか。
    私はてっきり
    「VALUE」(デフォルトプロパティ?)での比較
    になってしまうので、「アドレス」で比較にならないのかと
    思っていました。

    SALINGER さん
    大変失礼しました。

  • id:nandedarou
    llusallさん、SALINGERさん
    私、「TargetとRangeをIFで比較して大丈夫」と書きました。
    確かに、実用上は問題ないことが多いと思いますが、
    やはり、あまりよくないことがわかりました。

    以下、詳細です。

    VBAのデバッグ機能を使って検証したところ、
    If Target = Range("A2") とした場合、If Target.Value = Range("A2").Value と解釈されるようです。Targetが例え、A2セルでなくても、たまたまA2セルと同じ内容(Value)が入っていた場合、TRUEとなります。
    よって、llusallさんのコメントのようにAddressプロパティーで比較した方がよさそうです。

    llusallさん
    大変申し訳ありませんでした。
  • id:SALINGER
    いらぬことを書いて間違えたようねw

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません