Access VBA質問箱 IV

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

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


416 / 9994 ←次へ | 前へ→

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


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

278 hits

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

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