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 :

Corriger une macro de mise à jour


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 30
    Points : 9
    Points
    9
    Par défaut Corriger une macro de mise à jour
    Bonjour à tous,

    Tout d'abord je voudrais remercier à nouveau ouskel'n'or pour son aide.

    En travaillant sur mon document, je me suis aperçu que la macro ne fonctionnait pas completement.
    En effet, mon fichier comporte dans la 1ère sheet, les colonnes suivantes :
    Colonne A : Voiture
    Colonne B : Référence
    Colonne C : Désignation
    ...
    Colonne G : Prix client.
    La seconde contient l'architecture suivante :
    Colonne A : Référence
    Colonne B : Code Barre
    Colonne C : Prix.
    La macro consistait à mettre à jour les prix de la sheet 1 par rapport à la sheet 2.
    Je rencontre deux soucis
    le premier est que la colonne qui contient les références est une chaîne de caractère. Voici quelques exemples :
    Référence CT250
    Référence CT2500
    Référence CT2501
    Référence CT2502
    Référence CT2503
    Lorsque je lance la macro, le prix de la référence CT250 va se mettre dans le prix de la référence CT2500. Donc erreur.
    Je n'arrive pas à trouver de solutions.
    Le second soucis est certaines références sont répétées plusieurs fois dans la Sheet 1 (certaines pièces se montent sur plusieurs véhicules). Or dans la sheet 2, la référence de la colonne A n'y est qu'une fois.
    Comment faire pour automatiser la recherche ?
    C'est à dire comment faire pour que la macro aille voir dans toutes les cellules de la colonne B (Sheet1) pour y recopier le prix chaque fois que cela est nécessaire.
    D'avance merci à tous.

  2. #2
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Salut,
    je pense que sans montrer ton code VBA, personne ne t'aidera car ton explication n'est intelligible qu'accompagnée du sujet en question.

    (\ _ /) Cordialement G@dz
    (='.'=)

    (")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.

  3. #3
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 30
    Points : 9
    Points
    9
    Par défaut Corriger une macro de mise à jour
    Effectivement, je comprends.

    Voici le code :

    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
    Sub RajoutCBdansOEM()
    Dim FL1 As Worksheet
    Dim FL2 As Worksheet
    Dim c As Range, cell As Range, DerLig1 As Long, DerLig2 As Long
        Set FL1 = Worksheets("feuil1")
        Set FL2 = Worksheets("feuil2")
        DerLig1 = FL1.Cells(FL1.Rows.Count, 1).End(xlUp).Row
        DerLig2 = FL2.Cells(FL2.Rows.Count, 1).End(xlUp).Row
        'Parcours de la feuil1, colonne B
        For Each cell In FL1.Range("B2:B" & DerLig1)
             With FL2.Range("B2:B" & DerLig2)
                  Set c = .Find(cell)
                  If Not c Is Nothing Then
                       'Rajout code barre dans Feuil2
                       ' c.offset = FL2 et cell.offset = FL1
                       c.Offset(0, 2).Value = cell.Offset(0, 2)
                  End If
              End With
         Next
        Set FL1 = Nothing
        Set FL2 = Nothing
    End Sub
    Merci d'avance.

  4. #4
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Bonjour,

    Pour le problème de références similaires CT250, CT2500, CT2501, etc... il faut lui préciser de rechercher la valeur exacte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set c = .Find(what:=cell, LookAt:=xlWhole)
    Pour poursuivre la recherche, il faut utiliser Find et FindNext.
    Il y a un bon exemple dans l'aide de VBA, essaye de l'appliquer à ton cas et reviens nous dire si tu coinces
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

  5. #5
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 30
    Points : 9
    Points
    9
    Par défaut Corriger une macro de mise à jour
    Bonjour, merci pour ton aide.

    J'ai trouvé l'exemple pour la fonction FindNext mais comme je commence dans le VBA, j'ai peur de ne pas tout comprendre.

    Voici l'exemple de l'aide VBA :

    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
    Dim objCell As Range, PremAdresse As String, PlageResult As Range
        
        With Range("A2:C21")
            Set objCell = .Find(What:="170", After:=ActiveCell, LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext)
            If Not objCell Is Nothing Then
                PremAdresse = objCell.Address
                Do
                    If PlageResult Is Nothing Then
                        Set PlageResult = objCell
                    Else
                        Set PlageResult = Application.Union(objCell, PlageResult)
                    End If
                    Set objCell = .FindNext(objCell)
                Loop While Not objCell Is Nothing And objCell.Address <> PremAdresse
            End If
        End With
    Dois je utiliser uniquement les parties coloriées en purple ou dois je prendre en compte aussi ce qui a au dessus.

    D'avance merci

  6. #6
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    En l'adaptant à ton code, cela devrait donner quelque chose comme ceci (à tester) :
    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
    Sub RajoutCBdansOEM()
    Dim FL1 As Worksheet, FL2 As Worksheet, PremAdresse As String
    Dim c As Range, cell As Range, DerLig1 As Long, DerLig2 As Long
     
    Set FL1 = Worksheets("feuil1")
    Set FL2 = Worksheets("feuil2")
    DerLig1 = FL1.Cells(FL1.Rows.Count, 1).End(xlUp).Row
    DerLig2 = FL2.Cells(FL2.Rows.Count, 1).End(xlUp).Row
     
    For Each cell In FL1.Range("B2:B" & DerLig1)
        With FL2.Range("B2:B" & DerLig2)
            Set c = .Find(What:=cell, LookAt:=xlWhole)
            If Not c Is Nothing Then
                PremAdresse = c.Address
                Do
                c.Offset(0, 2).Value = cell.Offset(0, 2)
                Set c = .Find(What:=c, LookAt:=xlWhole)
                Loop While Not c Is Nothing And c.Address <> PremAdresse
            End If
        End With
    Next
     
    Set FL1 = Nothing
    Set FL2 = Nothing
     
    End Sub
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

  7. #7
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 30
    Points : 9
    Points
    9
    Par défaut Corriger une macro de mise à jour
    Salut,

    Tu trouveras un petit fichier exemple de mon tableau, peux tu essayer le code pour comprendre ce qui se passe.

    Car avec le nouveau code cela donne la même chose. càd que par exemple les références AR620 et AR621 n'ont qu'une seule fois le prix indiqué (Feuil2).

    Bonne chance.
    Fichiers attachés Fichiers attachés

  8. #8
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Je traiterais le problème dans l'autre sens, à ce moment là pas besoin de FindNext
    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
    Sub Test()
    Dim FL1 As Worksheet, FL2 As Worksheet, PremAdresse As String
    Dim c As Range, i As Integer, DerLig1 As Long, DerLig2 As Long
     
    Set FL1 = Worksheets("feuil1")
    Set FL2 = Worksheets("feuil2")
    DerLig1 = FL1.Cells(FL1.Rows.Count, 1).End(xlUp).Row
    DerLig2 = FL2.Cells(FL2.Rows.Count, 1).End(xlUp).Row
     
    For i = 2 To DerLig2
        With FL1.Range("A2:A" & DerLig1)
            Set c = .Find(What:=FL2.Cells(i, 1), LookAt:=xlWhole)
            If Not c Is Nothing Then
                FL2.Cells(i, 2) = c.Offset(0, 1).Value
            End If
        End With
    Next
     
    Set FL1 = Nothing
    Set FL2 = Nothing
     
    End Sub
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

  9. #9
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 30
    Points : 9
    Points
    9
    Par défaut
    Je ne comprends pas après plusieurs tentatives la première référence AR620 n'avait pas de prix.

    Mais j'ai effacé une nouvelle fois les données puis j'ai relancé la macro et cela a fonctionné.

    Merci beaucoup.

    Je vais faire le test sur le vrai fichier qui est beaucoup plus lourd pour voir si tout marche bien.

    J'ai encore une question car mon fichier est un peu différent du test.

    Quelles sont les variables que je dois modifier car mon fichier a l'architecture suivante :
    Feuil1 = Colonne B (Référence) - Colonne C (Désignation) - Colonne D (Code Barre) - Colonne E (Prix)
    Feuil 2 = Colonne B (Référence) - Colonne C (Référence origine) - Colonne D (Code Barre) - Colonne E (Désignation) - ... - Colonne M (Prix).

    Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    For i = 2 To DerLig2
        With FL1.Range("A2:A" & DerLig1)
    Je dois juste changer "A2:A" par "B2:B". Mais dois je toucher "For i = 2"

    Après pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            Set c = .Find(What:=FL2.Cells(i, 1), LookAt:=xlWhole)
            If Not c Is Nothing Then
                FL2.Cells(i, 2) = c.Offset(0, 1).Value
            End If
    Quelles sont les variables à modifier ?

    D'avance merci beaucoup.

  10. #10
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Tu dois essayer de comprendre le fonctionnement de Cells(x, y) et de Offset(x, y) ce qui te permettrais d'adapter le code à ton fichier

    Cells(x, y) --> x = n° de ligne et y = n° de colonne

    Offset(x, y)
    x positif = décalage du nombre de ligne vers le bas
    x négatif = décalage du nombre de ligne vers le haut
    y positif = décalage du nombre de colonne vers la droite
    y négatif = décalage du nombre de colonne vers la gauche
    0 = pas de décalage

    Exemple
    Cells(5, 2) = cellule B5
    Cells(5, 2).Offset(0, 2) = cellule D5
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

  11. #11
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 30
    Points : 9
    Points
    9
    Par défaut Corriger une macro de mise à jour
    Je comprend bien le fonctionnement mais je ne te cache pas que c'est le
    avec la fonction "i" qui m'intrigue.

    J'essaye de comprendre par rapport à l'ancien code sa fonction et comprendre à quoi elle me sert et si je dois la modifier ou pas.

    Désolé pour ma lenteur de compréhension.

  12. #12
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 2 to 25
        FL2.Cells(i, 1)
    Next
    For i 2 to 25 --> boucle de 2 à 25
    Au premier passage de la boucle i = 2 donc Cells(i, 1) correspond à Cells(2, 1) --> cellule A2
    Au second passage de la boucle i = 3 donc Cells(i, 1) correspond à Cells(3, 1) --> cellule A3
    etc...jusqu'à ce que i = 25 donc Cells(i, 1) correspond à Cells(25, 1) --> cellule A25

    i correspond au numéro de la ligne et la boucle permet de passer en revue chaque ligne une à une. Dans ton cas ce n'est donc pas i que tu dois adapter mais le numéro de la colonne.
    Pense également à adapter le numéro de la colonne dans ta recherche de DerLig1 et DerLig2.
    Si je te donne la réponse toute cuite, je ne suis pas persuadé que tu comprendras le fonctionnement et lorsque tu te retrouveras avec un déplacement de ligne ou de colonne tu seras à nouveau coincé.
    Fais des essais sur un classeur avec quelques données, tu changes ces données de place et tu essaies d'adapter ton code, à force de bricoler tu finiras par comprendre le fonctionnement
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

  13. #13
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 30
    Points : 9
    Points
    9
    Par défaut Corriger une macro de mise à jour
    Merci pour ton explication.

    J'ai essayé plusieurs mouvements de lignes, colonnes et grâce à tes explications je comprends comment cela fonctionne.
    J'arrive à mettre à jour différentes colonnes et dans n'importe quel ordre.
    Mais il y a encore une chose que je n'arrive pas à trouver:
    Lorsque les colonnes "Référence" sont A (Feuil1 et 2), il n'y aucun problème.
    Mais dès que je les décale en B (Feuil1 et 2), cela ne marche pas

    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
    Sub Test()
    Dim FL1 As Worksheet, FL2 As Worksheet, PremAdresse As String
    Dim c As Range, i As Integer, DerLig1 As Long, DerLig2 As Long
     
    Set FL1 = Worksheets("feuil1")
    Set FL2 = Worksheets("feuil2")
    DerLig1 = FL1.Cells(FL1.Rows.Count, 1).End(xlUp).Row
    DerLig2 = FL2.Cells(FL2.Rows.Count, 1).End(xlUp).Row
     
    For i = 2 To DerLig2
        With FL1.Range("B2:B" & DerLig1)
            Set c = .Find(What:=FL2.Cells(i, 2), LookAt:=xlWhole)
            If Not c Is Nothing Then
                FL2.Cells(i, 5) = c.Offset(0, 3).Value
            End If
        End With
    Next
     
    Set FL1 = Nothing
    Set FL2 = Nothing
     
    End Sub
    Je pense que je me trompe sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set c = .Find(What:=FL2.Cells(i, 2), LookAt:=xlWhole)
    J'ai effectué plusieurs tentatives mais je ne trouve pas.

  14. #14
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Citation Envoyé par fring Voir le message
    Pense également à adapter le numéro de la colonne dans ta recherche de DerLig1 et DerLig2.
    A mon avis le problème provient de là, tu vérifies toujours la dernière ligne de la colonne A dans ton code alors que les références sont en colonne B, la dernière cellule de la colonne A (si il y en a une) n'est pas forcément sur la même ligne que la dernière cellule de la colonne B.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DerLig1 = FL1.Cells(FL1.Rows.Count, 2).End(xlUp).Row
    DerLig2 = FL2.Cells(FL2.Rows.Count, 2).End(xlUp).Row
    Je ne vois que ça comme problème, le reste du code me semble correct.
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

  15. #15
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 30
    Points : 9
    Points
    9
    Par défaut Corriger une macro de mise à jour
    Après la modification, il me semble que cela marche.

    Je vais faire des vérifications ce soir sur le gros fichier et j'espère que cela marchera bien.

    En tout cas, merci beaucoup pour ton aide.

Discussions similaires

  1. Réponses: 7
    Dernier message: 18/12/2013, 14h29
  2. Réponses: 3
    Dernier message: 06/12/2007, 11h09
  3. Lancement d'une macro après mise à jour d'une cellule
    Par Mukade dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 17/10/2007, 11h52
  4. Réponses: 8
    Dernier message: 09/01/2007, 16h30
  5. Optimisation d'une recherche et mise à jour
    Par gandf dans le forum C++Builder
    Réponses: 4
    Dernier message: 07/01/2005, 18h38

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