• 締切済み

AccessVBAについて教えて下さい。

数字の1~50までの積を求めるプログラムを作りたいのですが、上手くいきません。フォームでボタンをクリックし、テキストボックスに表示させたいです。 Dim j As Long Dim lSeki As Long lSeki = 0 For j = 1 To 50 lSeki = lSeki * j Next txtSeki.Value = lSeki 何が間違っているのでしょうか?

みんなの回答

  • HohoPapa
  • ベストアンサー率65% (455/693)
回答No.9

>回答ありがとうございました。 >学習後の課題といった感じです。 Sub Sample()  Dim j As Long  Dim lSeki As Long  lSeki = 1  For j = 1 To 11   lSeki = lSeki * j  Next  'txtSeki.Value = lSeki  MsgBox (Format(lSeki, "0")) End Sub という解で十分ですか? それともなぜ、Doublにすると概数になってしまうのかを 知りたい。あるいは >倍精度浮動小数点数型 Doubl に関する基礎知識 この説明を求めていますか? それとも、 >概数にならないような計算をさせるには、 >マニアックでちょっと複雑なコードにする必要があり、 >常識的にはやりません。 このコードを知りたいですか? そもそも、 30414093201713378043612608166064768844377641568960512000000000000 という値は、Accessでも、SQL Serveerでも、 DBに数値として格納することはできませんし、 ぶっちゃけ、入門レベルで対峙できるコードではありませんヨ。 つまり貴方の このサイトで期待しているゴール、 これがわからないので、これ以上のコメントができないんです。

kaitou29
質問者

お礼

ここで聞きたいのは、単なる答えです。まだ、課題は提出していませんが、一応皆さんの回答の通り提出してみます。学習を始める前に基礎をするとは聞いていたのですが、先生が難しい課題を出す方で…。でも、頑張ってみます。ありがとうございました。

回答No.8

補足: 1、コードは、Access で書いたものです。   検算は、Excel を利用したもの。 2、それに提示のコードにはバグがありますよ。   Dim j As Long   Dim lSeki As Long   lSeki = 1   For j = 2 To 10     lSeki = lSeki * j   Next   txtSeki.Value = lSeki  なお、積を求めるのは1~10で良いのでは。でないと検証もできないでしょう。

kaitou29
質問者

お礼

ありがとうございました。

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

なぜアクセスVBAを使うのか。この課題はAccess特有の内容ではなくて、ACCESS(の特徴を学ぶ)の勉強に資さないと思うし、エクセルVBAの方が適している。 勉強する際の、情報量(記事)が、WEBでは圧倒的にエクセルVBAが多い。 中間結果や最終結果を(エクセルは、シートのセルがあって)表示しやすい。 ユーザーフォームを使うにしても、エクセルでもユーザーフォームのコントロールなど充実している。 ーー エクセルの関数で、FACT(階乗を求める関数)があるのを知っているか。 結果をもとめるならこのほうが手っ取り早い。ただ有効数字桁数は、特別に 長くなるわけではない。 ーー 階乗は、結果の数値が、すぐ桁数が大きくなる。 だから50までの階乗を求める(10進数で)などは、普通には正確に、表示できない。 ExcelもAccessも数値の桁数は15、6桁どまり。 それ以上を求めたいなら、特別のアルゴリズムを勉強して表示しないとダメだろう。小生も文系で、多桁計算は素人で、詳細は説明できないが。 円周率の100桁計算表示とかも、その点では似ているだろう。 ーー 階乗の結果が10進数で何ケタになるか、は1つの学習問題です。 https://oshiete.goo.ne.jp/qa/3929475.html など Googleで「階乗 計算 桁数」で照会すれば、たくさん記事がある。 ーー Excelでは、例えば A1:A5に10,20、・・、50と入れて Sub test37() For i = 1 To 5 f = 1 For u = 1 To Cells(i, "A") f = f * u Next u Cells(i, "C") = f Next End Sub を実行してみればわかる(列幅をひろくして、書式を数値に設定する)。50までは、おろか、5でも終りの方の桁は正確には出てこない。用途によっては、使い物にならないことが判るだろう。 ーー アクセスの数値型が 倍精度浮動小数点型(-1.79769313486231×10^308~-1.79769313486231×            10^308の範囲。少数点以下の数値が扱える) と言っても、有効数字は15ケタ程度のはず。指数表示になる。 https://oshiete.goo.ne.jp/qa/311622.htmlなど

kaitou29
質問者

お礼

回答ありがとうございました。なるべく自分で考えさせるためでしょう。エクセルの関数については知りません。

  • HohoPapa
  • ベストアンサー率65% (455/693)
回答No.6

Sub Sample()  Dim j As Long  Dim lSeki As Double  lSeki = 1  For j = 1 To 50   lSeki = lSeki * j  Next  MsgBox (Format(lSeki, "0")) End Sub といったコードにすれば計算できますが 桁数が多すぎ、オーバーフローを起こし 計算結果は次の概数になります。 3.04140932017134E+64 つまり、 30414093201713400000000000000000000000000000000000000000000000000 このあたりは 倍精度浮動小数点数型 Doubl に関する基礎知識が必要です。 概数にならないような計算をさせるには、 マニアックでちょっと複雑なコードにする必要があり、 常識的にはやりません。 私が計算してみる限り 30414093201713378043612608166064768844377641568960512000000000000 という結果になります。 もはや、数値として扱うことのできる桁数では到底ありません。 今回の質問が入門レベルのコーディングの学習であれば 無謀な課題です。

kaitou29
質問者

お礼

回答ありがとうございました。学習後の課題といった感じです。

回答No.5

検討事項: 1、dSeki の初期値=1 に設定する。 2、For-Nextのループを1から開始する。   1*1=1・・・・が果たして必要かどうか?

kaitou29
質問者

お礼

ありがとうございました。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.4

1*2*3*4*・・・・ 1から50までを全部かけるってことですよね lSeki の型はDouble でないとオーバーフローしますよ  Dim j As Long  Dim lSeki As Double  lSeki = 1  For j = 1 To 50   lSeki = lSeki * j  Next  txtSeki.Value = lSeki

kaitou29
質問者

お礼

ありがとうございました。なるほどDoubleですね。

  • masatsan
  • ベストアンサー率15% (179/1159)
回答No.3

lSeki = 0 → ISeki=1

kaitou29
質問者

お礼

ありがとうございました。

回答No.2

Private Sub コマンド1_Click()   Dim I   As Integer   Dim lSeki As Long      lSeki = 1   lSeki = lSeki * 2   lSeki = lSeki * 3   lSeki = lSeki * 4   lSeki = lSeki * 5   lSeki = lSeki * 6   lSeki = lSeki * 7   lSeki = lSeki * 8   lSeki = lSeki * 9   lSeki = lSeki * 10   MsgBox lSeki End Sub  上は、1~10までの積(1*2*3*4*5*6*7*8*9*10)を求めるVBAコードです。で、課題は   lSeki = lSeki * 2   ・・・・・   lSeki = lSeki * 10 を For-NEXT 文に直すこと。 Private Sub コマンド0_Click()   Dim I   As Integer   Dim lSeki As Long      lSeki = ?1   For I = ?2 To 10     lSeki = ?3 * ?4   Next I   MsgBox lSeki End Sub  まず、1~10でテストしたら・・・

kaitou29
質問者

お礼

ありがとうございました。しかし、エクセルではなくアクセスです。

回答No.1

lSeki = 0 ↓ lseki=1 では? 0は何を何回かけても0ですので。

kaitou29
質問者

お礼

ありがとうございました。

関連するQ&A

専門家に質問してみよう