• 締切済み

Access VBA 困惑

2つのテキストボックスに数を入力して、3つ目のテキストボックスに総和を表示するプログラムを作りたいです。(X~Y)逆にXが大きい数でYが小さい数の場合のプログラムも作りたいです。Exit Subは使えません。Forも2回は使えません。プログラムを教えて下さい。

みんなの回答

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.6

>InputBoxは、おそらく使わなくていいと言われそうです。かなり厳しい先生なので。 要するに制御構造だけを使ってということなのでしょうかね。 C言語などならば簡単なコードでできるのですが、Accessには 便利で余分な機能が絡んでくるのでどのような仕様でという ことを明確にしないと難しくなります。 そこで、以下のようにしてみました。 'テキストボックスtxt1の更新後処理 Private Sub txt1_AfterUpdate()   If Not IsNumeric(Me!txt1) Then     MsgBox "入力値が正しくありません。txt1に数値を入力してください。"     '入力した値を削除     Me!txt1 = ""     'フォーカスを一旦txt2に移し、txt1へ移す     Me!txt2.SetFocus: Me!txt1.SetFocus   End If End Sub 'テキストボックスtxt2の更新後処理 Private Sub txt2_AfterUpdate()   If Not IsNumeric(Me!txt2) Then     MsgBox "入力値が正しくありません。txt2に数値を入力してください。"     '入力した値を削除     Me!txt2 = ""     'フォーカスを一旦txt1に移し、txt2へ移す     Me!txt1.SetFocus: Me!txt2.SetFocus   End If End Sub 'コマンドボタンのクリック時のイベント Private Sub コマンド6_Click()   Dim x As Long   Dim y As Long   Dim z As Long   Dim n As Long   If Not Len(Me!txt1 & "") = 0 And Not IsNumeric(Me!txt1) Then     MsgBox "入力値が正しくありません。txt1に数値を入力してください。"     Me!txt1 = ""     'フォーカスをtxt1へ移す     Me!txt1.SetFocus   End If   If Not Len(Me!txt2 & "") = 0 And Not IsNumeric(Me!txt2) Then     MsgBox "入力値が正しくありません。txt2に数値を入力してください。"     Me!txt2 = ""     'フォーカスをtxt2へ移す     Me!txt2.SetFocus   End If   If Len(Me!txt1 & "") = 0 And Len(Me!txt2 & "") = 0 Then     MsgBox "数値が未入力です。最初からやり直してください"     Me!txt1.SetFocus   Else     If Len(Me!txt1 & "") = 0 Then       MsgBox "txt1の数値が未入力です。txt1に数値を入力してください。"       'フォーカスtxt1へ移す       Me!txt1.SetFocus     End If     If Len(Me!txt2 & "") = 0 Then       MsgBox "txt2のが未入力です。txt2に数値を入力してください。"       'フォーカスをtxt2へ移す       Me!txt2.SetFocus     End If   End If   If IsNumeric(Me!txt1) And IsNumeric(Me!txt2) Then     If CLng(Me!txt1) = CLng(Me!txt2) Then       z = CLng(Me!txt1)     Else       If CLng(Me!txt1) < CLng(Me!txt2) Then         x = CLng(Me!txt1)         y = CLng(Me!txt2)       End If       If CLng(Me!txt1) > CLng(Me!txt2) Then         x = CLng(Me!txt2)         y = CLng(Me!txt1)       End If       '計算用のForループです       For n = x To y Step 1         z = z + n       Next n     End If     Me!txt3 = z   End If End Sub 上記のこーどについて一部少し込み入った説明をしますと、 何も入力していない状態でボタンをクリックすると   If Not Len(Me!txt1 & "") = 0 And Not IsNumeric(Me!txt1) Then にかかりますが、たとえば、txt1とtxt2に数値を入れて、txt1のデータを 消してボタンをクリックすると   If Len(Me!txt1 & "") = 0 Then にかかりそれぞれ表示するメッセージボックスの内容が異なります。 これはテキストボックスのOldValueというプロパティにデータが入っているか Accessが確認するのでこういう挙動を示します。 OldValueプロパティには変更前の値が、変更後には変更後の値が格納されています。 また、txt1にデータ入っているかどうかに、   Len(Me!txt1 & "") = 0 をつかっていますが、これをIsNullを使って置き換えると   IsNull(Me!txt1) のようにすべてを置き換えると機能しない場合があります。 ほかにもいろいろあるのですが、長くなるのでこのあたりにしておきます。 わからないことがあれば補足してください。

kaitou29
質問者

お礼

制御構造だけというか完璧に自分の思っているプログラムにしないといけないといった感じです。先日、OKをもらいましたので、この課題は、終了です。ありがとうございました。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.5

>おそらくVariant型は、使えません。 特にVariant型にこだわってはいないので、 以下をString型に変更してください。   Dim varMsg1 As Variant   Dim varMsg2 As Variant   Dim varTitle As Variant   Dim varInput1 As Variant   Dim varInput2 As Variant         ↓   Dim varMsg1 As String   Dim varMsg2 As String   Dim varTitle As String   Dim varInput1 As String   Dim varInput2 As String まさか、InputBoxも使えないということもありえるのですか?

kaitou29
質問者

お礼

InputBoxは、おそらく使わなくていいと言われそうです。かなり厳しい先生なので。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

以前の質問の中で、 これに加えて逆にY~X(例えば30~10)の総和を求める。もしくは、警告を出す。 そして、テキストボックスに何も入力されていない場合と文字が入力されている場合、 エラーメッセージを出すプログラムを教えて下さい。 ということが書いてあったのですが、こちらで少し脚色をして以下のように してみました。 フォームにテキストボックスを3個、コマンドボタンを一つ。 テキストボックスは、それぞれtxt1、txt2、txt3という名前にしています。 仕組みは、テキストボックスに数値以外の文字などが入力された場合、 無限ループの中で数値の入力を求めるというものです。Exit Subが使えない ということなのでこのようにしました。ついでにInputBoxを使用したのも この理由からです。 なおInputBoxを使用する場合キャンセルボタンを押された場合の処理も 入れるのですが、この場合もExitを使わないということで 判定が0になるまでループの中を駆け回る仕様にしています。 なお、InputBoxに入れた値の判定は、     If Len(InputBoxの値 & "") = 0 Then のような処理でInputBoxに入力された値を判定します。 Private Sub コマンド777_Click()   Dim x As Long   Dim y As Long   Dim z As Long   Dim n As Long   Dim varMsg1 As Variant   Dim varMsg2 As Variant   Dim varTitle As Variant   Dim varInput1 As Variant   Dim varInput2 As Variant   Dim flg As Integer   varMsg1 = "txt1に入れる数値を入力してください"   varMsg2 = "txt2に入れる数値を入力してください"   varTitle = "数値入力"   '判定用のフラッグの設定   If IsNumeric(Me!txt1) And IsNumeric(Me!txt2) Then     flg = 0   Else     flg = 1   End If   varInput1 = ""   varInput2 = ""   '数値以外の入力があった場合の処理用の無限ループ   Do     If flg = 1 Then     MsgBox "入力値が正しくありません。数値を入力してください。" & vbCrLf & "InputBoxに数値を入力してください"       If Not IsNumeric(Me!txt1) Then         varInput1 = InputBox(varMsg1, varTitle)         If IsNumeric(varInput1) Then           Me!txt1 = CLng(Val(varInput1))         End If         If IsNumeric(varInput1) And IsNumeric(Me!txt2) Then           flg = 0         Else           flg = 1         End If       End If       If Not IsNumeric(Me!txt2) Then         varInput2 = InputBox(varMsg2, varTitle)         If IsNumeric(varInput2) Then           Me!txt2 = CLng(Val(varInput2))         End If         If IsNumeric(Me!txt1) And IsNumeric(Me!txt2) Then           flg = 0         Else           flg = 1         End If       End If     End If   Loop Until flg = 0   '計算   If CLng(Me!txt1) = CLng(Me!txt2) Then     z = CLng(Me!txt1)   Else     If CLng(Me!txt1) < CLng(Me!txt2) Then       x = CLng(Me!txt1)       y = CLng(Me!txt2)     End If     If CLng(Me!txt1) > CLng(Me!txt2) Then       x = CLng(Me!txt2)       y = CLng(Me!txt1)     End If     '計算用のForループです     For n = x To y Step 1       z = z + n     Next n   End If   Me!txt3 = z End Sub わからないところがあれば補足してください。

kaitou29
質問者

お礼

回答ありがとうございました。おそらくVariant型は、使えません。

  • mt2015
  • ベストアンサー率49% (258/524)
回答No.3

ANo.2です。 > 回答ありがとうございます。いえ、プログラムの話です。 プログラムの話であるけれど、アルゴリズム云々の前に中学レベルの数学知識で解決する問題ですよと回答したつもりでした。 For ~ Nextを使わなければいけない課題なのでしょうか? お好きな方をどうぞ(手元にAccessが無いので動作確認はしていません)。 Sub Sample()   nX = txtX.Value   nY = txtY.Value   nStart = nX   nLAst = nY   If nX > nY Then     nStart = nY     nLAst = nX   End If      nTotal = 0   For i = nStart To nLAst     nTotal = nTotal + i   Next i   txtZ.Value = nTotal End Sub Sub Sample2()   nX = txtX.Value   nY = txtY.Value   txtZ.Value = (Abs(nX - nY) + 1) * (nX + nY) / 2 End Sub

kaitou29
質問者

お礼

はい。Forループを使わなければいけません。ありがとうございました。

  • mt2015
  • ベストアンサー率49% (258/524)
回答No.2

プログラムではなく、数学の話ですね。 等差数列の和って、学校だと中学? 総和は項数*(初項+末項)/2 で出せますので、3つ目のテキストボックスには以下の計算結果を表示しましょう。 ((X-Y)の絶対値+1)*(X+Y)/2 でも、何でこれをAccessで?どちらかと言うとExcelでやる話のように思えますが?

kaitou29
質問者

お礼

回答ありがとうございます。いえ、プログラムの話です。なぜかは分かりませんが、Access VBAです。

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

補足要求したい。 >Exit Subは使えません >Forも2回は使えません >Xが大きい数でYが小さい数の場合  これはどういうことか、皆さん疑問になるように思う。 ーー 以前に、同じような質問をしてませんでしたか。  学校的なところの、質問の回答ですか?

kaitou29
質問者

お礼

Exit Subをプログラムに入れてはいけない=のちの学習の妨げになるため。For文をプログラム上で2回は、使えない。大きい数から小さい数…例えば30~10までの総和を求めたい。(10~30までの総和は、求めれるが)いうことです。以前の回答で課題を提出しましたが、上記のような指摘事項がありました。なので、質問させていただきました。

kaitou29
質問者

補足

学校です。

関連するQ&A