- - PR -
ExcelをSQL文で参照時に取得できない項目について
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-12-15 17:32
いつもお世話になっております。
今回、VBからSQL文を発行してエクセルを参照しようと思っています。 おおむね思ったとおりの結果が返ってきたのですが、 特定の列に『 <0.1』という値が入っている場所のみ nullと判断してしまい思い通りにいきません。 下記にソースを載せますのでどなたか気づいた方、 ご教授御願いします。 -----バージョン------ Microsoft VisualBasic6.0 Microsoft Excel 2002 ------ソース--------------------------------- '変数定義 Dim rsdao As ADODB.Recordset 'レコードセットを定義 Set rsdao = New ADODB.Recordset Dim cn As ADODB.Connection 'コネクションを定義 Set cn = New ADODB.Connection 'SQLに接続 cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=" & strDir & ";Extended properties=Excel 8.0;" cn.Open 'エクセルを参照する Set rsdao = cn.Execute("SELECT * FROM [" & strSheet & "$" & "]") Do Until rsdao.EOF <ここで取得すると特定の項目のみnullがでます> rsdao.MoveNext Loop -------------------------------------------------------------------------- strDir :エクセル名がはいってます。 strSheet :シート名がはいってます。 | ||||
|
投稿日時: 2006-12-15 18:31
そのデータが 1 行目にあった場合はどうでしょうか? _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2006-12-15 18:44
返信ありがとうございます。
引用---------------------------------- そのデータが 1 行目にあった場合はどうでしょうか? -------------------------------------- その1行がnullとして扱われます。 2行目に普通の値が入っている場合は、正常に値を取得できます。 やはり『 <0.1』の空白又は、<の値が原因でしょうか。 宜しく御願いします。 | ||||
|
投稿日時: 2006-12-15 20:43
ExcelをADOでJetエンジンで読むと、
最初の数行(デフォルトでは確か8行)で、各列ごとに値の型をエンジン側が勝手に 決めてしまいます。 その辺りの話はこちらを参照↓ http://support.microsoft.com/default.aspx?scid=kb;JA;257819 恐らく、同じ列の他のレコード、 それもより先頭部のほうのレコードに、 10とか15だとか、数字と判定されがちな値が多く入っているのでは ないでしょうか。 で、その列は数字型と判断され、 <0.1は数字解釈できないので、NULLとなる。 なお、その問題のCellにExcel側の書式を文字列としておいても、 この現象は回避できません。 昔、同じ現象で苦しみました。 結論としては、面倒ですがSQLのFROM句をシートではなく、 >現状のFROMの指定状況 SELECT * FROM [" & strSheet & "$" & "]" 1セルづつ指定して、丁寧に読み取ることでは回避できました。 他により効率のよい方法があるかもしれませんが、 確実さでは1セルづつがオススメです。 [ メッセージ編集済み 編集者: platini 編集日時 2006-12-18 12:17 ] | ||||
|
投稿日時: 2006-12-20 17:12
返信が遅くなりまして申し訳ありません。
platiniさんのやり方(範囲指定)では、自分の所では無理でした。 しかし、参照ページを拝見して原因がわかりましたので記述します。 SELECT文で検索すると、その列に文字と数字のどちらが多いかを判断し 多いほうにするそうです。 自分の場合、数字が圧倒的に多いのでその行を数字の行とみなしてそのほか(文字列)を NULLと認識しました。 解決策として cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & strDir _ & ";Extended Properties=""Excel 8.0;IMEX=1""" 上記のようにIMEX=1を追加してすべての行を文字列としてみなすようにしました。 以上です。 皆様、どうもありがとうございました。 |
1