IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Mise à jour d'un fichier Excel fermé


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    électricien
    Inscrit en
    février 2021
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : électricien
    Secteur : Bâtiment

    Informations forums :
    Inscription : février 2021
    Messages : 19
    Points : 5
    Points
    5
    Par défaut Mise à jour d'un fichier Excel fermé
    J'ai deux fichiers (la machine et les data externes).

    je souhaite mettre à jour la ligne de l'ID 100000005 du classeur DATA.xlsx avec les données du classeur Classeurs avec code VBA.xlsm
    J'ai trouvé un code sur le forum https://www.developpez.net/forums/d1...e/#post8562971 mais je ne parvient pas à l'adapter à mon besoin.

    Je vous remercie d'avance
    Fichiers attachés Fichiers attachés

  2. #2
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    juin 2019
    Messages
    609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : juin 2019
    Messages : 609
    Points : 937
    Points
    937
    Par défaut
    Bonsoir,
    cette méthode te sera sans doute plus compréhensible!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Sub Test()
    Dim Cn As New ADODB.Connection, Rs As New ADODB.Recordset, Sql As String,I as integer,C as integer
    Sql = "select * from [Feuil1$]"
        '==>Open connection
        With Cn
            .Provider = "Microsoft.Jet.OLEDB.4.0"
            .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
                & ThisWorkbook.Path & "\DATA.xlsx" & ";Extended Properties=""Excel 12.0;HDR=YES;"""
            .Open
          Rs.Open Sql, Cn, 1, 3
            With Sheets("Feuil1")
                For i = 2 To .Range("A1").CurrentRegion.Rows.Count
                    Rs.Filter = "ID=" & .Cells(i, "A")
                    If Rs.EOF Then Rs.AddNew
                    For C = 0 To Rs.Fields.Count - 1
                        Rs.Fields(Trim(.Cells(1, "A").Offset(0, C))) = .Cells(i, "A").Offset(0, C)
                    Next
                    Rs.Update
                Next
            End With
            .Close
        End With
        MsgBox "Fin"
    End Sub
    Édite
    Je tenais à préciser mon incompréhension sur l'intérêt de synchroniser un fichier XLSX en fonction d'un XLSM !

  3. #3
    Futur Membre du Club
    Homme Profil pro
    électricien
    Inscrit en
    février 2021
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : électricien
    Secteur : Bâtiment

    Informations forums :
    Inscription : février 2021
    Messages : 19
    Points : 5
    Points
    5
    Par défaut
    Bonsoir,

    Effectivement ce code me parle un peu plus, mais je croche toujours car je doit mettre à jour seulement une seule ligne qui est en l'occurrence celle dont l'ID est 100000005 qui dans mon programme est une variable !
    Et selon ce que j'ai vu, ton code boucle sur l'ensemble du tableau.

    A quoi ce code devrait ressembler pour que la mise à jour se passe sur une seule ligne définie par l'ID sachant que la ligne peut avoir des valeurs nulles entre les colonnes B et F (ex : l'AS_accueil) ?
    Et si comme tu as pu le voir, si une nouvelle ligne est ajoutée au bas comme dans l'ID 100000009. Comment le code pourrait l'ajouter au fichier DATA ?

  4. #4
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    juin 2019
    Messages
    609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : juin 2019
    Messages : 609
    Points : 937
    Points
    937
    Par défaut
    En fait ce code te parle pas du tout !

    Ce code met à jour tout le fichier et si une ligne est ajouter il l'ajoute également à DATA.xlsx!

    Je comprends que je n'es rien compris mais en même temps tu parles de la ligne 100000005 et en même temps de l'ajout d'une ligne 100000009!

  5. #5
    Futur Membre du Club
    Homme Profil pro
    électricien
    Inscrit en
    février 2021
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : électricien
    Secteur : Bâtiment

    Informations forums :
    Inscription : février 2021
    Messages : 19
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Thumb down Voir le message
    En fait ce code te parle pas du tout !

    Ce code met à jour tout le fichier et si une ligne est ajouter il l'ajoute également à DATA.xlsx!

    Je comprends que je n'es rien compris mais en même temps tu parles de la ligne 100000005 et en même temps de l'ajout d'une ligne 100000009!
    Je crois que je me suis mal exprimé, ce n'est pas la ligne 100000005 mais le ligne donc l'ID est 100000005 qui est une variable dans mon programme !
    Je relevé que ton code permet de rajouter une ligne si un nouvel ID a été ajouté. Chose que je n'avais pas pensé initialement et que je souhaiterai intégrer dans mon code c'est pourquoi, j'ai ajouté l'idée de l'ID 100000009.
    Du coup, peux-tu m'aider ?

  6. #6
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    juin 2019
    Messages
    609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : juin 2019
    Messages : 609
    Points : 937
    Points
    937
    Par défaut
    J'ai dis ligne mais je pensais ID!
    Il faut que tu sois plus explicite car c'est incompréhensible désolé.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    électricien
    Inscrit en
    février 2021
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : électricien
    Secteur : Bâtiment

    Informations forums :
    Inscription : février 2021
    Messages : 19
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Thumb down Voir le message
    J'ai dis ligne mais je pensais ID!
    Il faut que tu sois plus explicite car c'est incompréhensible désolé.
    Ok alors je via reprendre depuis le début.

    1. Je modifie dans Classeurs avec code VBA.xlsm la ligne 6 dont l'ID qui se trouve en colonne A est 100000005
    2. Je veux mettre à jour uniquement cette ligne dans le classeur DATA.xlsx


    Est-ce plus clair pour toi maintenant ?
    Fichiers attachés Fichiers attachés

  8. #8
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    juin 2019
    Messages
    609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : juin 2019
    Messages : 609
    Points : 937
    Points
    937
    Par défaut
    Bonjour,
    Tu ne modifie jamais l'ID 100000003?

    Tu parles dans le poste précédent de l'ID 100000009 que tu as rajouté !

    De ce que j'ai compris tu utilises une variable avec le code ID 100000005 c'est uniquement celui ci que tu cherches à modifier.

    Je peux comprendre que tu souhaites modifier ou ajouter que les enregistrements que tu as retravaillé mais la restriction à l'ID 100000005 m'échappe un peu !

  9. #9
    Futur Membre du Club
    Homme Profil pro
    électricien
    Inscrit en
    février 2021
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : électricien
    Secteur : Bâtiment

    Informations forums :
    Inscription : février 2021
    Messages : 19
    Points : 5
    Points
    5
    Par défaut
    Sur le fond, je souhaite pouvoir modifier n'import quelle ligne. C'est pourquoi, je pensais mettre l'ID en variable plus tard comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim ID_rech As String
    ID_rech = ThisWorkbook.Sheets("Feuil1").Range("J1")
    Dans mon poste précédent quand j'ai abordé la question de l'ajout d'une nouvelle ligne, c'est parce que je l'avais vu dans ton code. Chose que j'ai trouvé très intéressant et que je voudrai ajouter par après à mon code.

    Est-ce que tu arrives à adapter ton code pour qu'il permette de faire la mise à jour les données de DATA.xlsx depuis le Classeurs avec code VBA.xlsm selon l'ID défini dans la cellule J1 du classeur Classeurs avec code VBA.xlsm?
    Fichiers attachés Fichiers attachés

  10. #10
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    juin 2019
    Messages
    609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : juin 2019
    Messages : 609
    Points : 937
    Points
    937
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    Sub Test()
    MajXls ThisWorkbook.Sheets("Feuil1").Range("J1")
    End Sub
     Sub MajXls(ID As String)
    Dim Cn As New ADODB.Connection, Rs As New ADODB.Recordset, Sql As String
    Sql = "select * from [Feuil1$] WHERE ID=" & ID
        '==>Open connection
        With Cn
            .Provider = "Microsoft.Jet.OLEDB.4.0"
            .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
                & ThisWorkbook.Path & "\DATA.xlsx" & ";Extended Properties=""Excel 12.0;HDR=YES;"""
            .Open
          Rs.Open Sql, Cn, 1, 3
            With Sheets("Feuil1")
                i = SerchXls(.Range("A:A"), .Range("A1"), ID, True)
                If i = 0 Then  Cn.Close: Exit Sub
                    If Rs.EOF Then Rs.AddNew
                    For C = 0 To Rs.Fields.Count - 1
                        Rs.Fields(Trim(.Cells(1, "A").Offset(0, C))) = .Cells(i, "A").Offset(0, C)
                    Next
                    Rs.Update
            End With
            .Close
        End With
    End Sub
     
     
    Function SerchXls(Myrange As Range, MyCellule As Range, strRecherche, EntierCell As Boolean) As Long '
    On Error Resume Next
    SerchXls = 0
       SerchXls = Myrange.Cells.Find(What:=strRecherche, After:=MyCellule, LookIn:=xlFormulas, LookAt _
            :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
            False, SearchFormat:=EntierCell).Row
      If SerchXls <= MyCellule.Row Then SerchXls = 0
    End Function

  11. #11
    Futur Membre du Club
    Homme Profil pro
    électricien
    Inscrit en
    février 2021
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : électricien
    Secteur : Bâtiment

    Informations forums :
    Inscription : février 2021
    Messages : 19
    Points : 5
    Points
    5
    Par défaut
    Ouhhh alors là, je ne comprends à nouveau plus grand chose !
    comment fonctionne cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MajXls ThisWorkbook.Sheets("Feuil1").Range("J1")
    ?

    Par contre, j'ai le code qui bloque à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Rs.Fields(Trim(.Cells(1, "A").Offset(0, C))) = .Cells(I, "A").Offset(0, C)
    et j'ai mis dans la cellule J1 la valeur 100000005
    Dans ce contexte C=4 et I=6

  12. #12
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    juin 2019
    Messages
    609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : juin 2019
    Messages : 609
    Points : 937
    Points
    937
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    Private Sub Test()
    MajXls ThisWorkbook.Sheets("Feuil1").Range("J1") 'Appel Sub MajXls en lui fournissan la valeur de JI en paramettre ID
    End Sub
     Sub MajXls(ID As String) 'procédure personnalisé avec passage de parametre ID!
    Dim Cn As New ADODB.Connection, Rs As New ADODB.Recordset, Sql As String 'Déclaration des variable
    'je séléctionne tous les champs de la table Feuil1$ don ID est égale au parmetre passé à la procédure MajXls ThisWorkbook.Sheets("Feuil1").Range("J1")
    Sql = "select * from [Feuil1$] WHERE ID=" & ID
     
        With Cn '==>Open connection
            .Provider = "Microsoft.Jet.OLEDB.4.0"
            .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
                & ThisWorkbook.Path & "\DATA.xlsx" & ";Extended Properties=""Excel 12.0;HDR=YES;"""
            .Open
          Rs.Open Sql, Cn, 1, 3 'execution de la requête
            With Sheets("Feuil1")
                i = SerchXls(.Range("A:A"), .Range("A1"), ID, True) 'Recherche la lige de ID
                If i = 0 Then Cn.Close: Exit Sub 'ID pas trouvé
                    If Rs.EOF Then Rs.AddNew 'Si la requête ne touve pas ID alors nouvel enregistrement
                    For C = 0 To Rs.Fields.Count - 1
                        Rs.Fields(Trim(.Cells(1, "A").Offset(0, C))) = .Cells(i, "A").Offset(0, C) 'charges les valeur dans le recordset
                    Next
                    Rs.Update 'met à jour le record set
            End With
            .Close
        End With
    End Sub
     
     
    Function SerchXls(Myrange As Range, MyCellule As Range, strRecherche, EntierCell As Boolean) As Long '
    On Error Resume Next
    SerchXls = 0
       SerchXls = Myrange.Cells.Find(What:=strRecherche, After:=MyCellule, LookIn:=xlFormulas, LookAt _
            :=Array(xlPart, xlWhole)(Abs(EntierCell)), SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
            False, SearchFormat:=EntierCell).Row
      If SerchXls <= MyCellule.Row Then SerchXls = 0
    End Function

  13. #13
    Futur Membre du Club
    Homme Profil pro
    électricien
    Inscrit en
    février 2021
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : électricien
    Secteur : Bâtiment

    Informations forums :
    Inscription : février 2021
    Messages : 19
    Points : 5
    Points
    5
    Par défaut
    Excellent. Merci pour les commentaires !
    Je comprends mieux le fonctionnement.

    Par contre, j'ai toujours une

    Erreur d'exécution '-2147352571 (80020005)':
    Le type ne correspond pas.


    et l'exécution s'arrête sur le ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Rs.Fields(Trim(.Cells(1, "A").Offset(0, C))) = .Cells(I, "A").Offset(0, C)
    As-tu activé une nouvelle référence dans la bibliothèque VBA ?

    Je ne vois ce qui n'est pas déclaré ou ce qui est déclaré avec un mauvais type!

  14. #14
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    juin 2019
    Messages
    609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : juin 2019
    Messages : 609
    Points : 937
    Points
    937
    Par défaut
    je ne comprends pas ou ce trouve le problème, j'ais cherché sur internet mais c'est pas probant!

    non je n'est pas ajouté de référence.

    j'ai apporté des modification dans le doute!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    Option Explicit
    Private Sub Test()
    MajXls ThisWorkbook.Sheets("Feuil1").Range("J1") 'Appel Sub MajXls en lui fournissan la valeur de JI en paramettre ID
    End Sub
     Sub MajXls(ID As String) 'procédure personnalisé avec passage de parametre ID!
    Dim Cn As New ADODB.Connection, Rs As New ADODB.Recordset, Sql As String, I As Integer, C As Integer 'Déclaration des variable
    'je séléctionne tous les champs de la table Feuil1$ don ID est égale au parmetre passé à la procédure MajXls ThisWorkbook.Sheets("Feuil1").Range("J1")
    Sql = "select * from [Feuil1$] WHERE ID=" & ID
     
        With Cn '==>Open connection
            .Provider = "Microsoft.Jet.OLEDB.4.0"
            .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
                & ThisWorkbook.Path & "\DATA.xlsx" & ";Extended Properties=""Excel 12.0;HDR=YES;"""
            .Open
          Rs.Open Sql, Cn, 1, 3 'execution de la requête
            With Sheets("Feuil1")
                I = SerchXls(.Range("A:A"), .Range("A1"), ID, True) 'Recherche la lige de ID
                If I = 0 Then Cn.Close: Exit Sub 'ID pas trouvé
                    If Rs.EOF Then Rs.AddNew 'Si la requête ne touve pas ID alors nouvel enregistrement
                    For C = 0 To Rs.Fields.Count - 1
                        Rs.Fields(Trim(.Cells(1, "A").Offset(0, C).Value)) = .Cells(I, "A").Offset(0, C).Value 'charges les valeur dans le recordset
                    Next
                    Rs.Update 'met à jour le record set
            End With
            .Close
        End With
    End Sub
     
     
    Function SerchXls(Myrange As Range, MyCellule As Range, strRecherche, EntierCell As Boolean) As Integer '
    On Error Resume Next
    SerchXls = 0
       SerchXls = Myrange.Cells.Find(What:=strRecherche, After:=MyCellule, LookIn:=xlFormulas, LookAt _
            :=Array(xlPart, xlWhole)(Abs(EntierCell)), SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
            False, SearchFormat:=EntierCell).Row
      If SerchXls <= MyCellule.Row Then SerchXls = 0
    End Function

  15. #15
    Futur Membre du Club
    Homme Profil pro
    électricien
    Inscrit en
    février 2021
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : électricien
    Secteur : Bâtiment

    Informations forums :
    Inscription : février 2021
    Messages : 19
    Points : 5
    Points
    5
    Par défaut
    J'ai trouvé d'où vient le bug.
    Mais je ne parvient pas à la corriger.

    En fait dans la colonne ''NP'' il n'y a que des chiffres et j'ai mis tes lettre pour tester. Il semble que la procédure plante pour cela.
    Si je mets un On error resume next le code ne plante plus mais ne fais pas la mise à jour de cette colonne. C'est fou ce truc !!!!

    Est-ce que tu sais comment corriger le bug ?

    En dehors de ça, il marche nickel !!!
    Je te remercie sincèrement pour ton aide.

  16. #16
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    juin 2019
    Messages
    609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : juin 2019
    Messages : 609
    Points : 937
    Points
    937
    Par défaut
    En fait le type de champ dans Rs.Fields est défini par les 8 première valeurs de la colonne. Si ce sont des valeurs numériques alors Rs.Fields(NP) prend que du numérique ! Désolé !

    Petite précision :
    Contrairement à Excel, les bases de données ont toutes les champs {colonnes} typés.

    Vue que ce n'est pas le cas pour Excel c'est ADODB qui si col par apprentissage. Donc si il y a plusieurs numérique de suite la colonne est numérique et n'accepte pas du texte.

    La norme dit 8 lignes mais par expérience je sais que c'est 3!

  17. #17
    Futur Membre du Club
    Homme Profil pro
    électricien
    Inscrit en
    février 2021
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : électricien
    Secteur : Bâtiment

    Informations forums :
    Inscription : février 2021
    Messages : 19
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Je te remercie pour ton retour Thumb down.

    Par contre, j'ai toujours un problème qui est peut-être lié ou pas au dernier poste (#16).
    1. J'ai des colonnes qui ne sont pas remplie et qui se remplissent au fur et à mesure de l'utilisation par les USER du programme.
    2. Quand je fais mettre à jour les données, ça bug.

    Là, j'ai mis en pièce jointe les fichier de mon programme.
    Est-ce que quelqu’un peut parcourir le code et me dire si le bug vient de moi ou si ça vient du format de colonne qui es définir par Excel ?
    Fichiers attachés Fichiers attachés

  18. #18
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    juin 2019
    Messages
    609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : juin 2019
    Messages : 609
    Points : 937
    Points
    937
    Par défaut
    bonjour,
    le problème vient du fait que les entête de colonnes sur la ligne N°1 des feuilles DATA sont différentes! attention je ne parle pas de l'ordre mais du fait qu'une ou plusieurs entête de AIS_Budget_1.0.1.11-SQL bug.xlsm n'existe pas dans AIS_BudgetDATA.xlsx!

    vérifies l'existence de toutes les colonnes dans les deux fichier!

  19. #19
    Futur Membre du Club
    Homme Profil pro
    électricien
    Inscrit en
    février 2021
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : électricien
    Secteur : Bâtiment

    Informations forums :
    Inscription : février 2021
    Messages : 19
    Points : 5
    Points
    5
    Par défaut
    Bonjour Thumb down,

    Je viens de vérifier les deux fichiers. Mais, les en-tête de colonne dans les deux classeurs-feuille DATA sont pourtant similaire.
    Selon le msgbox que j'ai inséré voir ci-dessous, le problème est à la colonne 149 (colonne ET) !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    Sub MajXls(ID As String) 'procédure personnalisé avec passage de parametre ID!
     'On Error Resume Next
    Dim Cn As New ADODB.Connection, Rs As New ADODB.Recordset, SQL As String, I As Integer, C As Integer 'Déclaration des variable
    'je séléctionne tous les champs de la table Feuil1$ don ID est égale au parmetre passé à la procédure MajXls ThisWorkbook.Sheets("Feuil1").Range("J1")
    SQL = "select * from [DATA$] WHERE ID=" & ID
     
        With Cn '==>Open connection
            .Provider = "Microsoft.Jet.OLEDB.4.0"
            .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
                & ThisWorkbook.Sheets("Parametres").Range("B3") & ";Extended Properties=""Excel 12.0;HDR=YES;"""
            .Open
          Rs.Open SQL, Cn, 1, 3 'execution de la requête
            With ThisWorkbook.Sheets("DATA")
                I = SerchXls(.Range("BR:BR"), .Range("BR1"), ID, True) 'Recherche la lige de ID
                If I = 0 Then Cn.Close: Exit Sub 'ID pas trouvé
                    If Rs.EOF Then Rs.AddNew 'Si la requête ne touve pas ID alors nouvel enregistrement
                    For C = 0 To Rs.Fields.Count - 1
                        On Error GoTo erreur
                        Rs.Fields(Trim(.Cells(1, "A").Offset(0, C).Value)) = .Cells(I, "A").Offset(0, C).Value 'charges les valeur dans le recordset
                        
                       GoTo suivant
    erreur:
                        MsgBox C
    suivant:
                    Next
                    Rs.Update 'met à jour le record set
            End With
            .Close
        End With
    End Sub

  20. #20
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    juin 2019
    Messages
    609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : juin 2019
    Messages : 609
    Points : 937
    Points
    937
    Par défaut
    le problème vient dur Trim(.Cells(1, "A").Offset(0, C).Value) ! trim suprime les espaces!

    comme il y avait un problème d'espaces j'ai fais un trim mais vue qu'il y a un espace dans les deux fichier alors problème!


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    trim("Doc_trans_AA " ) est <> de "Doc_trans_AA " 
     Rs.Fields(Trim(.Cells(1, "A").Offset(0, C).Value)) = .Cells(I, "A").Offset(0, C).Value
    idéalement il faut supprimer les espaces au début et a la des entête "Doc_trans_AA_" !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. mise à jour d'un fichier excel
    Par aefmaaradji dans le forum VBScript
    Réponses: 2
    Dernier message: 25/06/2010, 09h40
  2. Réponses: 1
    Dernier message: 07/12/2009, 22h50
  3. [XL-2000] Mise à jour d'un fichier excel à partir d'un autre
    Par jejedelbarro dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 21/04/2009, 18h28
  4. Mise à jour d'un fichier excel par un autre
    Par Homer091 dans le forum Excel
    Réponses: 3
    Dernier message: 13/06/2008, 14h45
  5. mise à jour d'un fichier excel à partir d'un textbox
    Par hachdotnet dans le forum Windows Forms
    Réponses: 2
    Dernier message: 13/03/2007, 15h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo