• ベストアンサー

テキストのデータ型

ある数式を計算しグラフを作るプログラムを作っていますが、テキストに数式をいれて、計算させようとすると、「型が一致しません」とでます。ソースは以下の通りです。 For x1 = xsta to xend y1=CSng(Text1.Text) Picture1.PSet (x1, y1) next x1 ここで、text1に「2*x1+1」みたいな数式を入れたいと考えています。 ちなみにxsta,xend,x1,y1ともにsingleです。CSngの使い方が間違っているのでしょうか?よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.2

こんにちは。maruru01です。 Text1.Textの内容は、 「2*x1+1」 という文字列です。文字列中の「*」や「+」の記号、「x1」という変数名は、意味を持ちません。 数式ではなく、数式のように見える、あくまで文字列です。 数式と思っているのはこれを見ている(入力した)人の"勝ってな判断"で、VBは数式とは判断しません。 したがって、「2*x1+1」は数値には変換出来ず、型変換エラーになります。 もしこれを数式として使用するなら、この文字列を、「2」「*」「x1」「+」「1」に分割して計算式を組み立てる必要があります。 それよりも、式が1次関数(ax+bの形)に決まっているなら、2つのテキストボックスに傾きと切片をそれぞれ数値で入力するようにして、 y1 = CSng(Text1.Text) * x1 + CSng(Text2.Text) のようにするといいと思います。 ちなみに、このコードの「*」や「+」、「x1」と、最初の「2*x1+1」の中の「*」や「+」、「x1」は、まったく意味が違う別の物ということですよ。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

自由に入力した四則多項式に従って値を計算させるには、数式のコンパイラの仕組みを作る必要があるように思います。逆ポーランド記法に変換し、演算するなど結構面倒そう。ミスがあると、影響が大きいと思います。熟達者でないと避けるべきと思います。しかしやって見たくなる仕様個所ですね。式の方が限定されたパターンなら、演算記号と変数部分を分解し、シコシコ演算すれば解決するかも。

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.1

VBに数式を文字列で式を与えて計算させる機能はありませんので、外部のコンポーネントを使うしかありません。 Excelを使うのであれば、こんな感じ Private Sub Form_Click() Dim Xls As Object 'Excel.Application Dim X1 As Single Dim Y1 As Single Dim s As String Set Xls = CreateObject("Excel.Application") For X1 = 1 To 10 s = "2*x1+1" s = Replace(s, "x1", X1) Y1 = Xls.Evaluate(s) Print X1, Y1 Next Set Xls = Nothing End Sub

関連するQ&A

  • [VBA] for文の3次元ループ

    for文の3次元ループがうまく働いてくれません。 8通り(2x2x2)の組み合わせ表示を期待しましたが2通り(y1のみ)のみでループが終わってしまいます。エラーなどはでません。何が原因なのか分かりません。ご指導お願いします。 Public x1 As Single, y1 As Single, z1 As Single Sub Start1() i=1 For x1 = 0.3 To 0.4 Step 0.1 For y1 = 0.5 To 0.6 Step 0.1 For z1 = 0.4 To 0.5 Step 0.1 Cells(i, 1) = x1 Cells(i, 2) = y1 Cells(i, 3) = z1 i=i+1 Next z1 Next y1 Next x1 End Sub

  • データを別なプログラムでも利用したいのですが

    例えばAのプログラムで for x=1 to 10 y=x-5 next x として(x,y)の値を何らかのファイルとして保存し 別なプログラムBでそのデータを利用して picture1.pset(x,y) と作りたいのですが、このときはどのように作ればよいのでしょうか 宜しくお願いします。VB6を使っています 最初のプログラム(A)では↓こんな風に作るのかなと思いますが… Open "C:\WINDOWS\デスクトップ\実験.dat" For Output As #1 For x = 1 To 10 y = x-5 Write #1, x, y Next x Close #1

  • 消す軌跡と残す軌跡

    For t = 0 To 6 Step 0.01 Picture1.Line (0, 0)-(Cos(t), Sin(t)) Picture1.Cls Picture1.PSet (Cos(t), Sin(t)) Next t アニメーションで Line文の描く軌跡は消したいのでClsを使ったのですが Pset文の描く軌跡は残したいのです。 その場合どうしたらいいのでしょうか? 上のプログラムですとline文の軌跡もPset文の軌跡も消えてしまいます。

  • グラフを書きたいのですがどのようにして使うかわかりません

    FOR I=-200 to 200 FOR J=-200 to 200 X(0) = I / 100 ; Y(0) = J / 100 FOR N=0 to 1000 X(N+1) = X(N)^2 - Y(N)^2 + X(0) Y(N+1) = 2*X(N)*Y(N)+Y(0) IF X(N)^2 + Y(N)^2 > 4 THEN PSET(I,J) WHITE ELSE IF N = 1000 THEN PSET(I,J) BLUE ELSE NEXT N END IF NEXT J; NEXT I というグラフを書くプログラムがあるのですがこのプログラムの使い方がわからなくて使えないのでどのようにすれば見れるのか教えてください。

  • VB6 ドラッグ&ドロップ

    Image1をPicture1(正方形)にドラッグ&ドロップするプログラム を作りたいと思っています。 このプログラムだとImage1全体がドラッグされるのではなく、 Image1の絵はその位置に残ってImage1の外枠だけがドラッグされてしまいます。 外枠だけでなくImage1の絵も一緒にドラッグできるようにするにはどうすればいいのでしょうか? また、このプログラムだとドロップする場所(Picture1_)以外で ドロップしてしまった場合でも画面上からImage1の絵と外枠が消えてしまいます。 ドロップする場所(Picture1_)以外でドロップしてしまった場合は、 Image1全体を画面上に残しておきたいのですがどうすればいいのでしょうか? Option Explicit Dim dx As Single, dy As Single Private Sub Form_Load() Image1.Picture = LoadPicture(App.Path & "picture.jpg") Image1.Stretch = True End Sub Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single) Source.Move X - dx, Y - dy End Sub Private Sub Image1_MouseDown(Button As Integer, Shift As Integer, _ X As Single, Y As Single) Image1.Drag 1 dx = X: dy = Y 'マウスダウン位置 End Sub Private Sub Picture1_DragDrop(Source As Control, X As Single, Y As Single) Source.Visible = False 'ドロップオブジェクトを非表示にする Picture1.BackColor = RGB(255, 255, 255) End Sub Private Sub Picture1_DragOver(Source As Control, X As Single, Y As Single, _ State As Integer) If State = 0 Then Picture1.BackColor = RGB(0, 0, 255) If State = 1 Then Picture1.BackColor = RGB(255, 255, 255) End Sub

  • VB2005 図形

    VisualBasic2005で Dim n As Integer, m As Integer Dim i As Integer, j As Integer Const lenn = 1500, PAI = 3.14159 Dim th As Single, th1 As Single, th2 As Single Dim x1 As Integer, x2 As Integer Dim y1 As Integer, y2 As Integer n = Val(TextBox1.Text) m = Val(TextBox2.Text) If n < 2 Or m < 2 Then   Exit Sub End If For i = 0 To n - 1   For j = 1 To n - 1     th = j * (PAI / n)     th1 = i * (PAI / m) + th     th2 = i * (PAI / n) - th     x1 = Math.Cos(th1) * lenn + 2000     y1 = Math.Sin(th1) * lenn + 2000      x2 = Math.Cos(th2) * lenn + 2000      y2 = Math.Sin(th2) * lenn + 2000   Next Next の様なコードを使って 球をPictureBoxに書きたいのですが どこにどんなコードが足りないのでしょうか? 教えて下さい

  • VBによる回帰直線のプログラム

    VB6を本を見ながら勉強していますが、どの本にもフォーム上にグラフを表示するものばかりでピクチャボックスに回帰直線y=ax+bの直線を描けるようにはどうしたらいいのかプログラムに困っています。どなたか分かる方いましたらよろしくお願いします。ちなみにプログラムはこのようになっています; Private Sub Command1_Click() Dim c(10) As Double Dim d(10) As Double Dim cx As Integer, cy As Integer, lx As Integer, ly As Integer '----------------------------------------------------------------- 'ピクチャボックスの初期化 Picture1.Cls 'グラフの位置 cx = 60 cy = 320 lx = 300 ly = 300 'グラフ枠を描画 Picture1.FillColor = QBColor(15) Picture1.Line (cx, cy)-(cx + lx, cy - ly), , B '縦軸の目盛り Picture1.DrawStyle = 2 '線の種類 点線 For i = 0 To 5 Picture1.Line (cx, cy - 60 * i)-(cx + lx, cy - 60 * i) Picture1.CurrentX = cx - 25 'ラベルを表示する場所の指定 Picture1.CurrentY = cy - 60 * i '横軸を描画 Picture1.Print Format(i) 'ラベル出力位置を設定 '(i*縦軸の目盛りの倍数 現在は10倍 Next i '横軸の目盛り For i = 0 To 5 Picture1.Line (cx + 60 * i, cy)-(cx + 60 * i, cy - ly) Picture1.CurrentX = cx + 60 * i Picture1.CurrentY = cy + 5 Picture1.Print Format(i) Next i '------------------------------------------------------------------------ Dim n As Integer 'n:データ数 n = Val(Text3.Text) For i = 0 To n - 1 c(i) = Val(Text1(i).Text) d(i) = Val(Text2(i).Text) Next i 'データを○印でプロット For i = 0 To n - 1 Picture1.Circle (cx + 60 * c(i), cy - 60 * d(i)), 3, QBColor(0) Next i 'ここまで成功---------------------------------------------------------------------- 'xに関する平均値と標準偏差の計算プログラム Dim sx As Double, sxx As Double, avx As Double, sdx As Double Dim x(10) As Integer For i = 0 To n - 1 x(i + 1) = c(i) Next i sx = 0 sxx = 0 For i = 1 To n sx = sx + x(i) sxx = sxx + x(i) * x(i) Next i avx = sx / n sdx = Sqr((sxx - n * avx * avx) / n) 'yに関する平均値と標準偏差の計算プログラム Dim sy As Double, syy As Double, svy As Double, sdy As Double Dim y(10) As Double 'インデックスが範囲を超えているのエラーの解決 10を代入 For i = 0 To n - 1 y(i + 1) = d(i) Next i sy = 0 syy = 0 For i = 1 To n sy = sy + y(i) syy = syy + y(i) * y(i) Next i avy = sy / n sdy = Sqr((syy - n * avy * avy) / n) '-------------------------------------------------------------------------------------- '回帰直線y=ax+bを描く End Sub

  • エクセルで計算したいです。

    下記の公式をエクセルの数式で計算したいのですが、 2点間距離 √(X1-X2)二乗+(Y1-Y2)二乗 (X1-X2)二乗+(Y1-Y2)二乗を√で計算したいです。

  • テキストBOXに入力した数式をプログラムソースとして使うには

    VB5.0でテキストBOXに数式(y=2*xのような式)を入力すると、文字列と認識しますが、これを変数化してプログラムのソースにしたいのです。どのような方法があるでしょうか。 ぜひ、お教えください。よろしくお願い致します。

  • 【エクセルのマクロ】テキストボックスが空白でもエラーが出ないようにしたい

    エクセルを使って、ユーザーフォームのテキストボックスに入力した小数点を含む数字をコピー、もし入力されていなければセルの中を消すマクロを書いていて、次のようなプログラムをテキストボックスとおなじユーザーフォームにあるボタンに取り付けました。 n3 = (n_3.Text) If n3 = Empty Then Range("j23").ClearContents Else Range("j23").Value = n_3 End If しかし、この方法だとコピーした数字が文字列として保存されてしまい、 計算に不向きなので、数字データとしてコピーするためにいちばん上の行に Dim n3 As Single と入れたところ、テキストボックスが空白の場合”型が一致しません”と表示されてエラーが出てしまいます。 調べたところ、Emptyという言葉はSingleのデータ型には使えないことまではわかったのですが、代わりにどのような言葉を使えばよいのかがわかりませんでした。 どなたかEmptyの代わりとなるような言葉か、プログラムを教えていただけないでしょうか?

専門家に質問してみよう