過去ログ

                                Page     535
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ▼ユーザーが数式を入力  陽炎 03/1/12(日) 2:11
   ┣Re:ユーザーが数式を入力  ポンタ 03/1/12(日) 10:05
   ┃  ┗Re:ユーザーが数式を入力  陽炎 03/1/13(月) 1:27
   ┃     ┗Re:ユーザーが数式を入力  ポンタ 03/1/13(月) 9:26
   ┣Re:ユーザーが数式を入力  ichinose 03/1/13(月) 10:12
   ┃  ┗Re:ユーザーが数式を入力  ポンタ 03/1/13(月) 10:48
   ┗Re:ユーザーが数式を入力  陽炎 03/1/13(月) 12:12

 ───────────────────────────────────────
 ■題名 : ユーザーが数式を入力
 ■名前 : 陽炎 <yohey@jn2.so-net.ne.jp>
 ■日付 : 03/1/12(日) 2:11
 -------------------------------------------------------------------------
   はじめまして
ユーザーに変数を含む数式を入力させたい
のですがなかなかうまくいきません.
VBA初心者なので低レベルな質問かも
しれませんが結構困っています.
自分で作ってみたのはおおまかには
↓のようなプログラムです.

Dim x, f
Dim msgx, msgf As String

'(1)fに変数xを含む数式を入力
msgf="関数を入力してください"
f = InputBox(msgf)

'(2)変数xの値を入力
msgx="xの値を入力してください"
x = InputBox(msgx)

'(3)fの計算結果を表示
MsgBox(f)

どうやら数式をただの文字列として
認識してしまっているようなのですが
なにかいい方法はないでしょうか
 ───────────────────────────────────────  ■題名 : Re:ユーザーが数式を入力  ■名前 : ポンタ  ■日付 : 03/1/12(日) 10:05  -------------------------------------------------------------------------
   >'(1)fに変数xを含む数式を入力
>msgf="関数を入力してください"
>f = InputBox(msgf)

ここでどんな式を入力させようとしているかによって、
簡単だったり、ちょっと難しくなるだけで済んだり、
すごく難しくなったり、
ほとんど不可能になったりするように思います。

入力させたい式を例示するとレスがつきやすいと思います。
 ───────────────────────────────────────  ■題名 : Re:ユーザーが数式を入力  ■名前 : 陽炎 <yohey@jn2.so-net.ne.jp>  ■日付 : 03/1/13(月) 1:27  -------------------------------------------------------------------------
   >入力させたい式を例示するとレスがつきやすいと思います。

ご意見ありがとうございます.
入力させたいのはごく初等数学的な数式
たとえば
f = x ^ 2 + x + 1

f = sin ( x )
などです.
 ───────────────────────────────────────  ■題名 : Re:ユーザーが数式を入力  ■名前 : ポンタ  ■日付 : 03/1/13(月) 9:26  -------------------------------------------------------------------------
   私の知る限り、ほとんど不可能だと思います。

理由その1
VBAは「f = x ^ 2 + x + 1」を式として認識しない

理由その2
「f = InputBox(msgf)」は文字列型を返すが、
VBAは文字列を式として評価できない。
(私が知らないだけかもしれませんが・・・)

上記2つの理由から、どうしても実現したい場合は、

"f = x ^ 2 + x + 1"が入力されたら、
"x * x + x + 1"を計算せよ。

と、いうように式とその解き方をコード内に明記してしてください。
以下がそのサンプルコードになります。

Sub test()
  Dim f As String
  Dim x As Single
  Dim msgf As String
  Dim msgx As String
  
  msgf = "関数を入力してください"
  f = InputBox(msgf)
  
  msgx = "xの値を入力してください"
  x = InputBox(msgx)
  
  Select Case f
  Case "x ^ 2 + x + 1"
    MsgBox (x * x + x + 1)
  Case "Sin(x)"
    MsgBox (Sin(x))
  End Select
End Sub

与えられる可能性のある全ての式について
式とその解き方を明記しないと動きませんから、
ほとんど不可能だと思います。
 ───────────────────────────────────────  ■題名 : Re:ユーザーが数式を入力  ■名前 : ichinose  ■日付 : 03/1/13(月) 10:12  -------------------------------------------------------------------------
   ▼陽炎 さん、ポンタさん、
おはようございます。
細かいエラー処理はしていませんが、Evaluateメソッドを使用してみました。
Sub test()
  Dim f As String
  Dim x As Single
  Dim msgf As String
  Dim msgx As String

  msgf = "関数を入力してください"
  f = InputBox(msgf)

  msgx = "xの値を入力してください"
  x = InputBox(msgx)
  f = Replace(f, "x", x)
  MsgBox Application.Evaluate(f)
End Sub
 ───────────────────────────────────────  ■題名 : Re:ユーザーが数式を入力  ■名前 : ポンタ  ■日付 : 03/1/13(月) 10:48  -------------------------------------------------------------------------
   ichinose さん、おはようございます。

Evaluate(f)

って言う命令あるんですね。(^_^;)

Perlなどにも同様の命令があるので、
探したことがあるのですが、見つからなかったため、
ないんだろうと思い込んでおりました。

ありがとうございます。
 ───────────────────────────────────────  ■題名 : Re:ユーザーが数式を入力  ■名前 : 陽炎 <yohey@jn2.so-net.ne.jp>  ■日付 : 03/1/13(月) 12:12  -------------------------------------------------------------------------
   ポンタさん,ichinoseさんありがとうございました.
やりたかったことがなんとかできました.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 535