- 締切済み
Access VBA 困惑
2つのテキストボックスに数を入力して、3つ目のテキストボックスに総和を表示するプログラムを作りたいです。(X~Y)逆にXが大きい数でYが小さい数の場合のプログラムも作りたいです。Exit Subは使えません。Forも2回は使えません。プログラムを教えて下さい。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- piroin654
- ベストアンサー率75% (692/917)
>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) のようにすべてを置き換えると機能しない場合があります。 ほかにもいろいろあるのですが、長くなるのでこのあたりにしておきます。 わからないことがあれば補足してください。
- piroin654
- ベストアンサー率75% (692/917)
>おそらく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も使えないということもありえるのですか?
お礼
InputBoxは、おそらく使わなくていいと言われそうです。かなり厳しい先生なので。
- piroin654
- ベストアンサー率75% (692/917)
以前の質問の中で、 これに加えて逆に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 わからないところがあれば補足してください。
お礼
回答ありがとうございました。おそらくVariant型は、使えません。
- mt2015
- ベストアンサー率49% (258/524)
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
お礼
はい。Forループを使わなければいけません。ありがとうございました。
- mt2015
- ベストアンサー率49% (258/524)
プログラムではなく、数学の話ですね。 等差数列の和って、学校だと中学? 総和は項数*(初項+末項)/2 で出せますので、3つ目のテキストボックスには以下の計算結果を表示しましょう。 ((X-Y)の絶対値+1)*(X+Y)/2 でも、何でこれをAccessで?どちらかと言うとExcelでやる話のように思えますが?
お礼
回答ありがとうございます。いえ、プログラムの話です。なぜかは分かりませんが、Access VBAです。
- imogasi
- ベストアンサー率27% (4737/17069)
補足要求したい。 >Exit Subは使えません >Forも2回は使えません >Xが大きい数でYが小さい数の場合 これはどういうことか、皆さん疑問になるように思う。 ーー 以前に、同じような質問をしてませんでしたか。 学校的なところの、質問の回答ですか?
お礼
Exit Subをプログラムに入れてはいけない=のちの学習の妨げになるため。For文をプログラム上で2回は、使えない。大きい数から小さい数…例えば30~10までの総和を求めたい。(10~30までの総和は、求めれるが)いうことです。以前の回答で課題を提出しましたが、上記のような指摘事項がありました。なので、質問させていただきました。
補足
学校です。
お礼
制御構造だけというか完璧に自分の思っているプログラムにしないといけないといった感じです。先日、OKをもらいましたので、この課題は、終了です。ありがとうございました。