Code VBA sur 2003 marche pas sur 2007

Signaler
Messages postés
28
Date d'inscription
mercredi 1 février 2012
Statut
Membre
Dernière intervention
17 avril 2013
-
Messages postés
28
Date d'inscription
mercredi 1 février 2012
Statut
Membre
Dernière intervention
17 avril 2013
-
Bonjour à tous

j'ai un problème de conversion d'un code VB 2003 à 2007.

En effet, j'ai un code récupéré sur un forum qui permet de rajouter dans une table access un fichier excel cela dans la version 2003. au préalable je supprime la table et ensuite je lance la macro et ça marchait..



Etant passé sur les deux(access et exce)l au 2007 je rencontre quelques petits désagréments, le problème venant aussi dans le post : dois je le mettre sur excel ou access.. j'essaye Excel..

J'ai le code que j'ai essayé de modifier en premier et le code qui marche pour access 2003 et avec des fichiers d excel 2003 est à la fin.



j'ai modifié oConn.Open "Provider='Microsoft.Jet.OLEDB.4.0';" & _ par oConn.Open "Provider='Microsoft.Jet.OLEDB.12.0';" & _ qui était conseillé dans un autre post.


et ça aussi de 4 à "12" mais en vain, j'ai du me tromper quelque part..
Cn.Open "Provider=Microsoft.Jet.OLEDB.12.0;" & _
"Data Source=" & Repertoire & "" & Fichier & ";" & _
"Extended Properties=""Excel 12.0;"""



Erreur Dim Cn as New ADODB.Connection
---> Erreur de compilation : Type défini par l'utilisateur non défini..

Sub tranfertFeuilleClasseursFermes_VersAccess_V02()
'Nécessite d'activer la référence Microsoft ActiveX Data Objects x.x Library
'Nécessite d'activer la référence Microsoft ADO ext x.x for DLL and Security
'
Dim Cn As New ADODB.Connection
Dim oProdRS As New ADODB.Recordset, oRS As ADODB.Recordset
Dim oConn As ADODB.Connection
Dim j As Integer
Dim Fichier As String, Repertoire As String, Feuille As String
Dim oCat As ADOX.Catalog

'-----------------TOP50-------------------------------------
Set oConn = New ADODB.Connection
oConn.Open "Provider='Microsoft.Jet.OLEDB.12.0';" & _
"Data Source= 'C:\Documents and Settings\RC1194\Desktop\test ACCESS 2007\Encaissements clients v1.accdb';"

'les données seront placés dans Table1
Set oRS = New ADODB.Recordset
oRS.Open "Select * from T-Mois", oConn, adOpenKeyset, adLockOptimistic
'------------------------------------------------------
 
'Boucle sur les classeurs Excel du répertoire cible
Repertoire = "C:\Documents and Settings\RC1194\Desktop\test ACCESS 2007\2012"
Fichier = Dir(Repertoire & "\*.xlsx")

Do While Fichier <> ""
    'Connection au classeur Excel
    Cn.Open "Provider=Microsoft.Jet.OLEDB.12.0;" & _
    "Data Source=" & Repertoire & "" & Fichier & ";" & _
    "Extended Properties=""Excel 12.0;"""
   
   
    '-------------------------
    Set oCat = New ADOX.Catalog
    Set oCat.ActiveConnection = Cn
    'Récupére le nom de la Feuille:
       'Attention: l'index correspond à un ordre alphabétique croissant
       'et les plages de cellules nommées sont intégrées.
    Feuille = oCat.Tables(0).Name
    '-------------------------
   
   
    'requête pour extraire les données de la Feuil1
    oProdRS.Open "SELECT * FROM [" & Feuille & "]", Cn, adOpenStatic
   
    ' --- Transfert les données dans la base ---
Do While Not (oProdRS.EOF)
        oRS.addNew
        For j = 0 To oRS.Fields.Count - 2
            oRS.Fields(j) = oProdRS.Fields(j).Value
           
        Next j
        oRS.Update
        oProdRS.moveNext
    Loop
    '-------------------------------------------
   
   
    Set oCat = Nothing
    oProdRS.Close
    'Fermeture de la connection au classeur Excel
    Cn.Close
Fichier = Dir
Loop

'oRS.Close
Set oRS = Nothing
'Fermeture de la connection Access
oConn.Close
Set oConn = Nothing
End Sub


Sub tranfertFeuilleClasseursFermes_VersAccess_V02()
'Nécessite d'activer la référence Microsoft ActiveX Data Objects x.x Library
'Nécessite d'activer la référence Microsoft ADO ext x.x for DLL and Security
'
Dim Cn As New ADODB.Connection
Dim oProdRS As New ADODB.Recordset, oRS As ADODB.Recordset
Dim oConn As ADODB.Connection
Dim j As Integer
Dim Fichier As String, Repertoire As String, Feuille As String
Dim oCat As ADOX.Catalog

'-----------------TOP50-------------------------------------
Set oConn = New ADODB.Connection
oConn.Open "Provider='Microsoft.Jet.OLEDB.4.0';" & _
"Data Source= 'C:\Documents and Settings\RC1194\Desktop\Test appli\maBase.mdb';"

'les données seront placés dans Table1
Set oRS = New ADODB.Recordset
oRS.Open "Select * from Top50", oConn, adOpenKeyset, adLockOptimistic
'------------------------------------------------------
 
'Boucle sur les classeurs Excel du répertoire cible
Repertoire = "C:\Documents and Settings\RC1194\Desktop\Test appli\sauvegarde\Suivi Top Production 10 derniers jours AC"
Fichier = Dir(Repertoire & "\*.xls")

Do While Fichier <> ""
    'Connection au classeur Excel
    Cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
    "Data Source=" & Repertoire & "" & Fichier & ";" & _
    "Extended Properties=""Excel 8.0;"""
   
   
    '-------------------------
    Set oCat = New ADOX.Catalog
    Set oCat.ActiveConnection = Cn
    'Récupére le nom de la Feuille:
       'Attention: l'index correspond à un ordre alphabétique croissant
       'et les plages de cellules nommées sont intégrées.
    Feuille = oCat.Tables(0).Name
    '-------------------------
   
   
    'requête pour extraire les données de la Feuil1
    oProdRS.Open "SELECT * FROM [" & Feuille & "]", Cn, adOpenStatic
   
    ' --- Transfert les données dans la base ---
Do While Not (oProdRS.EOF)
        oRS.addNew
        For j = 0 To oRS.Fields.Count - 2
            oRS.Fields(j) = oProdRS.Fields(j).Value
           
        Next j
        oRS.Update
        oProdRS.moveNext
    Loop
    '-------------------------------------------
   
   
    Set oCat = Nothing
    oProdRS.Close
    'Fermeture de la connection au classeur Excel
    Cn.Close
Fichier = Dir
Loop

'oRS.Close
Set oRS = Nothing
'Fermeture de la connection Access
oConn.Close
Set oConn = Nothing
End Sub





Merci de votre aide

Anthooooony

7 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
Salut

Pas tout détaillé, mais :

- vas sur <ce site> dont nous parlons en permanence dès qu'il s'agit de connexion aux DB

- Pour ton erreur, 2 choses :
D'abord, il faut ajouter la référence aux objets ADO dans ton projet :
"Microsoft ActiveX Data Objects X.Y Library"
X.Y : Soit 2.8, soit 6.1, mais 6.1 doit être du .Net - à vérifier.
Ensuite, la formulation correcte de l'utilisation de New :
Dim Toto As LeType
Set Toto = New LeType
et pas de New dans le Dim

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)

Bonjour,

Premièrement, il n'y a pas de moteur Jet12, il y a un moteur ace.oledb 12.

Tu peux regarder ici

Et ici.
Messages postés
28
Date d'inscription
mercredi 1 février 2012
Statut
Membre
Dernière intervention
17 avril 2013

Bonjour à vous deux

merci de votre retour

Je n'ai pas réussi malgré vos remarques, j'ai toujours la même erreur je n'ai pas du changer les bonnes choses.

Je vais regarder plus en détail ce week end je ne suis pas un programmeur en vba ni en rien du tout, il me faut un peu plus de temps pour comprendre!
merci en tout cas
Anthooooony
Messages postés
1835
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
10
Salut,

complètement d'accord avec jack sur l'utilisation du new
d'autan que l'un des principaux problèmes d'Xl2007 est que quelque type de variables ont changés ou ne sont plus présents.

Du coup il est préférable pour les variables objet d'utiliser le type Object quand c'est possible ou de vérifier que la référence utiliser avec Xl2003 est bien bien référencée dans Xl2007.

A+
Messages postés
28
Date d'inscription
mercredi 1 février 2012
Statut
Membre
Dernière intervention
17 avril 2013

Bonjour à tous

merci pour votre retour !

Je suis un peu à la rue ! Mais j'ai eu du bon grace à vous !

Alors juste j'ai pas tout compris avec le "new", j'ai essayé de l'enlevé à certains endroit mais la ligne devenait rouge je crois qu'a ce moment j'ai contrarié Excel et c'est pas bon quand il l'est !

Alors je n'ai plus de problème lorsque je lance la macro celle ci s'exécute sans embuche.
Cependant, le résultat est surprennant !Dans Access j'ai le nombre de ligne que j'avais dans excel mais sans contenu... j'ai essayé pour un test j'avais 1 jusqu'à 231 en nombre sur excel, et sur access j'ai 231 lignes totalement vide. J'ai bien paramétré access en numérique mais rien n'y fait..

Je me permets de vous remettre le code actualisé avec des petits bidouilles d'un amateur que je suis. Si vous avez une idée, j'y suis bientôt ..


Désolé du dérangement, mais la j'ai passé deux jours à faire à la main alors que je pouvais le faire avant en 1 minute grr.

Merci d'avance,

Anthooooony

Sub tranfertFeuilleClasseursFermes_VersAccess_V02()
'Nécessite d'activer la référence Microsoft ActiveX Data Objects x.x Library
'Nécessite d'activer la référence Microsoft ADO ext x.x for DLL and Security
'
Dim Cn As New ADODB.Connection
Dim oProdRS As New ADODB.Recordset, oRS As ADODB.Recordset
Dim oConn As ADODB.Connection
Dim j As Integer
Dim Fichier As String, Repertoire As String, Feuille As String
Dim oCat As ADOX.Catalog

'---------test---------------------------------------------
'Connection à la Base Access
Set oConn = New ADODB.Connection
oConn.Open "Provider='Microsoft.ace.oledb.12.0';" & _
"Data Source= 'C:\Documents and Settings\RC1194\Desktop\formulaire\test.accdb';"

'les données seront placés dans Table1
Set oRS = New ADODB.Recordset
oRS.Open "Select * from Table1", oConn, adOpenKeyset, adLockOptimistic
'------------------------------------------------------
 
'Boucle sur les classeurs Excel du répertoire cible
Repertoire = "C:\Documents and Settings\RC1194\Desktop\formulaire\table1"
Fichier = Dir(Repertoire & "\*.xlsx")

Do While Fichier <> ""
    'Connection au classeur Excel
    Cn.Open "Provider=Microsoft.ace.oledb.12.0;" & _
    "Data Source=" & Repertoire & "" & Fichier & ";" & _
    "Extended Properties=""Excel 8.0;"""
   
    
    '-------------------------
    Set oCat = New ADOX.Catalog
    Set oCat.ActiveConnection = Cn
    'Récupére le nom de la Feuille:
       'Attention: l'index correspond à un ordre alphabétique croissant
       'et les plages de cellules nommées sont intégrées.
    Feuille = oCat.Tables(0).Name
    '-------------------------
   
   
    'requête pour extraire les données de la Feuil1
    oProdRS.Open "SELECT * FROM [" & Feuille & "]", Cn, adOpenStatic
   
    ' --- Transfert les données dans la base ---
Do While Not (oProdRS.EOF)
        oRS.addNew
        For j = 0 To oRS.Fields.Count - 2
            oRS.Fields(j) = oProdRS.Fields(j).Value
        Next j
        oRS.Update
        oProdRS.moveNext
    Loop
    '-------------------------------------------
   
   
    Set oCat = Nothing
    oProdRS.Close
    'Fermeture de la connection au classeur Excel
    Cn.Close
Fichier = Dir
Loop

'oRS.Close
Set oRS = Nothing
'Fermeture de la connection Access
oConn.Close
Set oConn = Nothing

End Sub




Messages postés
28
Date d'inscription
mercredi 1 février 2012
Statut
Membre
Dernière intervention
17 avril 2013

Re Bonjour


Je suis a fond à fond !

Bon sur Mon travail d'avant j'avais plusieurs colonne, dans ce test je n'avais qu'une colonne.

J'ai fait donc récupérer 4 colonnes dans excel pour les importer dans access, et la !!!! et la !! j'ai eu 3 colonnes remplies et 1 vide grrr je dois avoir quelque chose dans ma fonction qui me veut du mal !

Help me please ....

Anthooooony
Messages postés
28
Date d'inscription
mercredi 1 février 2012
Statut
Membre
Dernière intervention
17 avril 2013

Bonjour

personne :'(

j'ai trouvé un code SQL mais celui ci me fait indiquer un nom de fichier alors qu'avec le code que j'avais c'était tout les fichiers d'un dossier donnée...