• ベストアンサー

12+21=1221??

先日も質問させていただいた件ですが、 Access2000で電卓のプログラムを組んでいます。 Select Case b   Case 0:   Case 1: c = a + d   Case 2: c = a - d   Case 3: c = a * d   Case 4: c = a / d End Select Forms!電卓!txt = c とプログラムを組んで、処理させているのですが、 「b=1」のとき、変な値になってしまうのです。 「a=12」、「d=21」のとき、「c=33」になるはずですよね? それが、「c=1221」となってしまうんです。 他の、「b=2」、「b=3」、「b=4」のときはちゃんとした値がでるのですが、 「b=1」のときだけ上手くいきません。 「a=1」、「d=999」、といったような、「1桁+α桁」であれば上手く計算できるのですが、 「α桁+β桁」の場合、変な答えになってしまいます。 どうしてでしょうか?補足はします。 よろしくお願いします。

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

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

こんにちは。maruru01です。 aとdの値が文字列として扱われているからだと思います。 「-」「*」「/」の場合は自動的に数値に変換してくれますが、「+」は文字列の連結でも使用しますので、そのまま文字列として連結されたのだと思います。 したがって、計算する際にVal関数やCDbl、CLngなどの型変換関数を通せばいいと思います。 (一応、統一性もあるので他の演算も変換しておきましょう。) Select Case b   Case 0:   Case 1: c = Val(a) + Val(d)   Case 2: c = Val(a) - Val(d)   Case 3: c = Val(a) * Val(d)   Case 4: c = Val(a) / Val(d) End Select

liebe
質問者

お礼

早速の回答、ありがとうございます。 やはり、そうでしたか・・・ 早速、やってみます。 ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (7)

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

変数宣言をせよの問題とか 静的変数として値を保持せよとか 型変換の問題とか出ていますが、本件はテキストボックスに値を入れさせそれを使っているに違いない、 (1)テキストボックスのTextプロパティは、文字列型(String)の値を返します(#7のご回答) (2)2つ以上の文字列に対して「+」は&と同じく文字列の結合になること。(#4のご回答) (3)VAL(A)などで数値に直して、演算すべき(#2のご回答) の3点がポイントでしょう。 前問では一度作ったことがあるとかだッたようですが頑張ってください。

liebe
質問者

お礼

ありがとうございました。 何とか解決しました。  

すると、全ての回答が全文表示されます。
  • happypoint
  • ベストアンサー率36% (521/1422)
回答No.7

#3です。 電卓プログラムということですが、 変数に格納する値を、 フォームのテキストボックスから取得したりしていないですか? テキストボックスのTextプロパティは、文字列型(String)の値を返しますよ。 計算に使用する値は、 つねに静的変数として値を保持しておくことをお勧めします。

liebe
質問者

お礼

何度もありがとうございます。 変数の定義に問題があったみたいです。 何とか解決しました。 ありがとうございました。

すると、全ての回答が全文表示されます。
  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.6

再びmaruru01です。 補足ですが。 変数の宣言を、 Dim a, d, b As Long とすると、bだけがLongで宣言されて、aとdはVariant型になってしまいますよ。 全てLongで宣言する場合は、 Dim a As Long, d As Long, b As Long または、 Dim a As Long Dim d As Long Dim b As Long のようにして下さい。

liebe
質問者

お礼

何度もありがとうございます。 変数は一度に宣言できないんですね。 どうもこれが問題となってたみたいです… 無事に解決できました。 ありがとうございました。

すると、全ての回答が全文表示されます。
  • Mizyu
  • ベストアンサー率41% (245/593)
回答No.5

この現象は変数「a」が文字列として認識されたときに起こります。 変数宣言が Dim a As Long となっているか確認してください。 ※もしくは宣言箇所が実行箇所では有効にならない変数宣言をしている可能性があります。 AcsessなどのVB系言語では宣言をしないとValiant型になります。 それでもうまくいかないときは応急処置方法として c = clng(a) + clng(d) という手もあります。

liebe
質問者

お礼

早速の回答、ありがとうございました。 変数は、Long で宣言しています。 (変数は全て最初に宣言しています。) 参考にさせていただきます。 ありがとうございました。

すると、全ての回答が全文表示されます。
  • PAPA0427
  • ベストアンサー率22% (559/2488)
回答No.4

Accessでは、「+」を使うと、文字列の連結「&」として扱われる時があります。 つまり、変数cが文字列で宣言されてませんか?aとbは数値タイプで宣言されてますね。 変数cを数値タイプで宣言してください。そしてForms!電卓!txt = CStr(c)としてください。

liebe
質問者

お礼

早速の回答、ありがとうございます。 変数は全て Long で宣言してるんですが、 やはり文字列として処理されてるのでしょうね。 参考にさせていただきます。 ありがとうございました。

すると、全ての回答が全文表示されます。
  • happypoint
  • ベストアンサー率36% (521/1422)
回答No.3

こんにちは。 変数が、文字列として認識されているので、このような結果になったのでしょう。 「+」には文字列を連結する働きもあります。 このようなことにならないために、変数の宣言は必ず行いましょう。 また、変数に値を格納する前に、型変換の関数を用いて、文字列から数値型への変換を行うことも重要です。

liebe
質問者

お礼

早速の回答、ありがとうございました。 変数は全て Long で宣言してたんですが、 やはり文字列を繋いだ、って感じで処理されてるんですね。 参考にさせていただきます。 ありがとうございました。

すると、全ての回答が全文表示されます。
noname#11856
noname#11856
回答No.1

各変数は数値型で宣言されていますか?

liebe
質問者

お礼

何とか解決しました。 ありがとうございました。

liebe
質問者

補足

早速のアドバイス、ありがとうございます。 変数は全て Long で宣言してます。

すると、全ての回答が全文表示されます。

関連するQ&A