- PR -

ExcelをSQL文で参照時に取得できない項目について

1
投稿者投稿内容
わく
ベテラン
会議室デビュー日: 2004/07/13
投稿数: 60
お住まい・勤務地: 九州
投稿日時: 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 :シート名がはいってます。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-12-15 18:31
引用:

わくさんの書き込み (2006-12-15 17:32) より:

おおむね思ったとおりの結果が返ってきたのですが、特定の列に『 <0.1』という値が入っている場所のみnullと判断してしまい思い通りにいきません。


そのデータが 1 行目にあった場合はどうでしょうか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
わく
ベテラン
会議室デビュー日: 2004/07/13
投稿数: 60
お住まい・勤務地: 九州
投稿日時: 2006-12-15 18:44
返信ありがとうございます。

引用----------------------------------
そのデータが 1 行目にあった場合はどうでしょうか?
--------------------------------------

その1行がnullとして扱われます。
2行目に普通の値が入っている場合は、正常に値を取得できます。

やはり『 <0.1』の空白又は、<の値が原因でしょうか。

宜しく御願いします。
platini
大ベテラン
会議室デビュー日: 2002/12/03
投稿数: 193
投稿日時: 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 ]
わく
ベテラン
会議室デビュー日: 2004/07/13
投稿数: 60
お住まい・勤務地: 九州
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)