- ベストアンサー
初歩的で申し訳ないですが…ADOでExcel検索しています。
質問です。 ADOでExcel内を検索するコードを書いています。 開発環境:Win XP,Excel2003,VB6.0(SP5) A列が検索列で,検索でヒットした行を抽出します。 Filterプロパティを使って検索していますが、数値を入れるとOKなのに文字列を入れると"種類が一致しません"というエラーが発生してしまいます。 どんな些細な点でもよろしいのでご教授、ご指摘を宜しくお願い申し上げます。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
あれこれ実験していたら不可解な事が起きました。 一応報告しますね。 EXCEL Sheet1のA1の列に、 FLD1 ---- 1 2 3 と入力します。 普通にやると、1,2,3は右揃えに表示されますよね。 この状態でRS.Filter="FLD1='2'"とすると問題のエラーが起きます。 書式設定を文字列に変えても。 そうではなくて、 先にA1列の書式設定を文字列に変更。 上の通り入力。 (こうすると左揃えになります。) そして、その後書式を標準に戻します。 するとなぜか左揃えのままになります。 という状態でRS.Filter="FLD1='2'"をしても問題のエラーは起きません。 一体何がなんだか?? データを書く前に書式を文字列にしておく必要がある・・??という事なんですかね。 あと、参考URLのページにあるデータ型というところにEXCELの場合のデータ型の扱いがかかれてます。 書式設定がどうって事は書いてなかったですが、データ型を指定する方法は無いって書いてあります。
その他の回答 (2)
- pen_pen_pen
- ベストアンサー率65% (52/79)
意見が無いよりマシくらいに聞いていただければ・・。 私はDAOでEXCELを読み込む事をよくやるんですが、型が一致しないエラーが出るのはその列に数値と文字列が混在している場合に出ます。 MicrosoftのHPによれば、上から(?)8個のデータを見てデータ型を数値なのか、文字列なのか、または他の何かなのかを判断するとか。 EXCELの書式設定には依存しないというような事は明記されてたような・・されてないような・・。 調べて解答すればいいんですけどね。すみません不確かな回答で。 私は仕方がないので、数値の行の先頭に「'」を付けて無理矢理全て文字列にしました。 質問者さんの場合は全部明らかに文字列なのでしょうか? 「Number」という変数を使っているところを見ると数値っぽい値なのかな?と思うのですが。
補足
回答に感謝します。 検索キーはバーコードの数値です。 Numberという変数にしていたのは数字のJANコードのみを検索していた頃の名残です。修正していないのが心苦しいです。 検索対象列はすべて文字列として入力していますし、「'」で囲めば文字列も扱えると思っていたので質問してみました。 でもExcelの書式設定には依存しないんですね。勉強になりました。 極力検索対象列のセルにバーコード以外のデータはいれたくないのです。なんとかできないものでしょうか?
- osumitan
- ベストアンサー率33% (102/307)
検索対象のセルの形式が数値なのでしょう。 対象セルの書式が数値のものになっているか、 標準になっていて値が数値と取れるものではないですか? 書式を文字列にすれば間違いないと思います。
補足
早速の回答に感謝します。 文字列にしてみましたが 一応コードもご覧ください。 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
お礼
付き合ってくださり感謝します。 その通りでしたね。 また、参考URL先のサンプルのExcelADO.exe内のExcelもそうなっていました。 データ型を指定する方法は無く、最初の何行かでフィールドのデータ型が推測されると書いてありました。 よくわかりました。ありがとうございました。バーコードデータの入力(Excelデータベースの更新)はパソコンのパの字もしらないようなユーザーが対象になっており、なるべくスマート(?)に更新させたかったのですが、このような仕様でしたら、仕方ないでしょうね。
補足
少し探しておりましたら、以下のようなサイトが見つかりました。ご参考にしてください。 この度は本当にありがとうございました。 http://www.f3.dion.ne.jp/~element/msaccess/AcTipsExcelLinkDataType.html