Connexion ADODB quel provider pour Office 2013 64bits Le sujet est résolu

Y compris Power BI, Power Query et toute autre question en lien avec Excel
Avatar du membre
BrunoM45
Membre impliqué
Membre impliqué
Messages : 2'940
Appréciations reçues : 94
Inscrit le : 29 octobre 2011
Version d'Excel : 2016 FR, O365 FR
Contact :

Message par BrunoM45 » 3 février 2016, 11:11

Bonjour les pros :wink:

Je suis confronté à un problème de connexion ADODB sur Excel 2013 version 64 bits
La "base de données" est un fichier excel 2003 ".xls"

Dans ma société nous avons 2 versions d'office installées
- Office 2010 32bits
- Office 2013 64bits

Début du code
  ' Créer une nouvelle instance ADO
  Set Cnn = CreateObject("ADODB.Connection")
  ' Créer la connexion selon la version d'Excel
Ensuit
Pour Office 2010, pas de soucie j'utilise la connexion
Set Conn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=MaSourceBdD#;Extended Properties='Excel 8.0;HDR=YES';"
Pour office 2013 en revanche je voulais utiliser
Set Conn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=MaSourceBdD#;Extended Properties='Excel 8.0;HDR=YES';"
Mais là, la connexion ne se fait pas :? :cry:

Qui sait ce que je dois faire pour que ça fonctionne ?

Par avance merci :wink:
[F1] est une touche qui appelle l'aide : Essayez, c'est assez performant et on trouve plein de choses

Il n'y a ni bon ni mauvais usage de la liberté d'expression, il n'en existe qu'un usage insuffisant.
Avatar du membre
pierrep56
Membre impliqué
Membre impliqué
Messages : 1'155
Appréciations reçues : 187
Inscrit le : 18 juin 2014
Version d'Excel : 2016

Message par pierrep56 » 3 février 2016, 11:57

Bonjour Bruno,

Pour ce type de connexion j'utilise plutôt :
Set Cnx = CreateObject("ADODB.Connection")
Cnx.Provider = "MSDASQL"
Cnx.Open "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" & _
             "DBQ=" & NDF & "; ReadOnly=False;"
dans lequel NDF contient le chemin + le nom du xls à interroger
Ça fonctionne sur toutes les versions d'Office

Pierre
Avatar du membre
BrunoM45
Membre impliqué
Membre impliqué
Messages : 2'940
Appréciations reçues : 94
Inscrit le : 29 octobre 2011
Version d'Excel : 2016 FR, O365 FR
Contact :

Message par BrunoM45 » 3 février 2016, 12:12

Salut Pierre :wink:

Heureux de te voir par ici :D

Ca marche mieux, mais j'ai toujours un souci lorsque je veux créer ma requète avec ma condition
Ca me renvoit 0 enregistrement !?

Ma constante publique
' Chaine de connextion pour accès en BdD
Public Const sConnect As String = "Provider=MSDASQL;Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=#sPathBdD#;ReadOnly=True"
Mon code de remplissage d'une ListeBox
Sub RemplirLbxCrit(ObjLbx As MSForms.ListBox, sPathBdD As String, sTable As String, sCrit As String, vCrit As String)
  Dim sRqt As String, sCond As String, Sql As String
  Dim NbField As Integer, NbRecord As Integer
  ' En cas d'erreur
  FlgErrCon = False
  On Error GoTo Erreur_Proc
  ' Vider la combobox en question
  If ObjLbx.ListCount > 0 Then ObjLbx.Clear
  ' Créer une nouvelle instance ADO
  Set Cnn = CreateObject("ADODB.Connection")
  ' Créer la connexion selon la version d'Excel
  sConn = Replace(sConnect, "#sPathBdD#", sPathBdD, Compare:=vbTextCompare)
  ' Ouvrir la connexion
  Cnn.Open sConn
  ' En cas d'erreur utliser
  If FlgErrCon = True Then
    MsgBox "Impossible de se connecter à la base de données!", vbCritical, "OUPS..."
    End
  End If
  ' Préparer la requête
  If InStr(1, sTable, " ") > 0 Then
    Sql = "SELECT * FROM ['" & sTable & "$']"
  Else
    Sql = "SELECT * FROM [" & sTable & "$]"
  End If
  ' Définir la condition
  If InStr(1, vCrit, "*") > 0 Then
    ' COndition en SQL = WHERE (DESIGNATION_TACHES Like '%BTA%')
    sCond = "WHERE (" & sCrit & " Like '" & Replace(vCrit, "*", "%") & "');"
  Else
    sCond = "WHERE (" & sCrit & "=""" & vCrit & """);"
  End If
  ' Créer la syntaxe de la requête
  sRqt = Sql & " " & sCond
  ' Créer un nouveau Recordset et l'ouvrir
  Set Rs = CreateObject("ADODB.Recordset")
  Rs.Open sRqt, Cnn, CursorType
  ' Nombre de champ
  NbField = Rs.Fields.Count - 1
  ' Pour chaque enregistrement
  For NbRecord = 0 To Rs.RecordCount - 1
    ' Ajouter les champs au combobox
    ObjLbx.AddItem Rs(2)
    ObjLbx.List(ObjLbx.ListCount - 1, 1) = Rs(3)
    ObjLbx.List(ObjLbx.ListCount - 1, 2) = Rs(4)
    ' Passer à l'enregistrement suivant
    Rs.MoveNext
  Next NbRecord
  ' Fermeture du recordset
  Rs.Close: Set Rs = Nothing
  ' Fermeture de la Bdd
  Cnn.Close: Set Cnn = Nothing
  Exit Sub

Erreur_Proc:
  LogError Err, "Sub RemplirLbxCrit(ObjLx" & ObjLbx.Name & ", sPathBdD=" & sPathBdD & ", sTable=" & sTable & ", sCrit=" & sCrit & ", vCrit=" & vCrit & ")"
  FlgErrCon = True  ' Mettre le FLAG d'erreur de connexion à vrai
  Resume Next
End Sub
A+
[F1] est une touche qui appelle l'aide : Essayez, c'est assez performant et on trouve plein de choses

Il n'y a ni bon ni mauvais usage de la liberté d'expression, il n'en existe qu'un usage insuffisant.
Avatar du membre
pierrep56
Membre impliqué
Membre impliqué
Messages : 1'155
Appréciations reçues : 187
Inscrit le : 18 juin 2014
Version d'Excel : 2016

Message par pierrep56 » 3 février 2016, 12:31

Tu peux peut être faire plus simple, du genre :
Rs.Open sRqt, Cnn, CursorType ' j'utilise plutôt Rs.Open sRqt, Cnn, adOpenStatic
If Not Rs.RecordCount = 0 Then
	Rs.MoveFirst
	ObjLbx.List = Rs.GetRows
end if
(et avant tu aura sélectionné uniquement les champs qui vont bien : SELECT champs1, champs2 FROM ...)
Pierre
Avatar du membre
BrunoM45
Membre impliqué
Membre impliqué
Messages : 2'940
Appréciations reçues : 94
Inscrit le : 29 octobre 2011
Version d'Excel : 2016 FR, O365 FR
Contact :

Message par BrunoM45 » 3 février 2016, 12:37

RE

Je ne peux pas utiliser cette méthode, car je dois impérativement filtrer mes enregistrements
Ce sont une liste de tâches en fonction d'un type de travail
pierrep56 a écrit :Tu peux peut être faire plus simple, du genre :
Rs.Open sRqt, Cnn, CursorType ' j'utilise plutôt Rs.Open sRqt, Cnn, adOpenStatic
If Not Rs.RecordCount = 0 Then
	Rs.MoveFirst
	ObjLbx.List = Rs.GetRows
end if
(et avant tu aura sélectionné uniquement les champs qui vont bien : SELECT champs1, champs2 FROM ...)
Pierre
A+
[F1] est une touche qui appelle l'aide : Essayez, c'est assez performant et on trouve plein de choses

Il n'y a ni bon ni mauvais usage de la liberté d'expression, il n'en existe qu'un usage insuffisant.
Avatar du membre
pierrep56
Membre impliqué
Membre impliqué
Messages : 1'155
Appréciations reçues : 187
Inscrit le : 18 juin 2014
Version d'Excel : 2016

Message par pierrep56 » 3 février 2016, 12:41

Ben, tu les filtres directos dans ta requête!?
Avatar du membre
BrunoM45
Membre impliqué
Membre impliqué
Messages : 2'940
Appréciations reçues : 94
Inscrit le : 29 octobre 2011
Version d'Excel : 2016 FR, O365 FR
Contact :

Message par BrunoM45 » 3 février 2016, 13:23

Re,
pierrep56 a écrit :Ben, tu les filtres directos dans ta requête!?
Et bien c'est justement ce que je fais dans mon code
...
  ' Préparer la requête
 If InStr(1, sTable, " ") > 0 Then
    Sql = "SELECT * FROM ['" & sTable & "$']"
  Else
    Sql = "SELECT * FROM [" & sTable & "$]"
  End If
  ' Définir la condition
 If InStr(1, vCrit, "*") > 0 Then
    ' COndition en SQL = WHERE (DESIGNATION_TACHES Like '%BTA%')
   sCond = "WHERE (" & sCrit & " Like '" & Replace(vCrit, "*", "%") & "');"
  Else
    sCond = "WHERE (" & sCrit & "=""" & vCrit & """);"
  End If
  ' Créer la syntaxe de la requête
 sRqt = Sql & " " & sCond
  ' Créer un nouveau Recordset et l'ouvrir
 Set Rs = CreateObject("ADODB.Recordset")
  Rs.Open sRqt, Cnn, CursorType
...
Voil a quoi ressemble mon SQL
SELECT * FROM ['RX SIMPLE$'] WHERE (TYPE_TRAVAUX="TRAVAUX AERIEN SUR EXISTANT");
Sans le "WHERE" j'ai bien tous les enregistrements :?

Mais aucun enregistrement est retourné alors que j'en avais avant :?

A+
[F1] est une touche qui appelle l'aide : Essayez, c'est assez performant et on trouve plein de choses

Il n'y a ni bon ni mauvais usage de la liberté d'expression, il n'en existe qu'un usage insuffisant.
Avatar du membre
pierrep56
Membre impliqué
Membre impliqué
Messages : 1'155
Appréciations reçues : 187
Inscrit le : 18 juin 2014
Version d'Excel : 2016

Message par pierrep56 » 3 février 2016, 14:50

Je ne sais pas si ça répondra à ta question, mais regarde cet exemple simplex de mise en œuvre d'un requêteur pour alimenter des combo en cascade, avec un seul "constructeur" de requête
Ça te donnera peut être des idées
A noter :
* qu'il suffit d'adapter uniquement le driver pour pouvoir interroger des bases Access, FoxPro, dBase, MySql, Sql Server, AS400, ...
* que le requêteur accepte les SELECT, INSERT, UPDATE (et DELETE hors fichier excel)
* que le requêteur renvoie une valeur qui est = au nb de lignes trouvées ou = -1 en cas d'erreur (pour pouvoir tester)
Pierre

PS : sinon autre exemple pus complet

PS2 de 17h53 : après relecture de ton code essaie les simples quotes : sCond = "WHERE " & sCrit & "='" & vCrit & "'"
demo.xlsm
(31.98 Kio) Téléchargé 37 fois
r
rdurupt
Nouveau venu
Nouveau venu
Messages : 1
Inscrit le : 30 juin 2015
Version d'Excel : néant

Message par rdurupt » 3 février 2016, 18:16

Bonjour,
Fais un
début.print rs(0).name
je n vois ps la notion de prise en compte du header dns ta collection, mais el même temps je métrise pas trop le 64bits!

Bonjour,
Fais un
début.print rs(0).name
je n vois ps la notion de prise en compte du header dns ta collection, mais el même temps je métrise pas trop le 64bits!
Avatar du membre
pierrep56
Membre impliqué
Membre impliqué
Messages : 1'155
Appréciations reçues : 187
Inscrit le : 18 juin 2014
Version d'Excel : 2016

Message par pierrep56 » 3 février 2016, 18:28

Ah, je vois, avec un intitulé contenant une apostrophe il faut "échapper" l'apostrophe.
Pour ça, je me suis fait une 'tite fonction :
Function Esc(S As String) As String
    Esc = Replace(S, "'", "''")
End Function
et tu l'apelles tout simplement :
sCond = "WHERE " & sCrit & "='" & Esc(vCrit) & "'"
:) Pierre
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message