質問

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

    Name   Option.1  Option.2  Option.3  Option.4  Option.5  Option.6 
    -----------------------------------------------------------------
    Name1         2         3         4
    Name2         2         3         4
    Name3         2         3         4
    Name4         2         3         4
    Name5         2         3         4
    Name6         2         3         4
    Name7         2         3         4
    Name8         2         3         4
    Name9         2         3         4         5         6         7  

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

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

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

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) 列名に小数点が含まれる場合、何らかの理由で#として解釈されてしまいます。


みんな、ありがとう!セットアップ途中 Schema.ini 「プログラム的に」から KB155512 いつかいつ素晴らしい 役職 解決策を私に示してくれました。

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

解決策には人によって若干の違いがあるため、同様の問題を抱えている人には投稿とコメントを読むことをお勧めします。

役に立ちましたか?

解決

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

他のヒント

Excel ISAM ドライバーは、デフォルトで最初の数行を調べ、そのデータ型を推測します。最初の仮定に当てはまらないデータが (テーブルの後半に) 存在する場合、眉をひそめ、それを NULL に変換します。

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

見る いつかいつ詳細については の回答、私の最初の情報 KB282263 正しいアドバイスではありませんでした。

VB6環境での実行を停止することをお勧めします。 Excelを開き、Alt + F11を押してVBA IDEを読み込みます。コードをそこに入れます。この環境内から、完全なExcelオブジェクトモデルにアクセスできます。

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top