Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


134 / 2272 ツリー ←次へ | 前へ→

【12890】リスト外データをテーブルに追加する まき 15/10/15(木) 16:01 質問[未読]
【12891】Re:リスト外データをテーブルに追加する かるびの 15/10/15(木) 21:11 回答[未読]
【12892】Re:リスト外データをテーブルに追加する まき 15/10/16(金) 17:07 お礼[未読]

【12890】リスト外データをテーブルに追加する
質問  まき  - 15/10/15(木) 16:01 -

引用なし
パスワード
   リスト外データをテーブルに追加するコードを書きましたがうまく動かないのでご教示の程よろしくお願いします
1.While (strNewData2 = vbNullString)〜からWendまでが飛ばされる
2.(パラメータが少なすぎます1を指定して下さい)というエラーメッセージ

Private Sub 社員名_NotInList(NewData As String, Response As Integer)

  Dim strNewData As Long  
  Dim strMessage As String 
  Dim strNewData2 As String  
  Dim strMessage2 As String 

  While (strNewData = Null)
    strNewData = InputBox("管理IDを入力してください。")
    If (strNewData = Null) Then
      strMessage = "新しいデータの登録を中止しますか?"
      GoSub StopOrContinue
 
    ElseIf DCount("*", "社員名簿", "'管理ID=" & strNewData & "'") Then
  
      strNewData = Null
      strMessage = "同じ管理IDが登録済みです。" & vbCrLf _
            & "新しいデータの登録を中止しますか?"
      GoSub StopOrContinue
    End If
  Wend
  
  While (strNewData2 = vbNullString) -------------------------------1.ここからWendまで飛ばされる(Inputboxが出ない)
    strNewData2 = InputBox("社員コードを入力してください。")
    If (strNewData2 = vbNullString) Then
      strMessage2 = "社員コードは必須です。" & vbCrLf _
            & "新しいデータの登録を中止しますか?"
      GoSub StopOrContinue
    End If
  Wend

  CurrentDb.Execute _
    "INSERT INTO 社員名簿 ( 管理ID, 社員コード, 社員名 )" ------------2.エラー(パラメータが少なすぎます1を指定して下さい)
    & " VALUES (strNewData, '" & strNewData2 & "', '" & NewData & "');"
  Response = acDataErrAdded  

ExitProcedure:
  Exit Sub

StopOrContinue:
  If (vbYes = MsgBox(strMessage, vbYesNo + vbQuestion)) Then
    Response = acDataErrContinue
    Exit Sub
  End If
  Return
End Sub

最後迄行くまでにエラーが出るのでコードが間違っている箇所はまだあるかもしれませんが
よろしくお願いします

【12891】Re:リスト外データをテーブルに追加する
回答  かるびの  - 15/10/15(木) 21:11 -

引用なし
パスワード
   >1.While (strNewData2 = vbNullString)〜からWendまでが飛ばされる

 Wendって初めて見ました。
 ヘルプで確認してみましたが、While...Wendっていう構文がVBAにはあるんですね。
 同じことをVBAで書く場合、Do...Loopを使うのが多いと思います。

 ところで、このコードですが、「strNewData2 = vbNullString」という式が成り立つ限り、
While...Wend間がループされるというものです。
 この式が成り立たなければ、While...Wend間が実行されることはありません。

 なので、飛ばされる原因は、「strNewData2 = vbNullString」という式が成り立たない
ということです。


 そこで、この式をもっと細かく見てみます。

 まず、変数strNewData2です。
 この変数は、「Dim strNewData2 As String」で宣言されてから 
「While (strNewData2 = vbNullString)」に至るまでに何も代入されていないので、
「While (strNewData2 = vbNullString)」のコード実行時のstrNewData2の値は、長さ0の文字列です。

 strNewData2は、何も代入されないまま、上記のコードで使われているわけですが、
どんな値が格納されていると考えているのでしょうか。

 
 次に、vbNullStringという定数です。
 私はそんな定数があることを知りませんでした。なので、ヘルプを見てみました。すると、

>vbNullString  
>値 0 を持つ文字列   
>長さ 0 の文字列 ("") とは異なります。外部プロシージャを呼び出す場合に使用します。

とありました。
 また、「"0" = vbNullString」という条件式が成り立つか実験してみましたが、
成り立たないという結果でした。
 ついでに、「0 = vbNullString」という条件式が成り立つか実験してみましたが、
データ型違いのエラーになりました。
 結局、vbNullStringって具体的にはどんな値なのかよくわかりませんでした。

 
 いずれにしても、「strNewData2 = vbNullString」という条件式は、
「"" = 正体不明」という意味になるわけですが、この条件式が成り立つことはあり得ません。
 なので、While (strNewData2 = vbNullString)からWendの間が飛ばされてしまうわけです。


>2.(パラメータが少なすぎます1を指定して下さい)というエラーメッセージ
 アクセスでは頻出のエラーメッセージです。
 しかも、エラーメッセージを見ても、何が悪かったのかを把握できない
という困ったエラーメッセージです。

 このエラーメッセージが出る場合というのは、ほぼ決まっています。
 SQL文中で当該テーブルにないフィールド名が使われている場合です。
 言い換えると、
>"INSERT INTO 社員名簿 ( 管理ID, 社員コード, 社員名 )"
の中に「社員名簿」テーブルにないフィールド名があるということです。
 そして、「1を指定して下さい」ということなので、そういうフィールドが1つある
ということです。
 「管理ID」の前の半角スペースあるいは「社員名」の後の半角スペースが怪しいと思います。


 質問では言及されていませんが、ほかにもおかしなところがあります。

 まず、
>Dim strNewData As Long 
です。
 変数の名付け方にハンガリアン記法というのがあります。
 これに従った場合、「strNewData」という変数はString型とするのが通常ですが、
実は長整数型だったわけで、びっくりです。
 ハンガリアン記法に従うなら、長整数型は「lngNewData」という変数名にするのが通常です。

 ま、変数名の名付け方は人それぞれなので、間違いだというわけではありませんが。


 次に
>While (strNewData = Null)
です。
 「strNewData = Null」という条件式が成り立つことはあり得ません。
 なので、「While (strNewData = Null)」から「Wend」までのコードが実行されることも
絶対にありません。

 まず、Nullであるかどうかは、「=」では調べられません。IsNull関数を使います。
 次に、strNewDataは、長整数型の変数ですから、Nullを格納できません。
 なので、「strNewData = Null」という条件式が成り立つことは絶対にありません。
 
 また、strNewDataには、値を何も格納していませんから、
strNewDataに格納されているのは、初期値である0です。
 strNewDataには、何が格納されると考えていますか。


 次に
>If (strNewData = Null) Then
です。
 このIf文のTrueパート(IfからElseまでの間)が実行されることは絶対にありません。
 理由は、上記と同じことです。


 次に
>strNewData = Null
 です。
 このコードがもしも実行されれば、データ型違いというエラーになります。
 長整数型の変数には、Nullを格納できないからです。
 
 
 次に
>GoSub StopOrContinue
です。
 GoSubってあまり見ないです。
 Gotoを使うか、サブプロシージャを呼び出すことが多いと思います。


 次に
>Response = acDataErrAdded
です。
 NonListイベントはそれほど使ったことはないのですが、
多分、追加クエリの前にこのコードを実行しないとだめだと思います。
 ヘルプの使用例でも、データを追加する前に「Response = acDataErrAdded」が書かれていました。


 それから、
>While (strNewData = Null)

>While (strNewData2 = vbNullString)
のループです。
 現状では条件式が成り立つことがなく、ループ内に入れないため、問題が顕在化していませんが、
もしもこのループの中に入ってしまえば、無限ループになります。
 ループ内での処理から見て、ループ抜けの条件が成り立つことがないからです。


 最後に、私は明日から温泉です。次のレスができるのは週明けになります。

【12892】Re:リスト外データをテーブルに追加する
お礼  まき  - 15/10/16(金) 17:07 -

引用なし
パスワード
   早速のご回答ありがとうございます

>ところで、このコードですが、「strNewData2 = vbNullString」という式が成り>立つ限り、
>While...Wend間がループされるというものです。・・・

ここは氏名フィールドに値が入っていない場合と認識していました。なので、値が入っていないのは今登録しようとしているレコードのみなのでそれでいいのかな?と思っていました。
で、入力されないままだとここは入力必須だよと入力を促して、入力されないままなら強制的に終わらせるということでした。


>次に、vbNullStringという定数です・・・
>「strNewData = Null」という条件式が成り立つことはあり得ません。
> なので、「While (strNewData = Null)」から「Wend」までのコードが実行され>ることも
>絶対にありません。
> まず、Nullであるかどうかは、「=」では調べられません。IsNull関数を使いま>す。
> 次に、strNewDataは、長整数型の変数ですから、Nullを格納できません。
> なので、「strNewData = Null」という条件式が成り立つことは絶対にありませ>ん。

自分自身空欄というものにはいつも悩まされています、Nullは長整数型のフィールドには格納できないのですね。

ご指摘の件を見直しまして下記のように書き換えたらうまくいきました。

Private Sub 氏名_NotInList(NewData As String, Response As Integer)
  Dim strNewData As String
  Dim strMessage As String
  Dim strNewData2 As String

  While (strNewData = vbNullString)
    strNewData = InputBox("管理IDを入力してください。")
     If (strNewData = vbNullString) Then
       strMessage = "管理IDは必須です。" & vbCrLf _
            & "新しいデータの登録を中止しますか?"
      GoSub StopOrContinue

     ElseIf DCount("*", "社員名簿", "管理ID=" & strNewData) Then
      strNewData = vbNullString
      strMessage = "同じ管理IDが登録済みです。" & vbCrLf _
            & "新しいデータの登録を中止しますか?"
      GoSub StopOrContinue
     End If
  Wend
  
  While (strNewData2 = vbNullString)
    strNewData2 = InputBox("社員コードを入力してください。")
     If (strNewData2 = vbNullString) Then
        strMessage = "社員コードは必須です。" & vbCrLf _
             & "新しいデータの登録を中止しますか?"
      GoSub StopOrContinue
     ElseIf DCount("*", "社員名簿", "社員コード= '" & strNewData2 & "'") Then
      strNewData2 = vbNullString
      strMessage = "同じ社員コードが登録済みです。" & vbCrLf _
            & "新しいデータの登録を中止しますか?"
      GoSub StopOrContinue
     End If
  Wend
  
  CurrentDb.Execute _
     "INSERT INTO 社員名簿 ( 管理ID, 社員コード, 社員名 )" _
    & " VALUES ('" & strNewData & "', '" & strNewData2 & "', '" & NewData & "');"
  Response = acDataErrAdded

ExitProcedure:
  Exit Sub

StopOrContinue:
   If (vbYes = MsgBox(strMessage, vbYesNo + vbQuestion)) Then
    Response = acDataErrContinue
    Exit Sub
   End If
   Return
End Sub

ただ、動いているというだけでおかしなコードかもしれませんが、取りあえずご報告させていただきます。

134 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078188
(SS)C-BOARD v3.8 is Free