- ベストアンサー
ExcelVBA でリストリストボックスにNULLを挿入
Excel2000のVBAで、フォーム上のリストボックスに、ADO経由でSQLサーバーからデーターを読み込もうとしています。 これを実行すると、NULLの項目をリストボックスにセットしようとしたところで、 ----------------------------------------------- 実行時エラー'-2147352571(80020005)': Listプロパティを設定できません。種類が一致しません。 ----------------------------------------------- と、エラーになります。 「-2147352571」をネット検索しても判明せず、OnErrorステートメントでしのいでいても、釈然としません。 どなたか、このエラーの回避方法、もしくはこのエラーの詳細をご教授頂けませんでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
その部分のソースがどうなっているか分かりかねますが、 ユーザーフォームにリストボックスを1つ貼り付けて以下の記述をしたら再現しました。 Private Sub UserForm_Initialize() ListBox1.AddItem "" ListBox1.List(0) = Null End Sub で、回避策は Private Sub UserForm_Initialize() ListBox1.AddItem "" ListBox1.List(0) = Null & "" '←""と連結して文字列化。 End Sub リストボックスに使えるのは文字列なので、Nullを入れると型が合わずエラーになります。 SQLサーバからのデータが何であれ、 「 & ""」を付けておけばいつもエラーにはならずに済むでしょう。 ただし、Nullの場合は空文字がリストボックスに入る事になりますがそれで良いのでしょうか?
その他の回答 (1)
- imogasi
- ベストアンサー率27% (4737/17069)
下記は十分判って無い者の発言と言うことでお許し下さい。 #1のご回答のように(似た表現) Private Sub UserForm_Initialize() a = Null ListBox1.AddItem a End Sub はご質問のエラーに成りました。 しかし、質問のケースでは (A)ファイルデータからデータを読み、ある項目(フィールド)をAddItemでリストにセットしようとしているのでしょうか。であればその時のファイルから読みこんでメモリへデータを受けたとき、そのフィールドの変数の値はどうなっているのでしょうか。Nullと言う値なのでしょうか。 であればIsNull関数で(IF文などで)聞いて、回避し、リストボックスのアイテムにセットしない方法や別のスペースでもセットすれば良いのではないでしょうか。 データ値の内容がNullと断定した根拠はなんでしょうか。 --- (IsNullのヘルプ抜粋) Null 値は、バリアント型 (Variant) に有効なデータが入っていないことを示す値であり、変数が初期化されていないことを示す Empty 値や、Null 文字列と呼ばれる長さが 0 の文字列 ("") とは異なります。 ---- 参考 Nullについて http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/vb_p07.htm 「特にデータベースのレコード項目などで Null 項目が発生しやすい。この場合の Null 項目を参照しようなどとすると VB では例外エラーが発生する」 その次に「if IsNull(rs("数量")) then・・・」の例が 上がっている。 ---- http://park18.wakwak.com/~greenspace/dev-api/theapi/howtouse.html vbNullChar:一般的なNULL文字(キャラクターコード0)を表す定数。 vbNullString:C/C++での空文字列(長さ0、NULLのみ)を表す定数。 vbNull:変数の型を調べる、VarType関数の戻り値のひとつ。バリアント型に格納されている型が無い場合に、この値が返される。 これは整数型の定数で、値は整数の1になる。 ---- (B)または「フォーム上のリストボックスに、ADO経由でSQLサーバーからデーターを読み込もうとしています。」は 質問の枕言葉で、関係なく、「=Null」を代入しようとしているなら、最終結果として、リストアイテムの状態としては、何がしたいのでしょうか。 ---- Private Sub UserForm_Initialize() For i = 1 To 5 UserForm1.ListBox1.AddItem Cells(i, "A") Next i ' Cells(6, "A") = vbNull UserForm1.ListBox1.AddItem vbNull 'Cells(6, "A") UserForm1.ListBox1.AddItem "" 'UserForm1.ListBox1.RemoveItem 4 End Sub はエラーになりませんでした。 ---- 何かNullの(文法的な)使い方の問題か、データベースソフトのフィールド変数へのセットする値の問題と思うのですが、浅学のため十分結論が言えないで済みません。
お礼
回答ありがとうございます。 データーがnullと判断した根拠は、デバッグモードで変数をマウスオーバーしたときに表示されていたことと、Onerrorステートメントでデーターを表示させたときの内容です。 店舗の情報をリストから選んでシートに挿入と言うことをしたく、ただすべての項目(郵便番号や住所、電話番号)が入力されてはいないので、されていない場合はnullのままで出力したかったのです。 リストボックスでNULLが扱えないことがはっきりさせたかったので、今回の質問をしました。 ありがとうございました
お礼
ご回答ありがとうございます。 ADOでDBから読み込んで(dbCols)次のような記述をしてます。 Me.ListBox1.ColumnCount = 7 '列数 ' 必要項目を選択してセルにセット Set dbCols = dbRes.Fields Me.ListBox1.AddItem dbCols("ofce").Value '.Listで該当列にデータをセット Me.ListBox1.List(setY, 1) = dbCols("padr1").Value Me.ListBox1.List(setY, 2) = dbCols("padr2").Value ・・・ リストボックスにNULLを入れられない点をお明確にしたかったことが今回の目的でした。(スミマセン、基礎的な勉強もせず作ってます) 店舗名称に対して、補助的な情報として住所を表示したい、ただDBには入力されていない場合もあるので、その場合は空白、と言うことですので、アドバイス通りの対処で問題ありません。 ありがとうございました。