[Excel][VBA][ODBC] Connexion SQL Server

Connexion SQL Server [Excel][VBA][ODBC] - VB/VBA/VBS - Programmation

Marsh Posté le 14-02-2006 à 12:00:08    

Bonjour,
 
On m'a donné la difficile tâche d'effectuer quelques fonctions en VBA afin de pouvoir exporter le contenu d'une Feuille Excel dans une table sur une base de donnée  :ouch:  (SQL Server 2000 en l'occurence).
 
Est-ce que quelqu'un saurait comment procéder avec Excel pour ouvrir une connexion sur un SGBD ? Par ODBC ou n'importe quel autre moyen ... ça fera l'affaire ?
 
Comme je n'ai jamais codé 1 ligne en VB% :( , je suis un peu perdu ... et la doc est pas façile à trouver .... pendant que j'y suis si vous pouvez mon recommander un bon livre ou un site internet intéressant, je suis preneur.
 
Merci d'avance

Reply

Marsh Posté le 14-02-2006 à 12:00:08   

Reply

Marsh Posté le 14-02-2006 à 14:49:44    

On peut pas dire qu'il soit idéal de commencer la prog VB% (comme tu écris) par de l'accès ODBC (ou natif) en écriture sur un SGBD.
Déjà familiarise toi avec la lecture d'infos via ODBC et les requetes de données externes Excel (menu Données) et la création d'une source ODBC.  
Pour SQL Server ça doit être assez simple. Un fil de discussion ouvert par watashi parle déjà d'un accès AS400 via ODBC un peu plus bas.
Après il faudra trouver les objets qui permettent une mise à jour, mais il est possible qu'il suffise de changer quelquepart une requete SELECT en UPDATE ou INSERT.

Reply

Marsh Posté le 14-02-2006 à 15:43:37    

Hello tegu ! merci pour ta réponse !
 
Je précise que je suis pas totalement "noob" ... c'est que j'ai l'habitude de développer en java/J2EE ! Donc tu comprends ma "chute" en scriptant en VBA... en plus je n'ai jamais utilisé d'activX au autre technologies Microsoft, donc je n'ai pas les bons reflexes ...  
 
Par exemple je viens de passer 20 minutes à capter qu'il ne fallait pas mettre de parenthèses autour de mes appels de fonctions sinon ça fesait des erreurs de syntaxe  :ouch:  
 
C'est surtout que je n'ai pas le choix car je suis obligé de passer par un fichier excel pour obtenir des données (notre client utilise une api propriétaire dans une appli excel afin d'obtenir des données) et je dois ensuite réinjecter des données dans une base de données ...
 
Donc pour la connexion j'ai pu m'en sortir péniblement avec un objet ADODB.Connection (http://drq.developpez.com/vb/tutoriels/ADO/), mais pour le reste je nage toujours. Par exemple comment utiliser passer un Range à une fonction pour qu'elle boucle dessus chaque ligne afin de générer des inserts etc ...
 
Alors vlà, si quelqu'un connait des ressources, livres etc ... merci

Reply

Marsh Posté le 14-02-2006 à 16:38:15    

Les tuto c'est pas ce qui manque, il y en a limite trop.
 
Pour travailler avec les Range il faut passer par les tableaux mémoire pour être efficace.
Voir une réponse que j'avais donnée.
http://forum.hardware.fr/hardwaref [...] 3767-1.htm


Message édité par tegu le 14-02-2006 à 16:38:41
Reply

Marsh Posté le 15-02-2006 à 09:42:20    

Merci bcp ! Je vais essayer la méthode avec la mémoire voir si j'obtiens de meilleures performances ...
 
Pour l'instant c'est assez désastreux ... il me faut +/- 5 minutes pour insérer 50'000 lignes dans la base de données  :ouch:  
 
En gros j'ai un feuille avec environ 300 lignes et 300 colonnes. Pour chaque cellule je dois générer une instruction INSERT. Mais dans certains cas (si la cellule et incorrecte etc ...) je dois me balader dans d'autres feuilles du document afin de générer un message d'erreur.  
 
Donc pour les tuto je suis d'accord. Y'a de tout et n'import quoi :D suffisait de chercher. Mais je préfère toujours investir dans un "bon" livre et passer 1 jours dessus plutôt que d'y aller à tâtons jusqu'a ce que sa marche, sans comprendre pourquoi :jap:
 

Reply

Marsh Posté le 15-02-2006 à 09:50:13    

D'ailleurs il existe une autre astuce pour améliorer les perfs des tableaux volumineux : toujours mettre en dimension 1 le moins d'indices possibles.
C'est à dire plutot Dim tab(12, 50000) que Dim tab(50000,12)
Evidemment quand tu as presque autant d'indices dans tes dimensions cela n'est pas possible.
Cette astuce ne fonctionne pas non plus quand tu gères un tableau pour une feuille Excel car tu es tributaire de l'arrangement Ligne, Colonne de Excel


Message édité par tegu le 15-02-2006 à 09:51:21
Reply

Marsh Posté le 27-02-2006 à 10:49:17    

Salut, je sais je suis un peu en retard, mais on sait jamais ca peut peut etre t'aider !!
Je te conseille l'utilisation de l'outils bcp offert avec sql server. ca te permet de copier en bloc depuis un fichier vers une base de donnée. Je m'en sers de temps en temps et c'est super rapide (environ 10 000 lignes en 5 sec)

Reply

Marsh Posté le 28-02-2006 à 22:15:54    

mymy83 a écrit :

Salut, je sais je suis un peu en retard, mais on sait jamais ca peut peut etre t'aider !!
Je te conseille l'utilisation de l'outils bcp offert avec sql server. ca te permet de copier en bloc depuis un fichier vers une base de donnée. Je m'en sers de temps en temps et c'est super rapide (environ 10 000 lignes en 5 sec)


 
Merci, je connaissais pas ! Je vais essayer

Reply

Marsh Posté le 07-03-2006 à 13:37:57    

Bon, finalement je peux pas utiliser bcp car le seul moyen que j'ai s'est d'appeler une macro du fichier via jacob.  
 
Par contre j'ai trouvé un moyen de transféréer les données de manière beaucoup plus rapide, en ouvrant une connexion sur le fichier Excel lui-même et en utiliser une syntaxe de type SELECT * INTO qui crée une nouvelle table avec le résultat du Select sur le SGBD  

Code :
  1. SELECT * INTO [ODBC;Driver={SQL Server};Server=AddIpServer;Database=MaDb;Uid=UserName;Pwd=Password].[MaNouvelleTable] FROM [MonFichierExel]


 
Ca marche nickel si le Run la macro à la main, par contre pour une raison inconnue, si c'est jacob qui effectue l'appel, l'instruction SQL échou avec un message à la con de type "Erreur inatendue", comme si ADODB n'était pas d'accord de partager l'accès au fichier Excel avec jacob....
 
Je suis pas encore sorti :(

Reply

Marsh Posté le 07-03-2006 à 17:02:39    

Excel n'est PAS une base de données, donc n'accepte pas les accès concurrents

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed