アプリ版:「スタンプのみでお礼する」機能のリリースについて

ACCESS2007 フォーム  「バリアント型でない変数にNull値を代入しようとしました」エラーの回避策について
 
Access2007でデータシート型のフォームを作成し、SQLテーブルの情報をメンテできるようにしようとしています。
システム構築ではなく、できるだけライトな運用ということでこのパターンとしました。
ただ、その中でもできる限り利便性は上げたいと思い、各種の入力制御を設けていますが、
一点、ある項目にいったん格納されたデータを削除しようとした場合、「バリアント型でない変数にNull値を代入しようとしました」のエラーがでてしまう点がどうしても解決できません。
「””」を入力することで消すしかない状況です。
 
NULLを入力した場合に自動で「””」に変換しデータ格納できるような方法を探しています。
 
※なお、今回、SQLテーブルの設定は変更することはできない、というのが前提になっています。
 
Webで色々を調査していますが、下記のようなソース(NULLの場合、自動で別な文字列に置換える)もあり試してみましたが、
そもそも データを格納できてはじめて NULLかどうかの判断が可能になると思われ、
今回のようにテーブルの設定を変えられない状況ではデータ格納前にはじかれているので使用できないように思いました。
 
Private Sub AAA_AfterUpdate()
If IsNull(AAA) Then
AAA = ""
End If
End Sub
 
なにとぞアドバイスをお願いいたします・・・・・・。

質問者からの補足コメント

  • ご回答頂きました皆様、
    いったんアプローチを再検討してみたいと思います。
    お忙しい中、ご教授頂きまして誠にありがとうございました。

      補足日時:2018/08/31 16:11

A 回答 (7件)

Private Sub AAA_AfterUpdateは、データ更新後にチェックするイベントですので、チェックの前の更新でエラーになってしまいます。


AfterUpdateの代わりに、BeforeUpdateのイベントでチェックするようにしてはいかがでしょう?
そうすれば、更新の前にチェックが動作し、Nullを""に置き換えてくれると思います。
ご参考まで。
    • good
    • 1
この回答へのお礼

ありがとうございます。
BeforeUpdate は知りませんでした。
早速試してみました。以下の状況です。

①格納済みのデータを削除しようとした場合
やはり「バリアント型でない変数にNull値を代入しようとしました」エラー が出ました・・・

②データを新規に入力しようとした場合
(1)データを新規に入力した時点で、このメッセージが出る。
>「イベント プロパティに指定した式 更新前処理 でエラーが発生しました。プロシージャの宣言が、イベントまたはプロシージャの定義と一致していません。」
>*マクロ名、ユーザー定義関数名、[イベント プロシージャ]以外の式が指定されています。
>*関数、イベント、マクロの評価でエラーが発生しました。

(2)「OK」を押すと、このエラーが出る。
>値がフィールドまたはレコードの入力規則に違反しています。

(3)結果的に、新規にデータを入力できない状態になっています。

すみませんが、よろしくお願いします。

お礼日時:2018/08/30 15:46

> ただ、その中でもできる限り利便性は上げたいと思い、各種の入力制御を設けていますが


というのが気になりますね。どのように制限を付けているのですか?
AAAの元の項目の型と、このレコードのキー項目の型を教えてください。
またデータシートビューのこれらの項目のプロパティは既定値から変更していますか?
そして前回の回答でも書かせていただきましたが、すべてのイベントプロシージャのない状態で、つまりまっさらなフォームで、データ削除→nullで更新かける処理をやってみてください。それでも同じようにエラーが出る場合は、更新手続きの問題ではなさそうです。
ご参考まで。
    • good
    • 0
この回答へのお礼

制限ですが、単に IME入力モード をオフまたは使用不可にしている程度になります。
なお、先程の結果は、その影響を除外してみるため、まっさらなフォームで新規作成したもので試した結果になります・・・・
ということはおっしゃるように「それでも同じようにエラーが出る場合は、更新手続きの問題ではなさそうです。」ということなんですね・・・・

また、先程の 「イベント実行前にエラーが発生してしまっている」 ということもわかったため、いったんアプローチを再検討してみたいと思います。
お忙しい中、ご教授頂きまして誠にありがとうございました。
大変勉強になりました。

お礼日時:2018/08/31 16:09

ステップ実行の仕方:


モジュールのすべてのイベントの先頭でF9キーを押すと、左端に●が出て行が茶色になります。
その状態で、問題の処理を実行すると、実行しようとする行が黄色になります。
そこで、F8キーを押すと、1ステップずつ実行されます。
String型または数値型変数に値を入れている所でエラーになると思います。
問題の無かったイベントは、再びF9キーを押して茶色を消しましょう。
    • good
    • 0
この回答へのお礼

ありがとうございます。やってみて理解出来ました。ただ残念ながら現状わかったことで、データ削除→nullで更新かけた場合、イベントの実行よりも前にエラーが出ているようなのです。

お礼日時:2018/08/31 13:15

エディタでただ AAA_ の箇所を form_ に置き換えただけではありませんか?


デザインビューの左上の四角の所をクリックしてフォームが選択された状態にしてから、更新前処理のイベントを新たに追加してください。
①の方、すべてのイベントサブルーチンを削除してもエラーになりますか?
    • good
    • 0
この回答へのお礼

ありがとうございます。
早速やってみました。(なお新たに まっさらなフォームを再作成しました)
①まだ出る
②(1)(2) とも 出なくなった
という状況でした。

★このイベントの動作状況を確認するため、イベントの各部分にMSGBOXを置いてみました。
―――――――――――――
Private Sub Form_BeforeUpdate(Cancel As Integer)
MsgBox ("★START")
If IsNull(AAA) Then
MsgBox ("★null")
AAA = ""
Else
MsgBox ("★not null")
End If
End Sub
―――――――――――――
★この結果わかったこと:
・通常の問題ない入力の場合は正しく動作している。(MSGBOX:「★START」⇒「★not null」と表示される)
・NULL入力の場合は、MSGBOXは表示されず、「「バリアント型でない変数にNull値を代入しようとしました」のエラーがでる。
ということで、イベント実行前にエラーが発生してしまっているようでした・・・
こうなると BeforeUpdateでは制御できないということでしょうか・・・

お礼日時:2018/08/31 09:55

AAA_BeforeUpdateではなく、Form_BeforeUpdateに


If IsNull(AAA) Then AAA = "" End If
を書いたらうまくいきませんでしょうか?
項目の変更時ではなく、レコードの変更時のチェックという意味です。
    • good
    • 1
この回答へのお礼

ありがとうございます。

対象項目「AAA」に、下記 で設定してみました。(対応これで良かったでしょうか?)
先の ①、 ②(1)のエラーはまだ出ました。 ②(2)はでなくなりました。

Private Sub form_BeforeUpdate()
If IsNull(AAA) Then
AAA = ""
End If
End Sub

お礼日時:2018/08/30 16:40

どこでエラーになっているのか、ステップ実行で確認しましょう。

    • good
    • 0
この回答へのお礼

ありがとうございます。
確認する方法がわかりませんが トライしてみます。

お礼日時:2018/08/30 15:48

テーブルのフィールドプロパティで、、、


「値要求」は「いいえ」になっていますか?
「空文字列の許可」は「はい」になっていますか?
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます。
「値要求」 「文字列の許可」 ともに はい になっています。
※なお、今回はテーブルの設定変更はできないのが前提となっております。
よろしくお願いします。

お礼日時:2018/08/30 15:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す


このQ&Aを見た人がよく見るQ&A