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

締切り済みの質問

Access VBA 困惑

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

投稿日時 - 2018-12-12 20:12:08

QNo.9567172

困ってます

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

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

回答(6)

ANo.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)
のようにすべてを置き換えると機能しない場合があります。

ほかにもいろいろあるのですが、長くなるのでこのあたりにしておきます。
わからないことがあれば補足してください。

投稿日時 - 2018-12-20 12:58:02

お礼

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

投稿日時 - 2018-12-24 00:46:12

ANo.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も使えないということもありえるのですか?

投稿日時 - 2018-12-16 18:00:22

お礼

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

投稿日時 - 2018-12-18 18:53:37

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




わからないところがあれば補足してください。

投稿日時 - 2018-12-15 10:52:09

お礼

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

投稿日時 - 2018-12-16 13:42:41

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

投稿日時 - 2018-12-14 10:02:15

お礼

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

投稿日時 - 2018-12-14 21:37:09

ANo.2

プログラムではなく、数学の話ですね。
等差数列の和って、学校だと中学?

総和は項数*(初項+末項)/2 で出せますので、3つ目のテキストボックスには以下の計算結果を表示しましょう。
((X-Y)の絶対値+1)*(X+Y)/2

でも、何でこれをAccessで?どちらかと言うとExcelでやる話のように思えますが?

投稿日時 - 2018-12-13 11:07:07

お礼

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

投稿日時 - 2018-12-13 21:15:13

ANo.1

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

投稿日時 - 2018-12-12 21:35:23

補足

学校です。

投稿日時 - 2018-12-13 21:21:57

お礼

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

投稿日時 - 2018-12-13 03:17:46

あなたにオススメの質問