• 締切済み

Nullの使い方が不正ですのエラーメッセージについ

AccsessとVB間でデータの参照、登録、作表、出力等のプログラムを稼動させております。 作表を行なうのにデータ範囲を指定し出力を行なおうとするとソートプラグラム中に”Nullの使い方が 不正です”のエラーメッセージが表示され出力ができません。 Function SortOperator(myTxt) As String 'マーク前に_がついているのでとります。 myTxt = Right(myTxt, Len(myTxt) - 1) ここがエラー表示されます。 何故でしょうか?

みんなの回答

  • layy
  • ベストアンサー率23% (292/1222)
回答No.10

関数内で対処したところで、今回のNULLの中断エラーは出なくなるかもしれないですが、NULLを生み出していることはそのままですから、それは無視できないし関数内だけ直す、でもない。上っ面だけ直すのか。 とにかく 発生していること事態が問題ではないかを確認。 発生しないようにしてやると今回の中断はおきないでしょう。 次に 関数内で想定してない引数を受けた時の対応が漏れていることがわかったので改善を考える。 関数なので値渡したら何か返す、機能単純のが良い。 NULL渡してNULL返すのは疑問視。関数から戻った所の対応、影響が増えるだけでは?。事前にエラーとわかっているのに関数呼ぶのは無駄な処理ということもある。 不正引数を発生しないようにすること と 関数内で発生したエラーの検知を改善すること 2つ課題がありますね。

  • layy
  • ベストアンサー率23% (292/1222)
回答No.9

関数ですから、 CALL元A-->SortOperator-->CALL元Aに結果が返る。 CALL元B-->SortOperator-->CALL元Bに結果が返る。 CALL元C-->SortOperator-->CALL元Cに結果が返る。 この動きは変えたくないはず。 CALL元D-->SortOperator--中断???。 SortOperatorで 途中で止まるなりメッセージを付与する(関数に手を入れる)、というのは それなりの結果か、CALL元に影響ないか、テストしなければならない。 CALL元でおかしい結果が返ってきたと検知させてエラー処理とするにしても 関数の結果SortOperator=???にメッセージ入れたりエラーコードいれたり、 これも本来の結果値とはイレギュラーな対策となる。 全体の影響を考えると確認事項が増えて効率は悪くなる恐れがある。 CALL元A-->SortOperator-->CALL元Aに結果が返る。 CALL元B-->SortOperator-->CALL元Bに結果が返る。 CALL元C-->SortOperator-->CALL元Cに結果が返る。 で CALL元Aでnullが起きると判明、 CALL元Bでnullが起きないと判明、 CALL元Cでnullが起きないと判明、 となれば CALL元Aで何か対策を施して、正しいならSortOperatorを実行するのが妥当。 これは、 SortOperatorをCALLする直前で「NULL」を検知できるからであって、 対策としては最小限に留まる。 SortOperatorに正しい値を送っているのに結果が不正、となれば これはSortOperator内で対処するしかない。 CALL元Aでnullが起きると判明、 CALL元Bでnullが起きると判明、 CALL元Cでnullが起きると判明、 となると、あらゆるところで起きることが考えられ、 SortOperator内で対処するのが効果があると考えられる。 nullが起きるのが正しいのか、おかしいのか、 対処をするのはどこが一番問題なく、影響なく、工数少なく、等みて適しているか、 そういうことを踏まえて、 ようやくどこを直すかが決まってくる。 対策は、質問者様自身コードを読みとれないので、 1人で片づけることはしない方が良いです。 ここで出た意見も合わせて、 システム有識者を交えてレビューして決めること。 myTxtがnullというか0バイトのとき、 myTxt = Right(myTxt, Len(myTxt) - 1) myTxtが1バイトのとき、 myTxt = Right(myTxt, Len(myTxt) - 1) 何が起きているかは最低限把握すること。 前任者と連絡つくなら、おさらいすること。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.8

どういう作業をしているか説明がないときちんとしたものが書けませんしし、#7さんのご指摘の通りで、単独の関数で、こういう作り込みしてしまうよりも、プロシージャ内で処理するべきだと思います。引数、myTxt は、Variant で受けているから、IsNullで振り分ければよいわけでしょうけれども、求めている出力に、長さ0の文字列出力がよいのかなって、ちょっと疑問ですね。なお、Access なら、Null 値自体は不可避だと思います。 ふつうは、   SortOperator = myTxt  End If '↑この後に、End If というのは普通はないのですが、これは、あくまでも、長さ0の文字列を出力する、ということを許す条件で括ります。言い換えると、  If Not IsNull(myTxt) And (Len(myTxt) > 1 And Len(myTxt) < 4) Then この部分から、End If は、プロシージャ側というか、関数に引数を与える時に、分岐したほうがよいですね。関数は、なるべく単純化したほうが使いやすいです。 Function SortOperator(myTxt As Variant) As String  If Not IsNull(myTxt) And (Len(myTxt) > 1 And Len(myTxt) < 4) Then   myTxt = Right(myTxt, Len(myTxt) - 1)   If Len(myTxt) = 2 Then    myTxt = "B" & myTxt   ElseIf Len(myTxt) = 1 Then    If myTxt Like "[1-9]" Then     myTxt = "B0" & myTxt    ElseIf myTxt Like "[A-Z]" Then     myTxt = "A" & myTxt    End If   End If   SortOperator = myTxt  End If End Function

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.7

#5,#6です。 本来は、関数を使用するプロシージャの中で、 Nullデータを取得していないか、確認して Nullデータでなければ、関数を実行、 Nullデータならば、それに対応する 処理、たとえばメッセージを出す、 あるいは、処理を中止するなどの 方法を取るようにしないと、エラーが どこで出たのか分かり辛くなります。 したがって、関数に持たすエラー処理と、 関数を使用するプロシージャのエラー 処理は明確に役割分担をしておくのが 必要です。 しかしながら、プロシージャの構造により 関数の中で条件分岐をせざるをえないならば、 この処理を行ないます。

  • layy
  • ベストアンサー率23% (292/1222)
回答No.6

引数にNULLが来ると想定してないです。だからと言って、NULLが来たら処理をスキップする、のは暫定的であり本来の対処ではありません。 この処理後の返す値がNULLになると、これまた後続にも想定してないNULL事象を招き修正箇所が増えるだけです。 おそらくこの部分は本対策としては当初のままで直す必要ありません。 NULLが発生した箇所で発生しないように対処し、この処理をCALLするときにNULLが来ないようにします。これをまず考える。 NULLとなることの真偽を 確認すること。 エラーメッセージ箇所を直さないといけない、ということはありません。エラーメッセージ箇所と違う箇所を直すこともあります。 根っこを突き止めること。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.5

#4です。 訂正。 >なお、End Function の前にもう一つEnd Ifを >入れないとエラーが生じます。追加しておきました。 ではなく、 なお、SortOperator = myTxt の前にもう一つEnd Ifを 入れないとエラーが生じます。追加しておきました。 です。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

Visual Basic のバージョンはわかりませんが、 コードの記述からVB6とします。 ありていに言えば、変数myTxTにNullが渡されたので エラーが生じているのです。 No2の方のリンク先にもあるような処理を すれば、myTxTにNullが入ってきてもエラー を回避し、処理ができます。したがって、 Function SortOperator(myTxt) As String 'myTxTにNullが渡されていない場合、処理を実行 If Not IsNull(myTxt) Then myTxt = Right(myTxt, Len(myTxt) - 1) If Len(myTxt) = 2 Then myTxt = "B" & myTxt ElseIf Len(myTxt) = 1 Then If Asc(myTxt) > 48 And Asc(myTxt) < 58 Then myTxt = "B0" & myTxt ElseIf Asc(myTxt) > 64 And Asc(myTxt) < 91 Then myTxt = "A" & myTxt End If End If SortOperator = myTxt End If End Function なお、End Function の前にもう一つEnd Ifを 入れないとエラーが生じます。追加しておきました。 コンパイルをするように。

  • layy
  • ベストアンサー率23% (292/1222)
回答No.3

マークの箇所 の付近を修正する。 先頭から DIM MYLEN AS LONG MYLEN=LEN(MYTXT) IF MYLEN=0 OR MYLEN=1 THEN MYTXT="" ELSE MYTXT=RIGHT(MYTXT,MYLEN-1) ENDIF 黄色の箇所は MYTXTによっては処理実行できないことがあります。その実行できないだろうと思われる事象のとき、の処置がありません。 1文字以下の文字列から 左1文字を取り除き、残り右部分のnバイトをセットしますがnが0だとうまく動かない。 上の修正は一例で本来の対策でありません。正しいとも言えません。 なので 設計、承認できる人に正しい判断を仰ぐ。 修正前のコードは残す。 引数MYTXTが1文字以下にならないようにする。 直し方より何が起きてエラーになったのかつかむ。

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.2

エラーメッセージがわかっているならまずはググってみる。 http://okwave.jp/qa/q1059653.html

  • layy
  • ベストアンサー率23% (292/1222)
回答No.1

エラー行、エラーメッセージがわかっているのに、質問する意図が不明ですが。 MyTxt 引数の時点でNULLだとLEN関数結果がどうなるか 引数の時点で1バイトだとRIGHT関数結果がどうなるか この2点を確認。 MyTxt 引数を上書きで良いか。 FUNCTIONの帰り値はセットしているか。 MyTxt がNULLは発生していいのか。

tubakiyama4286
質問者

補足

前任者より引継ぎ初心者のため説明不足で申し訳ありません。 Function SortOperator(myTxt) As String myTxt = Right(myTxt, Len(myTxt) - 1 **ここにエラーマークが付き黄色になっています If Len(myTxt) = 2 Then myTxt = "B" & myTxt ElseIf Len(myTxt) = 1 Then If Asc(myTxt) > 48 And Asc(myTxt) < 58 Then myTxt = "B0" & myTxt ElseIf Asc(myTxt) > 64 And Asc(myTxt) < 91 Then myTxt = "A" & myTxt End If SortOperator = myTxt End Function 以上が構文で何処を同訂正すればいいのかわかりません。 出力が出来るようにしたいのですが お教えください