Autres Problème avec CreateObject("ADODB.Connection")

Roland_M

XLDnaute Barbatruc
Bien le bonjour à tous,

en vérité ça fonctionne bien avec Excel 2007 et Excel 2016, mais pas sur mon pc fixe, explications:

c'est à ce niveau (qui est correcte, le problème n'est pas là)
Cnx.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & RepSource$ & Fich$ & ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1'"

sur mon vieux pc portable avec Excel 2007 ma routine fonctionne bien !
sur mon pc fixe, plus récent, ça fonctionne aussi mais avec Excel 2016 ET PAS avec Excel 2007 !?!
pourtant il fut un temps ça fonctionné !?

du coup j'ai essayé avec ceci qui fonctionne, mais avec des manques !?
Cnx.Open "Provider=MSDASQL.1;DSN=Excel Files;DBQ=" & RepSource$ & Fich$ & ";HDR=Yes;IMEX=1"

donc je ne peux pas travailler avec ceci car il y des manques !?
tout se charge correctement excepté quand dans les cellules
il a des valeurs du genre: "5878/00" ou "10-11-"

soit deux questions:
1' pourquoi qu'avec excel 2007 ça fonctionne pas/plus sur mon pc fixe, alors qu'avec 2016 ça fonctionne ?
2' pourquoi qu'avec la 2' méthode j'ai ces manques ?

un grand merci à tous ceux qui pourraient m'aider !
 
Dernière édition:

Roland_M

XLDnaute Barbatruc
re

bonjour STAPLE1600

@dysorthographie: Quel librairie manquante ?
Ce n'est pas une librairie manquante !
mais des types de données charger avec cette méthode:
Cnx.Open "Provider=MSDASQL.1;DSN=Excel Files;DBQ=" & RepSource$ & Fich$ & ";HDR=Yes;IMEX=1"

ET mon problème c'est avec Excel 2007 après avoir installé Excel 2016
ceci ne fonctionne plus avec 2007 ! (sauf avec 2016)
Cnx.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & RepSource$ & Fich$ & ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1'"

Allez c'est bon je laisse tomber apparemment j'ai beaucoup de mal à me faire comprendre !

merci encore à Patrick !
 

Roland_M

XLDnaute Barbatruc
re, Patrick

je voulais simplement comprendre, c'est tout !
et puis ce n'est pas grave, dans l'entreprise en question, ils sont passé à Excel 2016 depuis un moment.
et le principale c'est que ça fonctionne avec 2016 !

merci encore à toi et bonne journée à toi !
 

patricktoulon

XLDnaute Barbatruc
Ok pas de soucis
juste pour le'exercice j'ai testé une adaptation de JB (celle que tu a donnée dans une autre discussion me semble t il)

et a ma grande surprise!!!!! 😱😵😲c'est plus rapide qu'adobe.connexion même sur 10000 lignes

VB:
Sub LitClasseurFermé()
Dim ChampAlire As Range, ChampOuCopier As Range, Chemin$, Fichier$, Onglet$
Chemin = ThisWorkbook.Path
Fichier = "exemple source.xlsx"
Onglet = "Feuil1"
Set ChampAlire = [A1:F3]
Set ChampOuCopier = [c3].Resize(ChampAlire.Rows.Count, ChampAlire.Columns.Count)
'execution
LitChamp ChampOuCopier, Chemin, Fichier, Onglet, ChampAlire
End Sub

Sub LitChamp(ChampOuCopier As Range, Chemin, Fichier, Onglet, ChampAlire As Range)
ChampOuCopier.FormulaArray = "='" & Chemin & "\[" & Fichier & "]" & Onglet & "'!" & CStr(ChampAlire.Address(0, 0)) 'formule matricielle
ChampOuCopier = ChampOuCopier.Value 'suppression des formules
End Sub

j'ai le C..! par terre 🤣
à me dégoutter d'avoir autant bûché sur Ado
 

Roland_M

XLDnaute Barbatruc
re

salut roblochon

@patrick:
je ne me sers plus que ça !
c'est ce que je te disais dans une autre discussion, tu avais du mal à me croire,
moins de 5 secondes sur env. 400 fichiers avec deux champs de données env 130/150 cellules
ça représente sur ma feuille presque 6000 lignes sur 7 colonnes
je load dans une feuille temp et je transfert .value dans un Tablo as variant pour mettre en forme sur la feuille de destination. tout ça en un temps record !
c'est absolument bluffant ! Merci J.B !

cette méthode de (J.B) Jacques Boisgontier n'est pas assez connu !
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
Ah!! ben oui maintenant je te confirme que c'est plus rapide

après il faut pas tout jeter avec adobe.connexion on peu faire des choses qu'avec cette méthode ce serait un vrai calvaire a coder
le " from certaine colonnes" par exemple ou le "WHERE..."

après avec l'exemple copyfromrecordset je vais aussi vite mais c'est normal c'est un simple calque c'est une simple copie

mais la méthode formulaarray a l'avantage d’être facile a comprendre et à mettre en place même pour un débutant
 

dysorthographie

XLDnaute Accro
re

salut roblochon

@patrick:
je ne me sers plus que ça !
c'est ce que je te disais dans une autre discussion, tu avais du mal à me croire,
moins de 5 secondes sur env. 400 fichiers avec deux champs de données env 130/150 cellules
ça représente sur ma feuille presque 6000 lignes sur 7 colonnes
je load dans une feuille temp et je transfert .value dans un Tablo as variant pour mettre en forme sur la feuille de destination. tout ça en un temps record !
c'est absolument bluffant ! Merci J.B !

cette méthode de (J.B) Jacques Boisgontier n'est pas assez connu !
il faut dans limiter au maximum aux connexion déconnexion c'est ce qui prends le plus de temp!

pour gagner ce temp de connexion il faut faire un connexion sur ThisWorkbook.FullName et effectuer une jointure externe dans tes requêtes!

pour te donner une petite idée!
VB:
Sub test()
With CreateObject("AdoDb.connection")
    .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1;"""
For i = 1 To 400
    Sheets("Feuil2").Cells(Cells.Rows.Count, "A").End(xlUp).Offset(1).CopyFromRecordset .Execute("Select * from [Feuil1$] in 'C:\Test\test.xlsX' 'Excel 12.0;HDR=No;IMEX=1'")
Nex    .Close
End With
End Sub
 

Discussions similaires

Réponses
8
Affichages
237