Comment "rafraichir" = concat

Bonjour,

Le tableur joint contient un module permettant via "concat" d'afficher sur une ligne les libellés d'une colonne.

Le souci est que lorsque je modifie l'affichage de la colonne par un filtre....le résultat sur la ligne reste inchangé.

En creusant un peu....j'ai découvert qu'en faisant un copier/collet de la colonne filtrée sur une nouvelle colonne (qui est la zone de concat) la mise à jour se fait. Cette solution passerait donc par une macro

Est-il possible de modifier le code pour avoir l'affichage sur une ligne ....des éléments de la colonne après filtrage et qui se mette à jour automatiquement ?

Cordialement

Tonthon

Bonjour,

Changer ta fonction par..

Function concat(champ)
   temp = ""
   For Each d In champ
     If Len(d.Value) > 0 And Not d.Rows.Hidden Then temp = temp & d.Value & ";"
   Next d
   concat = temp
End Function

A+

Note : Ta plage n'est pas juste

Bonjour,

Tu les veux dans quelle celllule les adresses concat ?

C'est quoi le but final ?

A te relire

Salut Dan,

Super, c'est exactement ce que je recherchais .

Pour répondre à ta question, c'est pour un fichier national d'une association avec environ 250 adhérents sur lequel il y a un filtre par région, par type d'adhérents.....et l'idée est de pouvoir faire un copier de cette colonne "adresses mail"..

puis ouvrir un logiciel de messagerie et de faire un coller en face de pour.......

ainsi le secrétaire peut envoyer un mail "info" à un ensemble d'adhérents qu'il a ciblé par filtrage.

Sauf erreur de ma part, je n'ai jamais vu l'équivalent et cela va être super pratique. (j'avais fait des essais sur ma messagerie)

En espérant avoir été clair, sinon reviens vers moi.

Cordialement

Tonthon

Re,

Hum...comment dire ?

J'ai remplacé le module par le dernier dans mon tableur dédié à l'association qui est beaucoup plus lourd.

Quand j'ai tous les adhérents ==> c'est ok

Quand je filtre une région, j'ai #VALEUR qui s'affiche dans la cellule où j'ai "=concat(M12:M303)"

sachant que M12:M303 correspond bien à ma colonne avec les adresses mails

MAIS quand je fais double-clic sur la cellule X1 où se trouve le "=concat(M12:M303)" cela me sélectionne la colonne

puis avec ENTREE...s'affiche bien que les mails correspondant à la sélection

donc, cela me donne l'impression qu'il manque un petit truc dans le code "que fait le double-clic" ==> sélectionner la colonne puis l'effet de l'entrée qui fait apparaitre les mails

Tu pourrais revoir ?

Cordialement

Tonthon

Re,

Sais pas si c'est à moi que tu demande de revoir ?

En tout cas, j'ai retesté le code sur ton classeur test et je ne suis pas parvenu à le faire planter.

le classeur de travail contient du code dans les évènement de feuilles ?

re,

Attention c'est Lhermite qui t'a donné le code et non moi ....

Sinon je me doutais que c'est ce que tu voulais faire.

Vois ce lien et charge le fichier Envoi mail-4 en page 2. C'est cela que tu veux je pense --> Envoi mail

A voir en fonction de ta messagerie évidemment

A te relire

lermite a écrit :

Re,

Sais pas si c'est à moi que tu demande de revoir ?

En tout cas, j'ai retesté le code sur ton classeur test et je ne suis pas parvenu à le faire planter.

le classeur de travail contient du code dans les évènement de feuilles ?

Bonsoir Lermite.

C'est pareil pour moi ! Le tableur "forum" fonctionne à merveille mais la solution transposée dans le tableur réel créé le bug évoqué.

Pour faire simple, je joins le tableur réel en le rendant anonyme et il reproduit bien le souci évoqué et je suis incapable de trouver d'où cela vient.

Si tu pouvais voir ....

Cordialement

Tonthon


Dan a écrit :

re,

Attention c'est Lhermite qui t'a donné le code et non moi ....

Sinon je me doutais que c'est ce que tu voulais faire.

Vois ce lien et charge le fichier Envoi mail-4 en page 2. C'est cela que tu veux je pense --> Envoi mail

A voir en fonction de ta messagerie évidemment

A te relire

Re

J'ai suivi ton conseil....et malgré tous mes efforts, je ne vois pas le fonctionnement de ce tableur et par conséquent je suis incapable de le transposer dans le mien que j'ai joint (idem qu'avec l'envoi précédent.)

En pratique, un simpe copier/coller de la colonne avec les adresses dans ma messagerie fonctionne très bien automatiquement (Thunderbird) mais pas en Windows Live Mail qui fonctionne avec adresse;adresse; adresse; ......d'où ma toute première demande.

Si ce post, répond à cette question, pourrais-tu la transposer dans le tableur "réel" joint

Cordialement

Tonthon

10tableur-reel.zip (54.57 Ko)

Bonjour

Une solution a tester

2 modifications

Dans ta procédure Private Sub Worksheet_SelectionChange(ByVal Target As Range)

avant le End Sub rajoutes Calculate

    Range("J2").ClearContents                           ' On efface les critères
  End If

 Calculate

End Sub

Autre modification

Dans la fonction concat(champ)

En début rajoutes Application.Volatile

Function concat(champ)
 Application.Volatile
  temp = ""

Bonjour Bansai64

J'essaie de mettre en place tes modifs....

Pour la fonction

actuellement c'est =concat(M12:M303)

tu me dis de mettre avant l'application Volatile et j'ai fait t ="";concat(M12:M303) mais c'est pas ça

Tu pourrais m'indiquer la fonction à insérer

Dans ta procédure Private Sub Worksheet_SelectionChange(ByVal Target As Range)

avant le End Sub rajoutes Calculate

Là, j'ai bien compris l'ajout à faire....mais comment accède-t-on dans la bonne procédure ?

J'ai fait "explorateur" ctrl+R....mais je ne retrouve pas ce que tu indiques.....le plus simple peut-être que tu l’insères et me renvoie le tableur.....et je verrais où c'était à faire ?

T'en remerciant par avance

Tonthon

Bonjour tout le monde,

Concernant l'erreur avec la fonction "Concat"

C'est normal que tu ai une erreur, elle génère une action circulaire avec l'évènement Selection_Change, c'est pourquoi lorsque tu resélectionne la cellule X1 + ENTER ça fonctionne vu que l'évènement n'est plus actif.

Pour y remédier..

Supprime la formule dans X1

Ajouter 3 fois la ligne

   Range("X1") = concat(Me.Range("M12:M303"))

Pour te repérer dans la sub...

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

  ' la plage "surveillée"
  If Not Application.Intersect(Target, Range("B2:B4,C1:E4")) Is Nothing And Target.Count = 1 Then

    Application.ScreenUpdating = False                  ' Bloque le raffraichissement écran
    On Error Resume Next                                ' Indique si une erreur ne t'arrête pas
    ActiveSheet.ShowAllData                             ' libère le filtre
    On Error GoTo 0                                     ' Rétablit la gestion des erreurs
    If Target = "(Tous)" Then
    Range("C11:C" & Range("C" & Rows.Count).End(xlUp).Row).AutoFilter
    Range("X1") = "" '**************** ICI *********************
    Exit Sub                                         ' Si on a choisit (Tous) on quitte le programme
    End If

    Range("J2") = "=V12=" & Right(Target.Value, 2)      ' critère : V12 c'est la 1ère ligne de la base de donnée REGIONS

    Range("J9") = Right(Target.Value, 2)
                                                        ' c'est pour le report du choix région dans le cadre n.adhérents pour 1 région
    Range("A11:W" & Range("A" & Rows.Count).End(xlUp).Row).AdvancedFilter Action:=xlFilterInPlace, _
        CriteriaRange:=Range("J1:J2"), Unique:=False    ' Le tableau commence en A8 et finit en W....
    Range("J2").ClearContents                           ' On efface les critères
    '**************** ICI *********************
    Range("X1") = concat(Me.Range("M12:M303"))
  End If

  If Not Application.Intersect(Target, Range("C2")) Is Nothing Then
    On Error Resume Next                                ' Indique si une erreur ne t'arrête pas
    ActiveSheet.ShowAllData                             ' libère le filtre
    On Error GoTo 0                                     ' Rétablit la gestion des erreurs
    Range("J2") = "=A12=" & Target.Address              ' critère : A12 c'est la 1ère ligne de la base de donnée
    Range("A11:W" & Range("A" & Rows.Count).End(xlUp).Row).AdvancedFilter Action:=xlFilterInPlace, _
    CriteriaRange:=Range("J1:J2"), Unique:=False
    Range("J2").ClearContents                           ' On efface les critères
    '**************** ICI *********************
    Range("X1") = concat(Me.Range("M12:M303"))
  End If

    If Not Application.Intersect(Target, Range("B2")) Is Nothing Then
    On Error Resume Next                                ' Indique si une erreur ne t'arrête pas
    ActiveSheet.ShowAllData                             ' libère le filtre
    On Error GoTo 0                                     ' Rétablit la gestion des erreurs
    Range("J2").Formula = "=COUNTIF(A12,""=B*"")"       ' critère : A12 c'est la 1ère ligne de la base de donnée"
    Range("A11:W" & Range("A" & Rows.Count).End(xlUp).Row).AdvancedFilter Action:=xlFilterInPlace, _
    CriteriaRange:=Range("J1:J2"), Unique:=False
    Range("J2").ClearContents                           ' On efface les critères
    '**************** ICI *********************
    Range("X1") = concat(Me.Range("M12:M303"))
End If

End Sub

Et la fonction est changée en...

Function concat(champ As Range) As String
Dim d As Range, temp as string
    Application.EnableEvents = False
    For Each d In champ
        If Len(d.Value) > 0 And Not d.Rows.Hidden Then temp = temp & d.Value & ";"
    Next d
    concat = temp
    Application.EnableEvents = True
End Function

Ça répond déjà a ta première question et sans "Artifice".

Tu dis...

Et tu devrais déclarer les variables non seulement c'est plus clair mais ça évite beaucoup d'erreurs.

14tableur-reel.zip (53.48 Ko)

Bonjour

Voir si ce fichier fonctionne avec les modifications citées dans mon message précédent

Bonjour Banzai,

Obliger de te répondre sur le forum vu que ta boite MP est déconnectée.

La solution avec Calculate ne fait que "CACHER" la référence circulaire sans y remédier,

J'en veux pour preuve, mettre un point d’arrêt sur Calculate et vérifier l'état de la cellule X1

et pour info..

Référence du développeur Excel

Application.Volatile, méthode

Cette méthode marque comme volatile une fonction personnalisée. Une fonction volatile doit être recalculée chaque fois qu'un calcul est effectué dans une cellule quelconque de la feuille de calcul. Une fonction non volatile n'est recalculée qu'en cas de changement des variables d'entrée. Cette méthode est sans effet si elle ne se trouve pas à l'intérieur d'une fonction définie par l'utilisateur utilisée pour calculer une cellule de feuille de calcul.

Cordialement.

Bonjour

Pas trop le temps

extrait de l'aide

Une formule qui fait référence à sa propre cellule directement ou indirectement, est appelée référence circulaire

Et à aucun cas la fonction concat n'entre dans cette catégorie

Enlèves calculate

Fais un filtre

Places toi dans une cellule vide et appuies sur suppression

Tu verras que concat se calcule très bien,

Mon avis c'est que c'est bien un problème de recalcul après le filtre, car celui-ci ne (ou ne semble pas) crée un évènement

Au fait j'ai un mail qui fonctionne comme pour les MP (bien sur pas les mêmes options)

Banzai64 a écrit :

extrait de l'aide

Une formule qui fait référence à sa propre cellule directement ou indirectement, est appelée référence circulaire

Oui, et quand je tourne autour d'un rond-point je fais aussi un mouvement circulaire, je n'ai d'ailleurs pas parlé de "Référence circulaire" mais "d'action circulaire".

Et pour être plus précis quand une fonction change une cellule l'évènement WorkBook_Change est généré et quand l’évènement se termine et que le processus revient dans la fonction le pointeur de pile est déstabilisé, ceci uniquement avec les fonctions perso appelée par la feuille.

Banzai64 a écrit :

Au fait j'ai un mail qui fonctionne comme pour les MP (bien sur pas les mêmes options)

Oui, je l'ai déjà employé mais tu ne répond pas ?

Cordialement.

Bonjour

Sujet clos

Bonjour,

Je ne retrouve pas ma réponse effectuée ce matin.....

Désolé pour mon retard mais actuellement j'ai un planning chargé.

Concrètement, j'ai donc fait un copier/coller du code dans mon tableur réel issu de

- Tonthon tableur réel v001

==> le souci évoqué reste....(peut-être y-a-t-il des macros à recopier ?)

- Ton classeur en retour

==> cela fonctionne en réel tout comme celui retourné

Donc c'est ok , sauf qu'en clicquant sur TOUS, je n'ai pas les adresses mails -tout comme dans le retour-

Je pense qu'il s'agit d'un petit "truc" à rajuster puisque le reste marche bien

Sur le plan technique

Cela me dépasse, quand j'en saurais plus je creuserais ces échanges.

Mille merci à tous, dès que j'aurai le retour avec TOUS qui affiche les adresses... je pourrais clore

Cordialement

Tonthon

Cordialement

Tonthon

Re,

Sur le classeur que j'ai posté toutes les adresses mail sont réaffichées ?

Mais peut-être..

supprimer la ligne

    Range("C11:C" & Range("C" & Rows.Count).End(xlUp).Row).AutoFilter

Dans

    If Target = "(Tous)" Then
'    Range("C11:C" & Range("C" & Rows.Count).End(xlUp).Row).AutoFilter
    Range("X1") = "" '**************** ICI *********************
    Exit Sub                                         ' Si on a choisit (Tous) on quitte le programme
    End If

qui ajoute un nouveau filtre

Tu dis..

Re

J'ai supprimé la ligne selon tes indications mais les mails correspondant au filtre TOUS ne s'affichent pas.

Sauf erreur de ma part, au chargement du tableur "retour", nous avons bien toutes les adresses mail pour TOUS

Ensuite quelque soit le filtre retenu... une région, pt etc.....je retrouve bien les adresses mail correspondants au filtrage mais lorsque je reviens sur TOUS ==> cellule vide

J'ai essayé différents scénarios mais rien ne permet de "réactiver" TOUS.

Peut-être une piste pour toi, il me semble que le fait de cliquer sur TOUS fait quitter le "programme" donc logiquement on sortirait de ce que tu as mis en place...

A te lire

je crois avoir compris ce que tu veux dire..

Les Mail ne s'affiche plus dans la cellule "concat" ??

Si oui.. remplace la ligne

    Range("X1") = "" '**************** ICI *********************

par

    Range("X1") = concat(Me.Range("M12:M303"))

Note que c'était voulu, j'ai pensé qu'avec tous tu ne devais pas avoir cette donnée.

Tu dis.

Rechercher des sujets similaires à "comment rafraichir concat"