Problème avec CreateObject depuis migration vers Windows10

Résolu
Bonjour,

Voici la partie de mon code qui cause problème. La macro arrête à la ligne
.open
Set Cn = CreateObject("ADODB.connection")
        With Cn
            .Provider = "Microsoft.Jet.OLEDB.4.0"
            .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
             & Fichier2 & ";Extended Properties=""Excel 12.0;HDR=YES;"""
            .Open
        End With

Cette macro me sert à ouvrir et faire une recherche dans une base fermée Access à partir d'un fichier Excel. Je sais que ça vient de la ligne Provider que je dois changer, mais par quoi??

Pour le moment, j'ai seulement installer le moteur de base de données Microsoft Acces 2010.

7 réponses

Résumé de la discussion

Problème central : une macro VBA ouvre une base Access fermée à partir d'Excel via ADODB et la ligne Provider pose problème, Jet.OLEDB.4.0 étant inadapté aux formats modernes (.accdb) et aux versions récentes d'Office. Pour accéder à une base Access (.accdb) ou via Access 2010/2013, il faut employer le provider Microsoft.ACE.OLEDB.12.0 dans la chaîne de connexion et veiller à ce que le moteur ACE soit installé. En complément, la fermeture des objets ADODB (Cn, Rst) et la libération des ressources après l’exécution peut être nécessaire et selon les environnements Office, ACE 12.0 peut être requis pour la stabilité.

Bobot (l’IA à votre service)
  1. Re,

    Ben, pas de probleme avec 2010 et ref mini:

    1. Bonjour,

      J'ai modifié mes références pour qu'elles soit comme les vôtres et ça fonctionne maintenant.

      En espérant, que ça reste comme ça!

      Merci beaucoup pour votre aide!
    2. @bassmartBonjour,

      Le problème en encore revenu aujourd'hui et je ne comprend toujours pas le problème vient d'où?
    3. @bassmartBonjour,

      Vous pouvez mettre vos fichiers a dispo?
      Si probleme infos sensibles passez par les messages prives
    4. @f894009Bonjour,

      C'est à n'y rien comprendre ce matin ça fonctionne.

      J'ai vue quand lançant Microsoft Access, quelque chose c'est installé et j'ai tester mon fichier Excel et ça fonctionnait.

      Voici malgré tout le lien pour mon fichier:
      https://www.cjoint.com/c/JBoqP74iqU7

      Merci!
    5. @bassmartRe,

      Y a pas de connection avec une base Access, que des fichier Excel!!
  2. Bonjour,

    Je vais provisoirement installer office 2010 pour voir ce qui ce passe!!
    Afin de savoir si problème office ou ......
    1. Bonjour,

      Je ne sais pas ce qui c'est passé, mais le problème est revenu aujourd'hui après avoir redémarré mon poste.

      J'ai vérifié et les références sont toujours là!


      Merci!
      1. Bonjour et meilleurs voeux,

        J'utilise uniquement ce que je vous ai mis en image post 5!!
        Je vais vous chercher dans mon capharnaüm un fichier que j'ai code.
      2. @f894009Re,

        fichier code et fichier source a lire: https://mon-partage.fr/f/dpykFocQ/

        A tester, j'ai Excel2013 vous Excel 2010.
      3. @f894009Bonjour,

        J'ai le même problème avec votre macro, elle bloque sur la ligne ".open".

        Voici le message:
    2. Bonjour,

      J'ai réglé mon problème, j'ai été dans les références et j'ai ajouter "Microsoft ActiveX Data Objets (Multi-dimensional) 6.0 library" et "Microsoft Jet and Replication Objects 2.6 Library" et ça fonctionne maintenant.
      1. Voici mon code original complet. Il est dans le module1 de ma feuille et est appelé par une macro qui se trouve dans un Userform.
        Public T_NT As String
        Sub Recherche_Classeur_Ferme()
            Dim Cn As Object
            Dim Rst As Object 'Comparaison des deux fichiers
            Dim Fichier2, texte_SQL As String
            Dim NomFeuille As String
                '-----------------------------
                
                With Worksheets(1)
                    Sondage = ActiveSheet.Cells(2, 1).Value
                    '.Range("A3:A100000").ClearContents
                End With
                'Définit le classeur fermé servant de base de données
                Fichier2 = "T:\Geotechnique\Mouvements\Entrepot\BDFS\0_Sondages_a_saisir_Geotec\" & "SONDAGE.xlsx" 
                'Nom de la feuille dans le classeur fermé
                Table = "SONDAGE" & "$"
                plage = "B1:B100000"
                Champ = "NO_SONDAGE"
                '--- Connexion ---
                Set Cn = CreateObject("ADODB.connection")
                With Cn
                    .Provider = "Microsoft.Jet.OLEDB.4.0"
                    .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
                     & Fichier2 & ";Extended Properties=""Excel 12.0;HDR=YES;"""
                    .Open
                End With
                '-----------------
                '... la requête avec WHERE et LIKE
                texte_SQL = "SELECT " & Champ & " FROM [" & Table & "] WHERE " & Champ & " like '" & "%" & Sondage & "%';" ''" & Sondage & "%';"
                Set Rst = CreateObject("ADODB.Recordset")
                Rst.Open texte_SQL, Cn, adOpenStatic
                'Ecriture dans la feuille de calcul
                If Not Rst.EOF Then
                    ActiveSheet.Cells(2, 1).CopyFromRecordset Rst
                    Rst.MoveFirst
                    tsondage = Rst.GetRows
                    Nb = UBound(tsondage, 2)
                    If Nb > 0 Then
                        TS = "["
                        For NS = 0 To Nb: TS = TS & tsondage(0, NS) & " ¤ ": Next NS
                            If NS >= 2 Then
                                UserForm3.Show
                            Else
                                TS = Left(TS, Len(TS) - 3) & "]"
                                T_NT = T_NT & vbNewLine & Sondage & " en " & Nb + 1 & " exemplaires " & vbNewLine & TS
                            End If
                    End If
                Else
                    'Infos non trouvees
                    T_NT = T_NT & vbNewLine & Sondage
                End If
                '--- Fermeture connexion ---
        End Sub
        
        1. Bonjour,

          votre code modifie partiellement pour connexion base access.
          Pour text_SQL et l'ecriture feuille si il y, a vous de modifier

          Sub Recherche_Access()
          Dim Cn As Object
          Dim Rst As Object 'Comparaison des deux fichiers
          Dim Fichier2, texte_SQL As String
          Dim NomFeuille As String

          '-----------------------------
          With Worksheets(1)
          Sondage = ActiveSheet.Cells(2, 1).Value
          '.Range("A3:A100000").ClearContents
          End With
          'D?finit la base Accsess a connecter
          Fichier2 = "T:\Geotechnique\Mouvements\Entrepot\BDFS\0_Sondages_a_saisir_Geotec\" & "SONDAGE.xlsx"
          'Nom nom de la table Access pour la recherche
          Table = "nom de la table" 'a modifier
          '*******************************************************
          '--- Connexion base ACCESS ---
          Set Cn = CreateObject("ADODB.connection")
          Set Rst = CreateObject("ADODB.Recordset")
          'chaine de connexion 2007_2010_2013
          connstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Fichier2
          'Connexion a la base
          Cn.Open connstring
          '--------- Requete a modifier suivant recherche
          '... la requ?te avec WHERE et LIKE
          texte_SQL = "SELECT " & Champ & " FROM " & Table & " WHERE " & Champ & " like '" & "%" & Sondage & "%';" ''" & Sondage & "%';"
          Rst.Open texte_SQL, Cn, adLockOptimistic
          '*******************************************************
          'Table vide
          If Rst.EOF And Rst.bof Then
          MsgBox "Pas d'enregistrement!!!!!!!!!!!!!!!!!!!!"
          Rst.Close
          Cn.Close
          Set Rst = Nothing
          Set Cn = Nothing
          Exit Sub
          End If
          'recup enregistrement(s)
          If Not Rst.EOF Then
          ActiveSheet.Cells(2, 1).CopyFromRecordset Rst
          Rst.MoveFirst
          tsondage = Rst.GetRows
          Nb = UBound(tsondage, 2)
          If Nb > 0 Then
          TS = "["
          For NS = 0 To Nb: TS = TS & tsondage(0, NS) & " ? ": Next NS
          If NS >= 2 Then
          UserForm3.Show
          Else
          TS = Left(TS, Len(TS) - 3) & "]"
          T_NT = T_NT & vbNewLine & Sondage & " en " & Nb + 1 & " exemplaires " & vbNewLine & TS
          End If
          End If
          Else
          'Infos non trouvees
          T_NT = T_NT & vbNewLine & Sondage
          End If
          '========================================
          '--- Fermeture connexion ---
          Rst.Close
          Cn.Close
          Set Rst = Nothing
          Set Cn = Nothing
          End Sub

          Pour info:
          Microsof Forms 2.0 se met automatiquement s'il y a une Userform, c'est votre cas
        2. @f894009Je n'ai pas encore essayé votre code, mais je ne veux pas me connecter à une base Access mais bien à un fichier Excel.

          J'ai fait une erreur dans mes explications un peu plus haut. J'exporte une table Access en fichier Excel qui se nomme SONDAGE.

          Est-ce que ça change quelques choses dans la façon de coder?
        3. @bassmartRe,

          mais bien à un fichier Excel.
          En partant de quoi, Access… Excel...

          J'ai fait une erreur dans mes explications
          Sans dec….

          Est-ce que ça change quelques choses
          Ben un peu.....

          Je reprends la chose
        4. @f894009Mon fichier Excel est extrait (exporté) d'une base Access. C'est la table SONDAGE qui est extraite en fichier Excel (.xlsx).

          Merci!
        5. @f894009Re,

          Ben votre code marche tres bien!!!!
          W10 et Excel 2013

          Pensez a la fermeture de Rst et Cn , puis le set nothing en fin de procedure

          Public T_NT As String
          Sub Recherche_Classeur_Ferme()
          Dim Cn As Object
          Dim Rst As Object 'Comparaison des deux fichiers
          Dim Fichier2, texte_SQL As String
          Dim NomFeuille As String
          '-----------------------------

          With Worksheets(1)
          Sondage = ActiveSheet.Cells(2, 1).Value
          '.Range("A3:A100000").ClearContents
          End With
          'test avec un de mes classeurs OK
          'Fichier2 = "C:\_Docs_Prog_Excel\_Mashk\Excel_Excel\Sources.xlsx"
          'Sondage = "Radar"
          'Table = "Sources$" '
          'Champ = "Infraction"
          'Nom de la feuille dans le classeur ferm?
          '------------------------
          'D?finit le classeur ferm? servant de base de donn?es
          Fichier2 = "T:\Geotechnique\Mouvements\Entrepot\BDFS\0_Sondages_a_saisir_Geotec\" & "SONDAGE.xlsx"
          Table = "SONDAGE$"
          Plage = "B1:B100000"
          Champ = "NO_SONDAGE"
          '--- Connexion ---
          Set Cn = CreateObject("ADODB.connection")
          With Cn
          .Provider = "Microsoft.Jet.OLEDB.4.0"
          .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
          & Fichier2 & ";Extended Properties=""Excel 12.0;HDR=YES;"""
          .Open
          End With
          '-----------------
          '... la requ?te avec WHERE et LIKE
          texte_SQL = "SELECT " & Champ & " FROM [" & Table & "] WHERE " & Champ & " like '" & "%" & Sondage & "%';" ''" & Sondage & "%';"
          Set Rst = CreateObject("ADODB.Recordset")
          Rst.Open texte_SQL, Cn, adOpenStatic
          'Ecriture dans la feuille de calcul
          If Not Rst.EOF Then
          ActiveSheet.Cells(2, 1).CopyFromRecordset Rst
          Rst.MoveFirst
          tsondage = Rst.GetRows
          Nb = UBound(tsondage, 2)
          If Nb > 0 Then
          TS = "["
          For NS = 0 To Nb: TS = TS & tsondage(0, NS) & " ? ": Next NS
          If NS >= 2 Then
          UserForm3.Show
          Else
          TS = Left(TS, Len(TS) - 3) & "]"
          T_NT = T_NT & vbNewLine & Sondage & " en " & Nb + 1 & " exemplaires " & vbNewLine & TS
          End If
          End If
          Else
          'Infos non trouvees
          T_NT = T_NT & vbNewLine & Sondage
          End If
          '--- Fermeture connexion ---
          End Sub

          CCM: peux toujours pas mettre les balises de code!!!!!
      2. Bonjour,

        J'ai essayé et ça ne fonctionne pas, Excel ferme tout seul.

        J'ai utilisé le "Microsoft ActiveX Data Objetcts 2.0 Library"

        Merci,
        1. Bonjour,

          Je code comme ceci:

          Sub Connexion_Base_Access()
          Dim conn As Object

          On Error GoTo fin

          Chemin_Base = ThisWorkbook.Path 'a adapter
          Set conn = CreateObject("ADODB.Connection")
          'chaine de connexion 2007_2010_2013
          Nom_Bases = "azerty.accdb" 'a adapter
          connstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Chemin_Base & "\" & Nom_Bases
          'Connexion a la base
          conn.Open connstring
          Exit Sub
          fin:
          MsgBox "Erreur de connection base!!!! " & vbNewLine & "Prevenir Administrateur"
          End Sub

          Avce ces ref ici 15->2013, le common control n'a rien a voir. Pas besoin d'une ref ADO



          Pour CCM:
          Peux plus mettre les balises de code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        2. @f894009Je n'y arrive toujours pas!

          Qu'est-ce que le "nom_base" signifie?

          J'ai envoyé mon code complet plus bas.
      3. Contributeur
        Bonjour,

        comme ceci:

         'Vous devez préalablement activer la référence Microsoft ActiveX Data Objects x.x Library pour utiliser les exemples présentés dans ce tutoriel.
          
            Dim Cn As ADODB.Connection
          
            Set Cn = New ADODB.Connection
            
            With Cn
                .Provider = "Microsoft.Jet.OLEDB.4.0"
                .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
                    & chemin & ";Extended Properties=""Excel 12.0;HDR=YES;"""
                .Open
            End With


        Voilà
        1. Bonjour a vous deux,

          ouvrir et faire une recherche dans une base fermée Access à partir d'un fichier Excel.
          Y a un bleme, car le code fait une connexion avec un fichier Excel!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        2. @f894009Bonjour,

          Effectivement, mon erreur! C'est une table d'une base Access qui à été exporter en fichier Excel.
        3. Contributeur
          Essaie cela:

          'https://silkyroad.developpez.com/VBA/ClasseursFermes/
          'https://silkyroad.developpez.com/VBA/ClasseursFermes/#LV
             'Nécéssite d'activer la référence Microsoft ADO ext x.x for DLL and Security
             'Vous devez préalablement activer la référence Microsoft ActiveX Data Objects x.x Library pour utiliser les exemples présentés dans ce tutoriel.
            Sub RequeteClasseurFerme(ByVal chemin As String)
              Dim Cn As ADODB.Connection
              Dim NomFeuille As String, texte_SQL As String
              Dim Rst As ADODB.Recordset
              Dim oCat As ADOX.Catalog
              Dim Resultat As String
              Dim Feuille As ADOX.Table
              
              Set Cn = New ADODB.Connection
              Set oCat = New ADOX.Catalog
              
              With Cn
                  .Provider = "Microsoft.Jet.OLEDB.4.0"
                  .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
                      & chemin & ";Extended Properties=""Excel 12.0;HDR=YES;"""
                  .Open
              End With
              
              Set oCat.ActiveConnection = Cn
                  
              For Each Feuille In oCat.Tables
                  Resultat = Feuille.Name
              Next
              
              'Nom de la feuille dans le classeur fermé
              NomFeuille = Resultat
              
              'Définit la requête.
              '/!\ Attention à ne pas oublier le symbole $ après le nom de la feuille.
              texte_SQL = "SELECT * FROM [" & NomFeuille & "]"
              
              Set Rst = New ADODB.Recordset
              Set Rst = Cn.Execute(texte_SQL)
              
              'Ecrit le résultat de la requête dans la cellule A1
              Range("A1").CopyFromRecordset Rst
              
              '--- Fermeture connexion ---
               Set Feuille = Nothing
              Set oCat = Nothing
              Cn.Close
              Set Cn = Nothing
          End Sub
          
          'pour lancer:
          
           RequeteClasseurFerme("chemin de classeur")
          
          


          @+ Le Pivert