DAOレコードセットを使用して引き出しているデータベースにオプションのフィールドがあります。他のフィールドと連結する前に、フィールドが設定されているかどうかを確認する必要があります。これまでのところ、Is
と=
の両方(明らかに間違った構文[[Is | =]]
)で試した次のコードスニペットは役に立ちません。 =
を使用すると、Null
と正しく比較されないようです。また、Is
を使用すると、オブジェクトと比較していないと文句を言います。
While Not rs.EOF
If rs.Fields("MiddleInitial") [[Is | =]] Null Then thisMiddleInitial = "" Else thisMiddleInitial = rs.Fields("MiddleInitial")
If prettyName(myLastName, myFirstName, myMiddleInitial) = prettyName(rs.Fields("LastName"), rs.Fields("FirstName"), thisMiddleInitial) Then
MsgBox "Yay!"
End If
rs.MoveNext
Wend
これを行うためのより簡単な方法があれば、私はそれを完全に受け入れます。 prettyNameはパラメータとして3つの文字列を取り、最初はrs.Fields( "MiddleName")を直接渡そうとしていましたが、Null値でスローされました。私はそのようなもっと直接的なことをしたいのですが、これは私が思いつくことができる最高のものです。
どうですか:
IsNull(rs.Fields("MiddleInitial").Value)
また、 この記事 を参照することもできます。これには、AccessVBAアプリのNull値とその処理方法に関する説明があります。
あなたが示す例では、Nzは機能します:
thisMiddleInitial = Nz(rs!MiddleInitial,"")
または、単に文字列を空の文字列と連結します。
thisMiddleInitial = rs!MiddleInitial & ""
あなたの質問はRemouによって回答されたようですが、私には、名前フィールドを適切に連結しようとしているだけかもしれないと思います。その場合、VBAでMid()とNullの伝播を使用して結果を取得できます。
個別のミドルネームの初期フィールドを使用しないため、通常の名前の連結式は次のとおりです。
Mid(("12" + LastName) & (", " + FirstName), 3)
LastNameがNullでない場合、先頭の「12」文字列は破棄され、+is nullの場合は無視されます。これは、+連結演算子がNullを伝播するためです。
これを拡張してミドルイニシャルを含めると、次のようになります。
Mid(("12" + LastName) & (", " + FirstName) & (" " + MiddleInitial), 3)
あなたのUDFがニックネーム/略語などのある種の複雑なクリーンアップを行っていないと仮定すると、これはそれを完全に置き換えることができると私には思えます。
NullとEmptyの両方の文字列値を説明するために、以下を使用することをお勧めします。ユーザーから値を収集するフォームがあることを使用することをお勧めします。
If Trim(rs.Fields("MiddleInitial") & "") = "" then
NoMatchオプションは、この状況で機能する可能性があると思います。
Rs.NoMatch = Trueの場合
If rst.Fields("MiddleInitial").Value = "Null" Then
これは私にとってはうまくいきます。私はMSSQLデータベースを使用しています。