0

vb6 を使用して Excel (2003) スプレッドシートから値のテーブルを抽出しようとしています。その結果は (adodb) レコードセットに保存する必要があります。テーブルは次のようになります。

    名前 Option.1 Option.2 Option.3 Option.4 Option.5 Option.6
    -------------------------------------------------- ---------------
    名前1 2 3 4
    名前2 2 3 4
    名前3 2 3 4
    名前4 2 3 4
    名前5 2 3 4
    名前6 2 3 4
    名前7 2 3 4
    名前8 2 3 4
    名前9 2 3 4 5 6 7  

SELECT * FROM [Sheet1$]クエリ " " または列固有のクエリ " " (脚注 1 を参照)を接続して実行しSELECT [Option#6] FROM [Sheet1$]、結果をループすると、正しい値 5、6、および 7 ではなく、Null行-->の値が与えられます。スプレッドシートへの接続は、有効なテーブル制限を決定する「最良の推測」を使用しているようで、設定された行数のみが考慮されます。 Name9Option.4Option.6

スプレッドシートに接続するために、両方の接続プロバイダーを試しましMicrosoft.Jet.OLEDB.4.0MSDASQLが、同じ問題が発生します。

私が使用する接続設定は次のとおりです。

Set cn = New ADODB.Connection
With cn
    .Provider = "Microsoft.Jet.OLEDB.4.0"
    .ConnectionString = "Data Source=" & filePath & ";Extended Properties=Excel 8.0;"
    - - - - OR - - - - 
    .Provider = "MSDASQL"
    .ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _
                        "DBQ=" & filePath & ";MaxScanRows=0;"
    .CursorLocation = adUseClient
    .Open
End With  
Set rsSelects = New ADODB.Recordset
Set rsSelects = cn.Execute("SELECT [Option#5] FROM " & "[" & strTbl & "]")

この問題は、行数が 8 行 (列名を除く) を超えている場合にのみ発生MaxScanRow=0し、MSDASQL接続を設定しましたが、同じ結果になりました。

私が含めた注目すべきプロジェクトの参考資料は次のとおりです。

  • MS ActiveX データ オブジェクト 2.8 ライブラリ
  • MS ActiveX データ オブジェクト レコードセット 2.8 ライブラリ
  • MS Excel 11.0 オブジェクト ライブラリ
  • MS データ バインディング コレクション VB 6.0 (SP4)

この問題で何か助けていただければ幸いです。

(1) なぜかカラム名に小数点を含めると#と解釈される。


みんな、ありがとう!KB155512 onedaywhenの優れた投稿Schema.iniから「プログラムで」セットアップしようとしている途中で、解決策が示されました。

.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source=" & filePath & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"

同様の問題を抱えている人には、投稿とコメントを読むことをお勧めします。解決策は人によってわずかに異なるためです.

4

3 に答える 3

3

Excel ISAMドライバーは、デフォルトで最初の一握りの行を調べ、それらのデータ型を推測します。最初の仮定に適合しないデータが(後で表に)​​ある場合、それは眉をひそめ、それをNULLに変えます。

あなたのMaxScanRows=0設定がこの問題の鍵です。それは正しいことをするように聞こえますが(使用するデータ型についてテーブル全体をスキャンします)、実際にはそうではありません。

詳細については、ある日の回答を参照してください。KB282263に関する最初の情報は、正しいアドバイスではありませんでした

于 2008-10-23T12:00:54.810 に答える
1

その通りです。行数に基づいてデータ型を推測しています。選択したデータ型に影響を与えるために変更できるローカル マシンのレジストリ キーがあります。詳細については、この回答を参照してください。

于 2008-10-23T13:31:15.187 に答える
0

私があなたにできる最善のアドバイスは、VB6 環境でそれをやめるということです。Excel を開き、ALT+F11 を押して VBA IDE を読み込みます。そこにコードを入れてください。この環境内から、完全な Excel オブジェクト モデルにアクセスできます。

多くの人がさまざまな方法で Excel を操作しようとしているのを見てきましたが、全員が問題を抱えています。VBA マクロまたはアドイン メソッドのいずれかを使用することが、データを取得する最善の方法です。これは、Microsoft が Excel と Project を TFS と統合する方法です。

このアプローチが適切であるためには、プロセスを少し再考する必要がある場合があります。たとえば、スプレッドシートからデータをプルするプロセスを実行する代わりに、スプレッドシートを使用しているユーザーに、スプレッドシートからデータをプッシュするマクロを実行させる必要がある場合がありますが、通常は非常に実行可能です。

于 2008-10-23T13:05:28.673 に答える