こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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
何が間違っているのでしょうか?

投稿日時 - 2018-11-23 04:19:30

QNo.9560743

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(9)

ANo.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に数値として格納することはできませんし、
ぶっちゃけ、入門レベルで対峙できるコードではありませんヨ。

つまり貴方の
このサイトで期待しているゴール、
これがわからないので、これ以上のコメントができないんです。

投稿日時 - 2018-11-28 14:28:57

お礼

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

投稿日時 - 2018-11-28 19:12:22

ANo.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で良いのでは。でないと検証もできないでしょう。

投稿日時 - 2018-11-23 17:13:19

お礼

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

投稿日時 - 2018-11-23 17:25:38

ANo.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など

投稿日時 - 2018-11-23 15:52:03

お礼

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

投稿日時 - 2018-11-23 17:24:31

ANo.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
という結果になります。
もはや、数値として扱うことのできる桁数では到底ありません。

今回の質問が入門レベルのコーディングの学習であれば
無謀な課題です。

投稿日時 - 2018-11-23 14:40:31

お礼

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

投稿日時 - 2018-11-23 17:20:10

ANo.5

検討事項:

1、dSeki の初期値=1 に設定する。
2、For-Nextのループを1から開始する。

  1*1=1・・・・が果たして必要かどうか?

投稿日時 - 2018-11-23 12:30:24

お礼

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

投稿日時 - 2018-11-23 17:04:49

ANo.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

投稿日時 - 2018-11-23 11:19:56

お礼

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

投稿日時 - 2018-11-23 17:04:18

ANo.3

lSeki = 0 → ISeki=1

投稿日時 - 2018-11-23 10:04:13

お礼

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

投稿日時 - 2018-11-23 17:03:22

ANo.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でテストしたら・・・

投稿日時 - 2018-11-23 08:02:33

お礼

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

投稿日時 - 2018-11-23 17:02:49

ANo.1

lSeki = 0

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

投稿日時 - 2018-11-23 06:02:26

お礼

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

投稿日時 - 2018-11-23 17:01:21

あなたにオススメの質問