• ベストアンサー

初歩的で申し訳ないですが…ADOでExcel検索しています。

質問です。 ADOでExcel内を検索するコードを書いています。 開発環境:Win XP,Excel2003,VB6.0(SP5) A列が検索列で,検索でヒットした行を抽出します。 Filterプロパティを使って検索していますが、数値を入れるとOKなのに文字列を入れると"種類が一致しません"というエラーが発生してしまいます。 どんな些細な点でもよろしいのでご教授、ご指摘を宜しくお願い申し上げます。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

あれこれ実験していたら不可解な事が起きました。 一応報告しますね。 EXCEL Sheet1のA1の列に、 FLD1 ---- 1 2 3 と入力します。 普通にやると、1,2,3は右揃えに表示されますよね。 この状態でRS.Filter="FLD1='2'"とすると問題のエラーが起きます。 書式設定を文字列に変えても。 そうではなくて、 先にA1列の書式設定を文字列に変更。 上の通り入力。 (こうすると左揃えになります。) そして、その後書式を標準に戻します。 するとなぜか左揃えのままになります。 という状態でRS.Filter="FLD1='2'"をしても問題のエラーは起きません。 一体何がなんだか?? データを書く前に書式を文字列にしておく必要がある・・??という事なんですかね。 あと、参考URLのページにあるデータ型というところにEXCELの場合のデータ型の扱いがかかれてます。 書式設定がどうって事は書いてなかったですが、データ型を指定する方法は無いって書いてあります。

参考URL:
http://support.microsoft.com/default.aspx?scid=kb;ja;278973
leftovers
質問者

お礼

付き合ってくださり感謝します。 その通りでしたね。 また、参考URL先のサンプルのExcelADO.exe内のExcelもそうなっていました。 データ型を指定する方法は無く、最初の何行かでフィールドのデータ型が推測されると書いてありました。 よくわかりました。ありがとうございました。バーコードデータの入力(Excelデータベースの更新)はパソコンのパの字もしらないようなユーザーが対象になっており、なるべくスマート(?)に更新させたかったのですが、このような仕様でしたら、仕方ないでしょうね。

leftovers
質問者

補足

少し探しておりましたら、以下のようなサイトが見つかりました。ご参考にしてください。 この度は本当にありがとうございました。 http://www.f3.dion.ne.jp/~element/msaccess/AcTipsExcelLinkDataType.html

その他の回答 (2)

回答No.2

意見が無いよりマシくらいに聞いていただければ・・。 私はDAOでEXCELを読み込む事をよくやるんですが、型が一致しないエラーが出るのはその列に数値と文字列が混在している場合に出ます。 MicrosoftのHPによれば、上から(?)8個のデータを見てデータ型を数値なのか、文字列なのか、または他の何かなのかを判断するとか。 EXCELの書式設定には依存しないというような事は明記されてたような・・されてないような・・。 調べて解答すればいいんですけどね。すみません不確かな回答で。 私は仕方がないので、数値の行の先頭に「'」を付けて無理矢理全て文字列にしました。 質問者さんの場合は全部明らかに文字列なのでしょうか? 「Number」という変数を使っているところを見ると数値っぽい値なのかな?と思うのですが。

leftovers
質問者

補足

回答に感謝します。 検索キーはバーコードの数値です。 Numberという変数にしていたのは数字のJANコードのみを検索していた頃の名残です。修正していないのが心苦しいです。 検索対象列はすべて文字列として入力していますし、「'」で囲めば文字列も扱えると思っていたので質問してみました。 でもExcelの書式設定には依存しないんですね。勉強になりました。 極力検索対象列のセルにバーコード以外のデータはいれたくないのです。なんとかできないものでしょうか?

  • osumitan
  • ベストアンサー率33% (102/307)
回答No.1

検索対象のセルの形式が数値なのでしょう。 対象セルの書式が数値のものになっているか、 標準になっていて値が数値と取れるものではないですか? 書式を文字列にすれば間違いないと思います。

leftovers
質問者

補足

早速の回答に感謝します。 文字列にしてみましたが 一応コードもご覧ください。 Private Function ExcelSearch(Searchkey as String) as Boolean Dim Cn As ADODB.Connection Dim Rst as ADODB.Recordset Dim HitBookMark() as Variant On Error Resume Next 'Excelへの接続 Set Cn= New ADODB.Connection With Cn .Provider = "Microsoft.Jet.OLEDB.4.0" .Properties("Extended Properties") = "Excel 8.0;IMEX=1" 'ブック名 .Properties("Data Source") = "ここにExcelファイル名" 'ブックオープン .Open End With 'レコードセットの定義 Set Rst = New ADODB.Recordset With Rst 'シート名 .Source = "Sheet1" & "$" '静的カーソルを設定 .CursorType = adOpenStatic 'レコードセットオープン(Read Only) .Open , ExcelInfo.xlApp, , adLockReadOnly, adCmdTableDirect End With If Err <> 0 Then 'オープン失敗 MsgBox "Excelオープン失敗" Err.Clear Set Rst = Nothing Set Cn = Nothing ExcelSearch = False Exit Function End If Redim HitBookMark(1) With Rst '検索 .Filter = Rst(0).Name & "=" & "'" & Number & "'" Do While Not .EOF k = k + 1 Redim Preserve HitBookMark(k) HitBookMark(k - 1) = .BookMark '次の検索 .MoveNext Loop End With If HitBookMark(0) = "" Then '検索キーなし ExcelSearch = False Else '検索キーあり ExcelSearch = True End If Set Rst = Nothing Set Cn = Nothing End Function

関連するQ&A