2008-10-23 13 views
0

J'essaie d'extraire une table de valeurs d'une feuille de calcul Excel (2003) en utilisant vb6, dont le résultat doit être stocké dans un jeu d'enregistrements (adodb). Le tableau ressemble à ceci:Colonnes ignorées utilisant vb6 pour extraire d'Excel

 
    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 

Lors de la connexion et l'exécution de la requête « SELECT * FROM [Sheet1$] » ou même une colonne spécifique, « SELECT [Option#6] FROM [Sheet1$] » (voir référence 1) et une boucle à travers les résultats, je me donne Null valeurs pour la plutôt que les valeurs correctes 5, 6 et 7. Il semble que la connexion à la feuille de calcul utilise une «meilleure estimation» pour déterminer les limites de table valides, et ne prend qu'un nombre défini de lignes en compte.

Pour me connecter à la feuille de calcul, j'ai essayé les deux fournisseurs de connexion Microsoft.Jet.OLEDB.4.0 et MSDASQL et j'ai rencontré le même problème.

Voici les paramètres de connexion que j'utilise:

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 & "]") 

Ce problème se produit uniquement quand il y a plus de 8 lignes (à l'exclusion des noms de colonnes), et j'ai mis MaxScanRow=0 pour la connexion MSDASQL, mais cela a produit les mêmes résultats.

références de projets notables j'ai inclus sont:

  • MS ActiveX Data Objects 2.8 Library
  • MS ActiveX Data Objects Recordset 2.8 Bibliothèque
  • MS Excel 11.0 Object Library
  • MS Data Binding Collection VB 6.0 (SP4)

Toute aide à ce sujet serait très appréciée!

(1) Pour une raison quelconque, lorsque vous incluez un point décimal dans le nom de la colonne, il est interprété comme un #.


Merci à tous! A mi-chemin en essayant de mettre en place un Schema.ini « programme » de KB155512onedaywhen est un excellent post m'a orienté vers la solution:

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

J'encourage toute personne ayant des problèmes similaires à lire le post et les commentaires, car il y a de légères variations à une solution d'une personne à l'autre.

Répondre

1

Vous avez raison: il devine le type de données en fonction d'un nombre de lignes. Il existe des clés de registre de la machine locale que vous pouvez modifier pour influencer le type de données choisi. Pour plus de détails, voir this answer.

+0

Au moins, j'étais dans le stade. +1 – Tomalak

3

Le pilote Excel ISAM examine par défaut la première poignée de vos lignes et détermine leur type de données. S'il devait y avoir (plus tard dans le tableau) des données qui ne rentrent pas dans l'hypothèse initiale, il fronce les sourcils et le transforme en NULL. Le paramètre MaxScanRows=0 est la clé de ce problème. On dirait qu'il ferait la bonne chose (balayer toute la table pour le type de données à utiliser), mais ce n'est pas le cas.

Voir la réponse onedaywhen pour plus de détails, ma première information sur KB282263 n'était pas le bon conseil.

+0

L'article de la base de connaissances auquel vous avez lié est destiné aux fichiers texte et non à Excel. Un fichier schema.ini ne peut pas être utilisé avec Excel (ce qui est dommage). – onedaywhen

0

Le meilleur conseil que je peux vous donner est d'arrêter de le faire dans l'environnement VB6. Ouvrez Excel, appuyez sur ALT + F11 et chargez l'IDE VBA. Mettez votre code là-dedans. Depuis cet environnement, vous pouvez accéder au modèle d'objet Excel complet.

J'ai vu beaucoup de gens essayer et interagir avec Excel de différentes façons et ils ont tous des problèmes. L'utilisation de la macro VBA ou de la méthode Add-in est la meilleure façon d'obtenir les données. C'est ainsi que Microsoft intègre Excel et Project à TFS. Il est parfois nécessaire de repenser un peu le processus pour que cette approche soit appropriée. Par exemple. Vous devrez peut-être demander à l'utilisateur qui utilise la feuille de calcul d'exécuter une macro qui repoussera les données hors de la feuille de calcul au lieu d'exécuter un processus pour extraire les données de la feuille de calcul, mais cela est généralement possible.

+0

Cette solution suppose un utilisateur actif et une certaine mesure de contrôle sur l'environnement de l'utilisateur. Cela peut ne pas être le cas, en particulier si Excel est simplement utilisé en tant que mécanisme de saisie de données (par exemple, collecte de 50 feuilles de calcul à partir de divers personnels d'entrée). Il est vrai que l'on pourrait inclure le VBA avec le classeur/feuille de calcul/modèle, mais cela devient plus compliqué si les données se retrouvent dans une variété de bases de données (par exemple, des bases de données répliquées dans le monde entier). En outre, cette solution suppose l'homogénéité des versions Excel. –