メモのコツを教えてください!

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

A 回答 (10件)

関数内で対処したところで、今回のNULLの中断エラーは出なくなるかもしれないですが、NULLを生み出していることはそのままですから、それは無視できないし関数内だけ直す、でもない。

上っ面だけ直すのか。

とにかく
発生していること事態が問題ではないかを確認。
発生しないようにしてやると今回の中断はおきないでしょう。

次に
関数内で想定してない引数を受けた時の対応が漏れていることがわかったので改善を考える。
関数なので値渡したら何か返す、機能単純のが良い。
NULL渡してNULL返すのは疑問視。関数から戻った所の対応、影響が増えるだけでは?。事前にエラーとわかっているのに関数呼ぶのは無駄な処理ということもある。



不正引数を発生しないようにすること

関数内で発生したエラーの検知を改善すること

2つ課題がありますね。
    • good
    • 1

関数ですから、


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)

何が起きているかは最低限把握すること。
前任者と連絡つくなら、おさらいすること。
    • good
    • 0

どういう作業をしているか説明がないときちんとしたものが書けませんしし、#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
    • good
    • 1

#5,#6です。



本来は、関数を使用するプロシージャの中で、
Nullデータを取得していないか、確認して
Nullデータでなければ、関数を実行、
Nullデータならば、それに対応する
処理、たとえばメッセージを出す、
あるいは、処理を中止するなどの
方法を取るようにしないと、エラーが
どこで出たのか分かり辛くなります。

したがって、関数に持たすエラー処理と、
関数を使用するプロシージャのエラー
処理は明確に役割分担をしておくのが
必要です。

しかしながら、プロシージャの構造により
関数の中で条件分岐をせざるをえないならば、
この処理を行ないます。
    • good
    • 0

引数にNULLが来ると想定してないです。

だからと言って、NULLが来たら処理をスキップする、のは暫定的であり本来の対処ではありません。
この処理後の返す値がNULLになると、これまた後続にも想定してないNULL事象を招き修正箇所が増えるだけです。

おそらくこの部分は本対策としては当初のままで直す必要ありません。

NULLが発生した箇所で発生しないように対処し、この処理をCALLするときにNULLが来ないようにします。これをまず考える。

NULLとなることの真偽を
確認すること。

エラーメッセージ箇所を直さないといけない、ということはありません。エラーメッセージ箇所と違う箇所を直すこともあります。

根っこを突き止めること。
    • good
    • 0

#4です。



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

ではなく、

なお、SortOperator = myTxt の前にもう一つEnd Ifを
入れないとエラーが生じます。追加しておきました。

です。
    • good
    • 0

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を
入れないとエラーが生じます。追加しておきました。
コンパイルをするように。
    • good
    • 0

マークの箇所


の付近を修正する。
先頭から
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文字以下にならないようにする。


直し方より何が起きてエラーになったのかつかむ。
    • good
    • 0

エラーメッセージがわかっているならまずはググってみる。



http://oshiete.goo.ne.jp/qa/1059653.html
    • good
    • 0

エラー行、エラーメッセージがわかっているのに、質問する意図が不明ですが。



MyTxt
引数の時点でNULLだとLEN関数結果がどうなるか
引数の時点で1バイトだとRIGHT関数結果がどうなるか
この2点を確認。

MyTxt
引数を上書きで良いか。
FUNCTIONの帰り値はセットしているか。

MyTxt
がNULLは発生していいのか。

この回答への補足

前任者より引継ぎ初心者のため説明不足で申し訳ありません。
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
以上が構文で何処を同訂正すればいいのかわかりません。
出力が出来るようにしたいのですが
お教えください

補足日時:2011/01/25 14:21
    • good
    • 0

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

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


おすすめ情報