- ベストアンサー
列の存在を確認する
お世話になります Excel2000VBAで For i = 0 to 5 If 列が存在するか(ArrayTmp.Item(i)) Then Msgbox i & "列目は存在します" Else Msgbox i & "列目は存在しません" End If Next i 以上のように該当する列が存在するかの確認をすることは可能でしょうか? Arraytmpの列数は不定なのでチェックを行いたいのですが
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
配列の列数を確認したいということでしょうか? もしそうならば UBound 関数で上限の要素番号を調べられます。
その他の回答 (3)
- sugao_chib
- ベストアンサー率59% (22/37)
sugao_chibiです。お役に立てず申し訳ないです。 >構文はこれでOkだとは思うのですが、ArrayTmpがoracleから返って >きたカーソル型(VBA側ではObject型で宣言してます)なので 配列の操作上はObject型でも問題ないと思いますけどね。 他の方が答えてくれるかもしれませんので、実際に発生するエラーの内容を記述してみてはどうでしょうか(配列の領域外をアクセス?)。
お礼
sugao_chibi様 とりあえずこの前の段階で回避策が見つかりましたのでそちらで運用してみます。ありがとうございました
補足
sugao_chibi様 とんでもこざいません、私の考えが間違ってないのが確認できましたので。 言葉がかなり足りなかったかもしれませんが、「OO4Oを使ったバインド配列の大きさの取得」というのが目的になると思います。 TmporaDb.Parameters.Add "PARA1", 0, 2 ''OUT,CURSOR strSQL = "BEGIN TESTPackage1.TEST1(:PARA1); END;" TmporaDb.DbExecuteSQL (strSQL) Set ArrayTmp = TmporaDb.Parameters("PARA1").Value GridStatus.Rows = TmporaDb.Parameters("PARA1").Value \ 8 ''<<ここ これで列数を取得できるようなのですが、この「GridStatus」という変数が一体何型で宣言すればいいのか書いてなくて・・・ 私の考えでArrayTmpにセットされているのでArrayTmpにVB構文で呼び出せると思ったのですが
- sugao_chib
- ベストアンサー率59% (22/37)
>確かに列数が分かれば直接的ではないですが問題ないです >ただこの場合どのようにUboundを記述すればよろしいのでしょうか? for i=0 to UBound(ArrayTmp.Item)-1 Msgbox i & "列目は存在します" next i 配列が動的に確保される場合で、例えば2個しか確保されていないのに for i=0 to 5 とやると例外が発生してしまいます。 最初にご自分で書かれた確認の方法は誤りですね(実行時に例外が発生します)。
補足
sugao_chib様ご回答ありがとうございます ご指摘のとおりあの形ではエラーが出てしまいます ただIsMissingのような物がないかな?と思いそう記述しました さてsugao_chib様が記述されたUboundですがやはりこの記述ではエラーが出てしまいます。 構文はこれでOkだとは思うのですが、ArrayTmpがoracleから返ってきたカーソル型(VBA側ではObject型で宣言してます)なので 普通のやり方では無理なのかな、と考えています
- imogasi
- ベストアンサー率27% (4737/17069)
列番号例えばCはC列を削除しても、もとの右隣列がC列として現れるのではないでしょうか。 何のことを質問しているか判らない。私が愚かなのかな。 (1)その列が非表示の列か (2)列の見出し(例えば第1行)で、例えば「住所」という文字列、がある列か などなら判りますが。
補足
具体的になりますが、VBからOracleのストアドをコールして その戻り値にカーソル型があるのですが、その内容が場合によって 列が増えたり減ったりするというこです。 実際にはArrayTmp.Item(9)のこともあればArrayTmp.Item(2)までしかないこともあるので(上限は決まっていますが) 上限までループをまわしてその要素(列)があるかどうかチェックしたいのです
補足
確かに列数が分かれば直接的ではないですが問題ないです ただこの場合どのようにUboundを記述すればよろしいのでしょうか? 思い当たる限り書いたのですがどれも通りませんでした