Simplifer macro2

J'ai une soluce un peu tiré par les cheveux mais ça devrait fonctionner.... et on ne rigole pas

Sub num1()

Sheets("BASE DE SAISIE").Select
If ActiveSheet.FilterMode = True Then ActiveSheet.ShowAllData
Range("AL24", Range("AL5470").End(xlUp)).Select
Dim Cel As Range
For Each Cel In Range("AL24", Range("AL5470").End(xlUp))

' feuil1
If Cel = "hubert@excel.fr" Or Cel = "gubert@excel.fr" Then
Cel.Offset(, -37).Value = ("1")
ElseIf Cel = "josianne@excel.fr" Or Cel = "josiane@excel.fr" Then
Cel.Offset(, -37).Value = ("2")

End If

Next Cel

Call num2
End Sub

Sub num2()
Range("A24", Range("A5470").End(xlUp)).Select
Dim Cel As Range
For Each Cel In Range("A24", Range("A5470").End(xlUp))

' feuil1
If Cel = "1" Then
Cel.Offset(, 37).Value = ("hubert@excel.fr")
ElseIf Cel = "2" Then
Cel.Offset(, 37).Value = ("josianne@excel.fr")
End If

qu'en penses-tu?

et dans ce cas là je modifie ta macro comme ceci...

Sub numequipe()
Dim Cel As Range
Dim Agt As Integer
Dim AgentNom, AgentPseudo

   Application.ScreenUpdating = False

   AgentNom = Array("hubert@excel.fr", "josianne@excel.fr", "frank", "nicolas", "théo", "phillip.morice@excel.fr", "jean neymard", "david adata", "isa belle", "jean néplin")
   AgentPseudo = Array("1", "2", "3", "4", "5", "LO-C1", "LO-C2", "LO-C3", "LO-C42", "LO-C5")

   With Sheets("BASE DE SAISIE")
      .Activate
      If .FilterMode = True Then .ShowAllData

      For Each Cel In Range("AL24", Range("AL" & Rows.Count).End(xlUp))
         If Cel <> "" Then
            For Agt = LBound(AgentNom) To UBound(AgentNom)
               If AgentNom(Agt) = Cel Then
                  .Cells(Cel.Row, "A") = AgentPseudo(Agt)
                  Exit For
               End If
            Next Agt
         Else
            .Cells(Cel.Row, "A").ClearContents
         End If
      Next Cel
   End With
   Sheets("Feuil1").Activate
End Sub

Bonjour ric,

Donc l'adaptation que j'ai faite de ta macro ne fonctionne pas.

Je n'ai pas de message d'erreur mais les données ne sont pas correctement choisies.

le mois est bon mais pas l'agent.

ne comprenant pas a quoi sert exactement Ubound et Lbound j'ai supprimé la ligne mais ça n'a rien amélioré

Bonjour,

LBound(AgentNom) = le 1er item de la liste AgentNom > et Ubound(AgentNom) = le dernier item de la liste AgentNom > donc la boucle passe d'item en item du premier au dernier...

"Sub numequipe()" sert à actualiser la colonne A ( N° équipe ) de la feuille "BASE DE SAISIE" > en comparant l'information de la colonne "AL" avec la liste AgentNom > si identique > copy le "N° équipe" (AgentPseudo) dans la colonne A de la ligne correspondante > si la cellule de "AL" est vide > le code videra la cellule en colonne A de la ligne correspondante ...

Donc ta version de la macro "Sub numequipe()" fonctionne bien > je l'ai testé ...

Pour faire le test > efface les "N° équipe" (colonne A) de la feuille "BASE DE SAISIE" et lance "numequipe" > la colonne A sera actualisée ...

En cliquant sur le gros bouton en jaune "Tous les agents" de la Feuil1 > "Sub Essai3" est lancé > dès le début "Call numequipe" est appelé afin d'actualiser le "N° équipe" (colonne A) lié à l'adresse de courriel (colonne AL) > avant de poursuivre le transfert des données dans les "block-agents" de Feuil1 et Feuil2 ...

Dois-je comprendre que les données ne se transfèrent plus dans les "block-agents" ?

ric

alors j'ai effacé les données colonne "A" (en ayant supprimer tous les filtres), j'ai lancer la macro "essai 3" via le bouton tous les agents "feuill1".

ça rempli bien les cases "A" mais la sélection de l'agent se fait sur une case vide.

je n'ai pas de message d'erreur le bloc AG_1 "hubert" est rempli de 0 dans les cellules, AG_2 n'est pas rempli ni AG_6

Dans essai3 j'ai retiré la dernière ligne "If Wb.FilterMode = True Then Wb.ShowAllData" afin de pouvoir constater quels filtre avait été selectionnés pour le transfert des données et c'est comme ça que j'ai vu que la dernière commande(et peut être première aussi) filtrait sur janvier et sur l'agent vide. donc si agent vide les cellules remplies avec des zéros c'est normal, mais pourquoi????

Bonjour,

Je crois que c'était à ta demande que le traitement ne se fasse que pour le mois sélectionné > ce mois peut être choisi de 2 façons ...

1- par le menu déroulant situé au-dessus du bouton "Tous les agents"

2- en feuille "Macro" cellule "B7" ...

ric

Non le problème ne vient pas de là.

je viens d'essayer le mois de mai en le sélectionnant avec le menu déroulant, la cellule b7 de la feuille macro se modifie donc pas de souci, je regarde dans la base de saisie ce qui a été filtré et là je constate que le mois de mai est bon, qu'il sélectionne un agent vide ( donc sans n°attribué) dans la colonne "A" et qu'il colle les données filtrées dans le blocagent AG_1 du moi de mai.

donc ça ne correspond plus.

Bonjour,

Est-ce possible que tu m'envois le dernier fichier >> celui qui ne fonctionne plus ?

Tu peux me le passer via message privé s'il contient des données sensibles ...

ric

je reviens demain.

je vois ça.

merci ric

Bonjour ric,

Je sais d'où vient l'erreur mais je ne sais pas comment la corriger.

Comme je l'avais écris je ne souhaitais pas que des données permettant de faire fonctionner la macro soit sur la feuille base de saisie donc j'avais effacé les données dans "AQ", "AR" et "AS" seulement voilà dans la macro "essai3" pour chercher le numéro associé à l'agent la macro fait la recherche dans la colonne "AS" que j'ai effacée car "AS" représente des informations que j'ai déjà dans la colonne "A" à partir de "A24" grâce à la macro "numequipe"

voici (je pense) la cause du problème

J'ai donc remis les numéros dans "AS1, AS2, AS3,.....etc" pour vérifier cette théorie et ça fonctionne sauf que maintenant il ne fait que le premier agent.

Pour ma part j'aimerai qu'il aille chercher les numéro d'agent dans la colonne "A" à partir de "A24"

Je te joins le fichier comme prévu pour que tu puisses constater par toi même

Bonjour,

Un autre essai ...

La macro gère les 10 blocs agents de Feuil1 et Feuil2 ...

J'ai changé les 2 dernières cellules (ligne 855 et 856) de la colonne H afin de pouvoir tester sur 2 autres agents dont leurs résultats sont en Feuil2 > bloc3 et bloc4

J'ai aussi ajouté la condition que si leurs résultats sont à 0 > les 0 ne s'inscrivent pas dans les blocs agent ...

Je reste disponible ...

ric

Bonjour ric,

ça fonctionne parfaitement merci par contre j'avoue qu'il y a certains détails que je ne comprends pas....

J'ai changé les 2 dernières cellules (ligne 855 et 856) de la colonne H afin de pouvoir tester sur 2 autres agents dont leurs résultats sont en Feuil2 > bloc3 et bloc4

Je n'ai rien trouvé dans les cellules H855 et H856, elles sont vides...

J'ai aussi ajouté la condition que si leurs résultats sont à 0 > les 0 ne s'inscrivent pas dans les blocs agent ...

Merci bien.

Cette partie de la macro "essai3" est un peu abstraite pour moi surtout le create object et mondico.keys.

Qu'est-ce que c'est???

   Set MonDico = CreateObject("Scripting.Dictionary")
   a = Wb.Range("A24:A" & Wb.[A65000].End(xlUp).Row)   ' tableau a(n,1) pour rapidité
   For i = LBound(a) To UBound(a)
      If a(i, 1) <> "" Then MonDico(a(i, 1)) = ""
   Next i
   '--avec tri
   MaListeAgent = MonDico.keys

Je ne comprends pas trop la macro "tri" . je suppose que c'est pour éviter les lignes en doublons (comme tu l'as écris) mais quelles sont les réf de recherche de doublons... ça, ça me dépasse.

je suppose que le trie se fait par rapport à la colonne "A" et "B" vu qu'il y a /2 donc si je mets /4 à la place de /2, ça ira jusqu'à "D"...c'est ça???

Sub Tri(a, gauc, droi) ' Quick sort '' << trier sans doublon
Dim ref, g, d, temp

  ref = a((gauc + droi) \ 2)
  g = gauc: d = droi
  Do
     Do While a(g) < ref: g = g + 1: Loop
     Do While ref < a(d): d = d - 1: Loop
     If g <= d Then
        temp = a(g): a(g) = a(d): a(d) = temp
        g = g + 1: d = d - 1
     End If
   Loop While g <= d
   If g < droi Then Call Tri(a, g, droi)
   If gauc < d Then Call Tri(a, gauc, d)
End Sub

Merci ric

Bonjour

Je n'ai rien trouvé dans les cellules H855 et H856, elles sont vides...

Je devais être encore en train de rêver à la voisine > je voulais dire AL (adresse de courriel) et je constate que je n'ai pas conservé ces 2 changements qui ne servaient en fait qu'à avoir des numéros d'agent différents afin de vérifier si les blocs-agent des Feuil1 et Feuil2 se remplissaient aux bons endroits ...

Cette partie de la macro "essai3" est un peu abstraite pour moi surtout le create object et mondico.keys.
Qu'est-ce que c'est???
Set MonDico = CreateObject("Scripting.Dictionary")
a = Wb.Range("A24:A" & Wb.[A65000].End(xlUp).Row) ' tableau a(n,1) pour rapidité
For i = LBound(a) To UBound(a)
If a(i, 1) <> "" Then MonDico(a(i, 1)) = ""
Next i
'--avec tri
MaListeAgent = MonDico.keys

Je fais lire la colonne A (de la ligne 23 jusqu'à la fin) afin d'en extraire la liste des numéros (ou pseudo) agents ...
Lecture de la plage > ne conservant que les données en éliminant les cellules vides
Code provenant du site de Jacques Boisgontier http://boisgontierjacques.free.fr > une référence incontournable ...

Je ne comprends pas trop la macro "tri" . je suppose que c'est pour éviter les lignes en doublons (comme tu l'as écris) mais quelles sont les réf de recherche de doublons... ça, ça me dépasse.
je suppose que le trie se fait par rapport à la colonne "A" et "B" vu qu'il y a /2 donc si je mets /4 à la place de /2, ça ira jusqu'à "D"...c'est ça???

Sub Tri(a, gauc, droi) ' Quick sort '' << trier sans doublon
Dim ref, g, d, temp
ref = a((gauc + droi) \ 2)
  g = gauc: d = droi
  Do
     Do While a(g) < ref: g = g + 1: Loop
     Do While ref < a(d): d = d - 1: Loop
     If g <= d Then
        temp = a(g): a(g) = a(d): a(d) = temp
        g = g + 1: d = d - 1
     End If
   Loop While g <= d
   If g < droi Then Call Tri(a, g, droi)
   If gauc < d Then Call Tri(a, gauc, d)
End Sub

Ce code tri sans doublon les données de la plage soumise ...
J'avoue savoir l'utiliser > mais pas vraiment l'expliquer > l'évolution de mon cerveau n'est pas encore rendu là ...

Les deux codes bout à bout : extraire en supprimant les vides > trier > supprimer doublons ...

ric

Bonsoir ric,

Désolé pour la réponse tardive.

je considère ce sujet résolu grâce à toi et je t'en remercie grandement ceci-dit j'ai une dernière question lorsque tu écris...

J'avoue savoir l'utiliser > mais pas vraiment l'expliquer > l'évolution de mon cerveau n'est pas encore rendu là ...

est-ce que ça confirme ma supposition ...

je suppose que le trie se fait par rapport à la colonne "A" et "B" vu qu'il y a /2 donc si je mets /4 à la place de /2, ça ira jusqu'à "D"...c'est ça???

Merci pour tous

Bonjour

je suppose que le trie se fait par rapport à la colonne "A" et "B" vu qu'il y a /2 donc si je mets /4 à la place de /2, ça ira jusqu'à "D"...c'est ça???

Non non > point du tout > Call Tri(MaListeAgent, LBound(MaListeAgent), UBound(MaListeAgent))

MaListeAgent est la liste des agents détectés dans la colonne A sans les cellules vides > ni les doublons ...

La colonne A (partie plage de données) contient 833 cellules vides et pas vides > mais une fois les cellules vides et les doublons enlevés > il n'en reste que 4 dans le fichier exemple ...

   Set MonDico = CreateObject("Scripting.Dictionary")
    '' placer dans
   a = Wb.Range("A24:A" & Wb.[A65000].End(xlUp).Row)   ' tableau a(n,1) pour rapidité
   For i = LBound(a) To UBound(a)
      If a(i, 1) <> "" Then MonDico(a(i, 1)) = ""
   Next i

LBound(MaListeAgent) = 1 > le premier item de la liste ...

UBound(MaListeAgent) = nombre de cellules non vides de la colonne A > le dernier item de la liste ...

Puis le tri va les trier dans l'ordre ...

Rendu dans la macro Tri > le contenu de "MaListeAgent" et transféré dans la variable tableau a ...

Le contenu de "MaListeAgent" = 4 items (les cellules non vides et sans doublons de la colonne A) ...

Il y en aura 10 pour le fichier exemple > et je présume qu'il y en aura plus sur le fichier de travail ...

LBound(MaListeAgent) = 1 > est transféré dans la variable "gauc" ...

UBound(MaListeAgent) = 4 > est transféré dans la variable "droi" ...

"ref = les 4 noms ((1 + 4) \ 2" >> "\" cette barre inversée veut dire "Modulo" > qui sert à détecter si un nombre est pair ou impair ...

g = gauc = 1 > et d = droi = 4

Puis les boucles plus difficiles que celles des lacets de mes souliers ...

Il en ressort une liste triée ...

Je suis bien heureux que ton projet ait atteint un premier point de satisfaction ...

ric

Rechercher des sujets similaires à "simplifer macro2"