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 :

Concaténer avec deux conditions [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre actif
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2011
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Juillet 2011
    Messages : 70
    Par défaut Concaténer avec deux conditions
    bonjour,
    voilà j'ai un bout de code qui fonctionne très bien sur une condition mais quand j'introduis la deuxième condition il ne se passe rien.
    je butte sur ce pb depuis deux jours sans rien comprendre.
    le but étant de concatener les cellules mail si celles ci ne soient pas vides et a la condition que la colonne G contienne un "x"
    merci de votre aide

    feuil1 colonne D = adresse mail
    feuil1 colonne G = "x" ou ""
    feuil2 cellule A20 = resultat de la concatenation
    la première condition est : Sheets("Feuil1").Range("D" & i).Value <> "".
    la deuxième condition est : And Sheets("Feuil1").Range("G" & i).Value = "x").

    test effectué sur Feuil1 ligne 7 à 11 D7,D8,D9,D11 mail D10 Vide G7,G9,G10,G11 x G8 Vide

    quand je lance la procédure il ne passe passe rien dans la cellule de destination

    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
    Sub ConcatenerTotalMailSousCondition()
     
    Dim i As Long
     
    Application.ScreenUpdating = False
     
    Sheets("Feuil2").Range("A20") = ""   ' cellule qui contiendra les mails concaténés
     
    For i = 2 To Sheets("Feuil1").Range("D20").End(xlUp).Row   ' de la cellule 2 a 20   D = colonne des mails
     
    If (Sheets("Feuil1").Range("D" & i).Value <> "" And Sheets("Feuil1").Range("G" & i).Value = "x") Then Sheets("Feuil2").Range("A20") = Sheets("Feuil2").Range("A20") & Sheets("Feuil1").Range("D" & i).Value & ";"
     
    Next
     
    Sheets("Feuil2").Range("A20") = Left(Sheets("Feuil2").Range("A20"), Len(Sheets("Feuil2").Range("A20")) - 2)
     
    Application.ScreenUpdating = True
     
     
     
    End Sub
    Comme d'habitude l'erreur doit être tellement évidente que je ne la vois pas .

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2002
    Messages : 110
    Par défaut
    pourquoi n’utilisez vous pas une formule direct dans votre feuille?
    ou a moins que se soit une bêtise de ma part

  3. #3
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 219
    Billets dans le blog
    2
    Par défaut
    Bonsoir,

    sur les cas d'opérateurs de comparaison sur du texte (=,<>, Like), VBA est sensible à la casse
    Par exemple "X" est différent de "x"
    C'est juste une piste, je ne sais pas s'il s'agit de ça

  4. #4
    Membre actif
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2011
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Juillet 2011
    Messages : 70
    Par défaut
    Citation Envoyé par tototiti2008 Voir le message
    Bonsoir,

    sur les cas d'opérateurs de comparaison sur du texte (=,<>, Like), VBA est sensible à la casse
    Par exemple "X" est différent de "x"
    C'est juste une piste, je ne sais pas s'il s'agit de ça

    bonjour,
    eh bien non ce n'est pas cela
    j'ai bien fait attention a la casse
    mais je vous remercie de votre réponse

  5. #5
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour


    Citation Envoyé par tototiti2008 Voir le message
    Bonsoir,

    sur les cas d'opérateurs de comparaison sur du texte (=,<>, Like), VBA est sensible à la casse
    Par exemple "X" est différent de "x"
    C'est juste une piste, je ne sais pas s'il s'agit de ça
    Oui et non. En fait, il y a une option dans VB (VBA, VB6 et même VB.net qui permet de définir un tant soit peu le mode de comparaison des chaînes de caractères

    C'est le mode par défaut. La comparaison se fait selon l'ordre déterminé par la table de caractères en vigueur. Dans ce cas, on peut dire sensible à la casse.

    La comparaison se fait selon l'ordre alphabétique, sans considération pour la casse. Les caractères accentués sont regroupés avec leur équivalent sans accent.

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour

    Bien qu'écrit un peu à la hussarde, ton code est correct en ce qui concerne la construction elle-même du contenu de la cellule de destination.
    Il y a par contre une maladresse dans ce que je pense vouloir être la suppression du dernier ";". c'est -1 et non -2.

    Tu t'en serais rendu compte toi-même si, en lieu et place de ce que mon petit doigt me souffle (tu as fait tes essais en ne mettant qu'un caractère dans les cellules en D), tu les avais faits avec de véritables adresses (et donc des chaines plus longues); tu aurais alors constaté qu'il manquait un caractère à la seconde chaine. Le même petit doigt me dit que tu n'es pas allé, en essais, au delà de deux cellules à prendre en considération (car tu te serais sinon rendu compte de ce que seule la dernière était tronquée).
    J'ai bon ?

  7. #7
    Membre actif
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2011
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Juillet 2011
    Messages : 70
    Par défaut
    Citation Envoyé par unparia Voir le message
    Bonjour

    Bien qu'écrit un peu à la hussarde, ton code est correct en ce qui concerne la construction elle-même du contenu de la cellule de destination.
    Il y a par contre une maladresse dans ce que je pense vouloir être la suppression du dernier ";". c'est -1 et non -2.

    Tu t'en serais rendu compte toi-même si, en lieu et place de ce que mon petit doigt me souffle (tu as fait tes essais en ne mettant qu'un caractère dans les cellules en D), tu les avais faits avec de véritables adresses (et donc des chaines plus longues); tu aurais alors constaté qu'il manquait un caractère à la seconde chaine. Le même petit doigt me dit que tu n'es pas allé, en essais, au delà de deux cellules à prendre en considération (car tu te serais sinon rendu compte de ce que seule la dernière était tronquée).
    J'ai bon ?

    bonjour,

    j'étais cavalier dans une vie antérieure ;-)

    pour ta première remarque le -1 a la place du -2 ne change rien pour le moment car je n'affiche aucun résultat dans la cellule cible.
    pour les cellules en colonne D elles contiennent ou pas des adresses mails ton petit doigt s'est planté ;-)

    merci pour ces pistes

  8. #8
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Ah ...
    Il se trouve que si tel est le cas (chaînes de plus d'un caractère) dans des cellules en colonne D avec des "x" en colonne G, le code montré fonctionne sans problème si l'on met -1 et non -2 pour supprimer le dernier ";". Je l'ai testé.
    Et regarde --->>
    Nom : arthur.JPG
Affichages : 329
Taille : 220,2 Ko
    C'est ton code avec pour seule modification le -1

  9. #9
    Membre actif
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2011
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Juillet 2011
    Messages : 70
    Par défaut
    Je te remercie de ton aide

    mais même en faisant un copier coller du code que j'ai fourni et en mettant bien -1 je n'arrive pas a voir le résultat en A20

    le même code sans la deuxième condition du "x" lui fonctionne très bien et me donne un résultat en A22

    je pige plus rien.

    je vais refaire complètement ce fichier test.

  10. #10
    Membre actif
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2011
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Juillet 2011
    Messages : 70
    Par défaut
    bonjour ou bonsoir

    je viens de trouver !!!!!!!

    j'ai bien fait le bouton de commande pour appeler la routine
    j'ai bien fait le code de la routine
    mais j'ai juste oublié d'appeler cette routine dans le code du bouton. oupppps

    me mettrais bien des baffes

    désolé de vous avoir embêter avec mon faux problème

    l'interface fauteuil / clavier a eu des ratés


    je vous remercie tous et plus particulièrement Unparia pour l'attention que vous avez apporté à mon post

  11. #11
    Membre actif
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2011
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Juillet 2011
    Messages : 70
    Par défaut
    je reviens vers vous

    j'ai adapté le 1° code a mon application
    et maintenant je me retrouve avec une erreur lors de l'éxecution de celui ci
    "erreur d'execution '5' :"
    "argument ou appel de procedure incorrect"

    la je pige plus : le 1° code sur fichier test est ok je fais un copier coller avec adaptation des données et hop cela plante sur la ligne apres le Next

    par contre si j'enlève la deuxième condition cela fonctionne

    un conseil, une piste merci


    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
    Sub Concatener_Mail_Detention()
     
    Dim i As Long
     
    Application.ScreenUpdating = False
     
    Sheets("DonnéesDiverses").Range("A51") = ""   ' cellule qui contiendra les mails concaténés  on la vide avant toute chose
     
    For i = 2 To Sheets("Données_Adhérents").Range("M3000").End(xlUp).Row   ' de la cellule 2 a 3000   M = colonne des mails
     
    If (Sheets("Données_Adhérents").Range("M" & i).Value <> "" And Sheets("Données_Adhérents").Range("DI" & i).Value = "x") Then Sheets("DonnéesDiverses").Range("A51") = Sheets("DonnéesDiverses").Range("A51") & Sheets("Données_Adhérents").Range("M" & i).Value & ";"
     
    Next
     
    Sheets("DonnéesDiverses").Range("A51") = Left(Sheets("DonnéesDiverses").Range("A51"), Len(Sheets("DonnéesDiverses").Range("A51")) - 1)
     
    Application.ScreenUpdating = True
     
    End Sub

  12. #12
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Qu'obtiens-tu en cellule de destination en n'exécutant pas cette ligne ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("DonnéesDiverses").Range("A51") = Left(Sheets("DonnéesDiverses").Range("A51"), Len(Sheets("DonnéesDiverses").Range("A51")) - 1)
    car le message d'erreur que tu reçois donne à penser qu'aucun article ne correspond aux 2 critères

  13. #13
    Membre actif
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2011
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Juillet 2011
    Messages : 70
    Par défaut
    Bonjour,

    merci de t'intéresser à mon problème.

    Il y a bien une adresse mail en M3 M8 et un x en DI3 DI8 de la feuille Données_Adhérents je devrais donc sortir l'adresse mail en A51 de la feuille DonnéesDiverses



    je viens de trouver ---> une erreur de casse entre le x et X

    je vais devoir trouver un caractère qui valide la condition et qui ne pose pas de problème de casse.


    me faut vraiment des vacances

    désolé de t'avoir de nouveau dérangé

  14. #14
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Il faut faire attention ...
    Bon
    tu n'auras pas de problème de casse en modifiant ta ligne de conditions de critères ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      If (Sheets("Données_Adhérents").Range("M" & i).Value <> "" And Ucase(Sheets("Données_Adhérents").Range("DI" & i).Value) = "X") then ...
    Fais attention : 2 corrections sont là.

  15. #15
    Membre actif
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2011
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Juillet 2011
    Messages : 70
    Par défaut
    Pas toujours évident de différencier un petit x d'un grand X quand il n'y a qu'un seul caractère dans la cellule

    merci encore pour ton attention et tes conseils

  16. #16
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 364
    Par défaut
    Bonsoir
    Pour éviter la casse (majuscules, minuscules), on peut aussi passer par Option Compare Text en tête de fenêtre (déjà proposé plus haut).
    La boucle sur les cellules peut aider à réduire les codes par rapport à celle des lignes ; comme avec cette macro écrite dans la fenêtre des codes de l’onglet Base * :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Option Compare Text
    Sub Concatener_Mail_Detention()
        Dim C As Range, Tx As String
        [A51] = ""
        For Each C In [Mail]   'plage des adresses mail nommée ainsi ("M2:M…”)
            If C <> "" And C(1, 101) = "x" Then Tx = Tx & C & “;”
        Next
        If Tx <> "" Then [A51] = Left(Tx, Len(Tx) - 1)   'éviter un texte vide
    End Sub
    *avec les données de la dernière macro fournie (pas de l’image)

    Avec des espaces abusifs mais invisibles, on a aussi LTrim, RTrim et Trim.
    Salut unparia, tu aurais pu aussi proposer par LCase .

  17. #17
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Salut Ordonc
    Salut unparia, tu aurais pu aussi proposer par LCase
    J'aurais personnellement carrément procédé de très différente manière, sans Ucase, ni Lcase, ni OptionCompare, ni obligation de "marquer" les choix en saisissant un caractère, ni même la nécessité d'une boucle sur la totalité des cellules
    Mais j'ai voulu délibérément intervenir sur le seul code de Arthur, tel qu'il était, pour ne pas le "perdre" en sa qualité manifeste de débutant.

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

Discussions similaires

  1. Linq - jointure avec deux conditions
    Par boby62423 dans le forum Linq
    Réponses: 1
    Dernier message: 02/04/2009, 09h51
  2. Recherche avec deux conditions et deux boucles?
    Par neiluj26 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 14/10/2008, 19h49
  3. ADO avec deux conditions WHERE
    Par MuadDib_II dans le forum IHM
    Réponses: 9
    Dernier message: 29/07/2008, 15h42
  4. MINUS avec deux conditions
    Par miketidy dans le forum SQL
    Réponses: 14
    Dernier message: 24/06/2008, 09h57
  5. [VBA-E] Countif avec deux conditions
    Par bonilla dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 04/09/2007, 15h30

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