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 :

Creer BOUTON pour remplacer les valeurs d'une colonne par des correspondances [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Inscrit en
    mai 2009
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : mai 2009
    Messages : 25
    Points : 10
    Points
    10
    Par défaut
    Bonjour à tous,

    J’aimerai un code qui permettrai remplacer les valeurs de la colonne A par celle de la colonne C (Tableau correspondance2) en se basant uniquement sur Les 05 premiers caractères le colonne A ; s’il n’a pas de correspondance, se baser sur les 02 premiers caractères de la colonne A.

    BREF
    j'aimerai, avoir un bouton '' conversion" par exemple qui remplacera directement les valeurs de la feuille données par celle des correspondances,d’où un code en VBA.

    Merci.TEST_CORESPOND.xlsx

    premier test.

    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
    Sub remplacer()
    drligne = Range("a" & Rows.Count).End(xlUp).Row
    With Sheets(3)
        drligne_corres = .Range("a" & Rows.Count).End(xlUp).Row
        For i = 2 To drligne
            valeur = Left(Range("a" & i), 5)
            For Z = 2 To drligne_corres
                If .Range("a" & Z) = valeur Then
                    Range("a" & i) = .Range("b" & Z)
                    Z = drligne_corres
                Else
                    If Z = drligne_corres Then
                        valeur = Left(Range("a" & i), 2)
                        For x = 2 To drligne_corres
                            If .Range("a" & x) = valeur Then Range("a" & i) = .Range("b" & x)
                        Next x
                    End If
                End If
            Next Z
        Next i
    End With
    Range("a:a").EntireColumn.AutoFit
    End Sub

  2. #2
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    septembre 2011
    Messages
    8 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : septembre 2011
    Messages : 8 200
    Points : 14 338
    Points
    14 338
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub test()
        Dim C As Range, Plage As Range, Corresp As Range, X As Range
        With Sheets("Feuil3")
            Set Corresp = .Range("A2", .Cells(.Rows.Count, 2).End(xlUp))
        End With
        With Sheets("Données")
            Set Plage = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp))
            For Each C In Plage
                If IsNumeric(Application.Match(Left(C.Value, 5), Corresp.Resize(, 1), 0)) Then
                    C.Value = Application.VLookup(Left(C.Value, 5), Corresp, 2, 0)
                End If
            Next C
        End With
    End Sub
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  3. #3
    Membre à l'essai
    Inscrit en
    mai 2009
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : mai 2009
    Messages : 25
    Points : 10
    Points
    10
    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
    Private Sub CommandButton2_Click()
     
    Dim ws, ws2 As Worksheet
    Dim objList As ListObject, objList2 As ListObject, objList3 As ListObject, objList23 As ListObject
    Dim Cell As Range
    Dim Result As Variant
     
        Application.ScreenUpdating = False
     
        Set ws = Worksheets("Données"): Set ws2 = Worksheets("feuil3")
        Set objList = ws.ListObjects(1): Set objList2 = ws2.ListObjects(1)
     
        With ws
            For Each Cell In objList.ListColumns(14).DataBodyRange
                Result = Application.VLookup(Cell.Value, objList2.DataBodyRange, 2, False)
                If IsError(Result) Then
                    Cell.Value = "Non Defini"
                Else
                    Cell.Value = Result
                End If
            Next Cell
     
        End With
     
        Set objList = Nothing: Set objList2 = Nothing
        Set ws2 = Nothing: Set ws = Nothing
     
    End Sub

  4. #4
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    septembre 2011
    Messages
    8 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : septembre 2011
    Messages : 8 200
    Points : 14 338
    Points
    14 338
    Par défaut
    Tu as autiste ? Réponds au moins quand on te propose une solution. Maintenant, ca m'étonnerait que ton code fonctionne sur le classeur mis en PJ.
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  5. #5
    Membre à l'essai
    Inscrit en
    mai 2009
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : mai 2009
    Messages : 25
    Points : 10
    Points
    10
    Par défaut
    bonsoir Daniel,
    ton code fonctionne si et seulement si les valeurs correspondantes sont existantes.

    pb:
    1) s'il n'y a pas de correspondance dans le tableau, il devrait lire uniquement les 02 premiers caractères et renvoyer la correspondance.

    2) ton code respecte la casse, j'aimerai qu'il ne respecte pas la casse.

    merci et désolé.

    ci joint un fichier d'exemple

    Copie de TEST_CORESPOND.xlsm

  6. #6
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    septembre 2011
    Messages
    8 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : septembre 2011
    Messages : 8 200
    Points : 14 338
    Points
    14 338
    Par défaut
    Est-ce que ton code est correct ou est-e que tu veux que je corrige le mien ?

    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
    Sub test()
        Dim C As Range, Plage As Range, Corresp As Range, X As Range
        With Sheets("Feuil3")
            Set Corresp = .Range("A2", .Cells(.Rows.Count, 2).End(xlUp))
        End With
        With Sheets("Données")
            Set Plage = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp))
            For Each C In Plage
                If IsNumeric(Application.Match(Left(C.Value, 5), Corresp.Resize(, 1), 0)) Then
                    C.Value = Application.VLookup(Left(C.Value, 5), Corresp, 2, 0)
                Else
                    C.Value = Application.VLookup(Left(C.Value, 2), Corresp, 2, 0)
                End If
            Next C
        End With
    End Sub
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  7. #7
    Membre à l'essai
    Inscrit en
    mai 2009
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : mai 2009
    Messages : 25
    Points : 10
    Points
    10
    Par défaut
    mon code fonctionne exactement comme le tien,

    si tu peux corriger le tien ou le mien ce serait parfait DANIEL.C

  8. #8
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    septembre 2011
    Messages
    8 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : septembre 2011
    Messages : 8 200
    Points : 14 338
    Points
    14 338
    Par défaut
    C'est fait, les messages se sont croisés. Ma réponse est la #6.
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  9. #9
    Membre à l'essai
    Inscrit en
    mai 2009
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : mai 2009
    Messages : 25
    Points : 10
    Points
    10
    Par défaut
    Bonjour DANIEL C,
    ton code fonctionne exactement comme je le veux.
    merci pour cette aide précieuse.

  10. #10
    Membre à l'essai
    Inscrit en
    mai 2009
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : mai 2009
    Messages : 25
    Points : 10
    Points
    10
    Par défaut
    Bonjour DANIEL,

    un petit soucis, quand je déplace par exemple les données de la colonne A pour la colonne Bde la feuille Données, dans le code, la ligne Set Plage = .Range("B2", .Cells(.Rows.Count, 1).End(xlUp))
    considère toutes les plages des colonne A et B alors qu'elle ne devrait considérer la colonne B

    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
    With Sheets("Données")
     
            Set Plage = .Range("B2", .Cells(.Rows.Count, 1).End(xlUp))
     
            For Each C In Plage
     
                If IsNumeric(Application.Match(Left(C.Value, 5), Corresp.Resize(, 1), 0)) Then
                    C.Value = Application.VLookup(Left(C.Value, 5), Corresp, 2, 0)
                Else
                    C.Value = Application.VLookup(Left(C.Value, 2), Corresp, 2, 0)
                End If
     
            Next C
     
        End With

  11. #11
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    septembre 2011
    Messages
    8 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : septembre 2011
    Messages : 8 200
    Points : 14 338
    Points
    14 338
    Par défaut
    Bonjour,

    Dans , "1" représente la colonne. Il faut donc mettre "2" qui représente la colonne B :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Plage = .Range("B2", .Cells(.Rows.Count, 2).End(xlUp))
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  12. #12
    Membre à l'essai
    Inscrit en
    mai 2009
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : mai 2009
    Messages : 25
    Points : 10
    Points
    10
    Par défaut
    Merci DANIEL.C pour l'explication.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/06/2014, 15h12
  2. Réponses: 4
    Dernier message: 04/05/2012, 18h23
  3. Réponses: 2
    Dernier message: 18/06/2009, 16h09
  4. requete SQL pour concatener les valeurs d'une colonne
    Par moabomotal dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/08/2007, 12h59
  5. requete pour compter les valeurs ds une colonne
    Par smariteau dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/02/2006, 18h37

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