Code VBA sur 2003 marche pas sur 2007

anthooooony Messages postés 28 Date d'inscription mercredi 1 février 2012 Statut Membre Dernière intervention 17 avril 2013 - 13 sept. 2012 à 09:48
anthooooony Messages postés 28 Date d'inscription mercredi 1 février 2012 Statut Membre Dernière intervention 17 avril 2013 - 18 sept. 2012 à 18:35
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

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
13 sept. 2012 à 13:02
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)
0
Utilisateur anonyme
13 sept. 2012 à 17:33
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.
0
anthooooony Messages postés 28 Date d'inscription mercredi 1 février 2012 Statut Membre Dernière intervention 17 avril 2013
14 sept. 2012 à 14:18
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
0
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
14 sept. 2012 à 14:41
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+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
anthooooony Messages postés 28 Date d'inscription mercredi 1 février 2012 Statut Membre Dernière intervention 17 avril 2013
17 sept. 2012 à 18:05
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




0
anthooooony Messages postés 28 Date d'inscription mercredi 1 février 2012 Statut Membre Dernière intervention 17 avril 2013
18 sept. 2012 à 11:05
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
0
anthooooony Messages postés 28 Date d'inscription mercredi 1 février 2012 Statut Membre Dernière intervention 17 avril 2013
18 sept. 2012 à 18:35
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...
0
Rejoignez-nous