tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルEXCEL シートをレコードセットで取りこめない
記事No16579
投稿日: 2020/07/09(Thu) 20:33
投稿者悩めるEXCELマクロ士
いつもお世話になっています。
早速ですが、質問です。
以前にも投稿させていただきましたが
私は、現在EXCELVBAでアプリを作成しています。
そのとき、EXCELシートをレコードセットで
取り込む方法をご教授いただき順調に開発が
進んでいたんですが、最近になって新たな機能追加が
発生して、シートからデータを取得する必要が出たため
すでに開発済みで動作確認済みのシートデータを
レコードセットで取得する関数を使って取り込もうと
思ったのです。
いざ、取り込もうと思って実行したところ
『抽出条件でデータ型が一致しませんでした』と
エラーが出てレコードセットを取得することが
出来ませんでした。
それまで、開発してあるプロシージャからだったら
今も問題なく、シートからレコードセット経由で
データを取得できるんですが、新しく開発したほうからは
どうしてもだめでした。
ただ、わからないのはSQL文に関しては取得できる
ものと全く同じものが生成されるのでそれで取得できないのは
なぜ?という疑問に陥ってしまっています。
その後、いろいろと試行錯誤して原因はどうやらWHERE句に
あるようで、
取得できる法のSQLでは、
[SELECT * FROM (シート名&取得エリア) WHERE CD = '検索対象CD']と
なっているのを
[SELECT * FROM (シート名&取得エリア) WHERE CD = 検索対象CD]と
修正すると取得できます。
なぜそうなるのかと、対応方法をご教授いただけると幸いです。
現在は、フラグを使ってダメなほうからCallした時には
シングルコーテーションを付けないWHERE句を作成する法に誘導していますが
これだと、シートにデータが追加になった時などに対応できない
可能性があるので、どちらからでも同じWHERE句で取得できるように
したいです。
乱文、長文になってしまって申し訳ありませんが
よろしくお願いします。

[ツリー表示へ]
タイトルRe: EXCEL シートをレコードセットで取りこめない
記事No16580
投稿日: 2020/07/10(Fri) 12:00
投稿者魔界の仮面弁士
> そのとき、EXCELシートをレコードセットで

DAO/ACEDAO の Recordset / Recordset2 でしょうか。
それとも ADODB の Recordset でしょうか。
後者の場合、Provider は何でしょうか。


更新不要なら、IMEX=1 モードにしてみるとか…?

hhttps://www.it-swarm.dev/ja/c%23/oledb%E6%8E%A5%E7%B6%9A%E6%96%87%E5%AD%97%E5%88%97%E5%86%85%E3%81%AEimex%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F/1067377833/

[ツリー表示へ]
タイトルRe^2: EXCEL シートをレコードセットで取りこめない
記事No16581
投稿日: 2020/07/10(Fri) 20:12
投稿者悩めるEXCELマクロ士
魔界の仮面弁士 さま

返信ありがとうございます。
そしていつもお世話になっていまs。
いつもながら、こちらの環境を書かずに
投稿してしまって申し訳ありません。
一応、今現在組んであるプログラムを
書くと、
まず、シートのコネクト部分から

Public Function Sheet_Conect(DataSource As String) As Object

 Dim objCN  As Object
 Dim strCN  As String

 Set objCN = CreateObject("ADODB.Connetion")

  strCN = "Provider=Microsoft.ACE.OLEDB.12.0;"
  strCN = strCN & "Data Source=" & DataSource & ";"
  strCN = strCN & "Extended Properties=""Excel 12.0;"
  strCN = strCN & "HDR=Yes;IMEX=1"";"

objCN.Open strCn
Set Sheet_Conect = objCN

End Function

と作成してあって、必要に応じて呼び出しています。
次にデータ取得部分ですが

Public Function GetData(tmpCD As String) As String

  Dim RecSet   As Object
  Dim Sh_CN    As Object
  Dim strSQL   As String

  Set Sh_CN = Sheet_Conect(ThisWorkbook.FullName)

  strSQL = "SELECT * FROM [" & (シート名&取得エリア) & "] "
  strSQL = strSQL & "WHERE CD = '" & tmpCD & "'"

  Set RecSet = CreateObject("ADODB.Recordset")
  RecSet.Open strSQL,Sh_CN,adOpenStatic,adLockReadOnly
  GetData=RecSet(0)

End Function

と組んであり、これであるプロシージャからの呼び出しでは
正常に目的のデータが取得でき、新しく追加した機能からの
呼び出しでは、
『抽出条件でデータ型が一致しません』となってしまいます。
一応、本日会社にていろいろと試したところやはり
WHERE句のシングルコーテーションを抜くと取得の可否が逆転します。
ということを踏まえると、おそらく検索対象である[CD]列が
ある時には文字列で、ある時には数値で認識されてしまっているのでは
ないかと思っています。
なので、取得対象であるシートのデータ部分の1行目に空データを
挿入して[CD]のセルに文字(X)を入れてみて実行してみたところ
両方のプロシージャから読んでもデータが取得できるように
なりました。
ただ、これが正しい方法なのかなぜそうなるのか、
他にもっと良い方法があるのかわかりません。
よろしくご教授いただけると幸いです。

[ツリー表示へ]