- 締切済み
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 何が間違っているのでしょうか?
- みんなの回答 (9)
- 専門家の回答
みんなの回答
- HohoPapa
- ベストアンサー率65% (455/693)
>回答ありがとうございました。 >学習後の課題といった感じです。 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に数値として格納することはできませんし、 ぶっちゃけ、入門レベルで対峙できるコードではありませんヨ。 つまり貴方の このサイトで期待しているゴール、 これがわからないので、これ以上のコメントができないんです。
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
補足: 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で良いのでは。でないと検証もできないでしょう。
お礼
ありがとうございました。
- imogasi
- ベストアンサー率27% (4737/17069)
なぜアクセス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など
お礼
回答ありがとうございました。なるべく自分で考えさせるためでしょう。エクセルの関数については知りません。
- HohoPapa
- ベストアンサー率65% (455/693)
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 という結果になります。 もはや、数値として扱うことのできる桁数では到底ありません。 今回の質問が入門レベルのコーディングの学習であれば 無謀な課題です。
お礼
回答ありがとうございました。学習後の課題といった感じです。
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
検討事項: 1、dSeki の初期値=1 に設定する。 2、For-Nextのループを1から開始する。 1*1=1・・・・が果たして必要かどうか?
お礼
ありがとうございました。
- watabe007
- ベストアンサー率62% (476/760)
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
お礼
ありがとうございました。なるほどDoubleですね。
- masatsan
- ベストアンサー率15% (179/1159)
lSeki = 0 → ISeki=1
お礼
ありがとうございました。
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
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でテストしたら・・・
お礼
ありがとうございました。しかし、エクセルではなくアクセスです。
- kanemoto_s
- ベストアンサー率45% (112/244)
lSeki = 0 ↓ lseki=1 では? 0は何を何回かけても0ですので。
お礼
ありがとうございました。
お礼
ここで聞きたいのは、単なる答えです。まだ、課題は提出していませんが、一応皆さんの回答の通り提出してみます。学習を始める前に基礎をするとは聞いていたのですが、先生が難しい課題を出す方で…。でも、頑張ってみます。ありがとうございました。