Aide sur enchainement de macro

almas

XLDnaute Occasionnel
Bonjour le forum

j 'ai besoin de vos lumière car je bricole les codes VBA que vous m 'avez donné ou que j 'ai trouvé mais quand ça marche pas je coince faute à ma mon manque de connaissance en la matière:p

voila j 'ai adapté un code pour faire une recherche détaillé sur un type d'absence pour avoir le solde par ligne

cela marche parfaitement!:D

seulement j 'aimerai faire plusieurs recherche sur la même feuil

donc j 'ai dupliqué le code puis changer les plages mais c 'est pas si simple:(

en faite ça plante et je sais pas comment enchainer plusieurs code de suite et même si c 'est possible

Je joint un fichier test et si on supprime le code qui se trouve en "2eme recherche" ca marche bien mais que pour le 1er type

Donc si quelqu" un pouvais m aider sur ce coup et surtout que j 'essais de comprendre comment on peut enchainer plusieurs codes....

Merci d 'avance
 

Pièces jointes

  • test1.xls
    217.5 KB · Affichages: 30
  • test1.xls
    217.5 KB · Affichages: 31
  • test1.xls
    217.5 KB · Affichages: 30

vgendron

XLDnaute Barbatruc
Re : Aide sur enchainement de macro

Salut..

ouh laa...la bricole semble avoir créé pas mal de souci..
et comme je ne sais pas ce que tu cherches à faire..difficile..
en tout cas. je vois déjà quelques erreurs..ou bizarreries..

1) dans ta feuille "Détail Congés Agent"
je ne vois pas l'interet d'avoir deux listes (en E3 et E4) qui ne proposent qu'un choix chacune.. Congés.. ou ARTT.

2) Dans la macro:première ligne
Code:
  If Target.Address <> "$E$3" Then exit sub
avec ca.. aucune chance d'aller dans ta seconde recherche codée plus bas dans la macro..
si j'ai bien compris..
pour acceder à cette seconde recherche il faut cliquer/modifier sur la cellule E4 (Type ARTT)
or. le code ci dessus te dis que tu si cliques autre chose que E3 (Type Congés) alors. tu sors complètement de la macro. bref. tu court circuites tout ce qui est après..

il faut donc modifier cette première ligne pour permettre d'aller tester aussi la cellule E4
avec un goto
Code:
If Target.Address <> "$E$3" Then
    GoTo DeuxièmeRecherche
End If

et en rajouttant une ligne au bon endroit pour définir le label DeuxièmeRecherche
Code:
'code de la première recherche
'---------------2eme recherche-----------------------------------------------'
'ARTT
DeuxièmeRecherche:
If Target.Address <> "$E$4" Then Exit Sub
Application.EnableEvents = False
'suite code 2eme recherche

3) Ensuite.. (comme dirait l'autre.. et c'est pas fini... ;-)
quand je lance la macro, il me dit que le cel de la seconde recherche est déjà utilisée..
ok pour faire simple.. je modifie juste les noms.. le Cel de la première recherche devient Cel1, et celui de la seconde recherche devient Cel2
et là..

4) je vois un
Code:
For Each cel1 In plage
mais pas de Next Cel1

5) autre point. la plage est définie comme juste la cellule E2 (celle qui contient le nom de l'agent.. Franck)
s'il n'y a pas d'erreur sur la plage.. pourquoi faire un for each. vu que c'est une seule cellule?
en admettant.. je rajoutte le Next Cel1 manquant juste avant
Code:
 For Each sh In ActiveWorkbook.Sheets
        If sh.Name = k Then a = sh.Name: flag = 1: Exit For
    Next sh

6) point suivant
il y a un with sheets(k)....
mais pas de end with..
je le rajoutte juste avant ta deuxième recherche..


point général..
pour éviter d'oublier des sorties de boucle, il faut absolument travailler la présentation des macros.. ce qu'on appelle l'indentation..
décaler les lignes de codes par bloc

au final (temporaire parce que j'ai pas testé) ca donne
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
'1er recherche  congés
If Target.Address <> "$E$3" Then
    GoTo DeuxièmeRecherche
End If
Application.EnableEvents = False
tx = [E3]
lig = 8
[A8:G60].ClearContents
'Stop
Set plage = Sheets("détail congés agent").Range("E2")
For Each cel1 In plage
    flag = 0
    k = cel1.Value
    If k = "" Then Application.EnableEvents = True: Exit Sub
    'Stop
Next cel1
    For Each sh In ActiveWorkbook.Sheets
        If sh.Name = k Then a = sh.Name: flag = 1: Exit For
    Next sh
    If flag = 0 Then MsgBox ("La feuille " & k & " n'existe pas, Faire les modif nécessaires"): Application.EnableEvents = True: Exit Sub

With Sheets(k).[D16:D98]
    Set a = .Find(tx, LookIn:=xlValues)
    If Not a Is Nothing Then
        firstAddress = a.Address
        Do
            Cells(lig, 1) = Sheets(k).Cells(a.Row, 1)
            Cells(lig, 2) = Sheets(k).Cells(a.Row, 2)
            Cells(lig, 3) = Sheets(k).Cells(a.Row, 3)
            Cells(lig, 4) = Sheets(k).Cells(a.Row, 4)
            Cells(lig, 5) = Sheets(k).Cells(a.Row, 5)
            Cells(lig, 6) = Sheets(k).Cells(a.Row, 6)
            Cells(lig, 7) = Sheets(k).Cells(a.Row, 7)
            lig = lig + 1
            Set a = .FindNext(a)
        Loop While Not a Is Nothing And a.Address <> firstAddress
    End If
End With
'---------------2eme recherche-----------------------------------------------'
'ARTT
DeuxièmeRecherche:
If Target.Address <> "$E$4" Then Exit Sub
Application.EnableEvents = False
tx = [E3]
lig = 62
[A62:G120].ClearContents
'Stop
Set plage = Sheets("détail congés agent").Range("E2")
For Each Cel2 In plage
    flag = 0
    k = Cel2.Value
    If k = "" Then Application.EnableEvents = True: Exit Sub
    'Stop
Next Cel2
For Each sh In ActiveWorkbook.Sheets
    If sh.Name = k Then a = sh.Name: flag = 1: Exit For
Next sh
If flag = 0 Then MsgBox ("La feuille " & k & " n'existe pas, Faire les modif nécessaires"): Application.EnableEvents = True: Exit Sub

With Sheets(k).[D16:D98]
    Set a = .Find(tx, LookIn:=xlValues)
    If Not a Is Nothing Then
        firstAddress = a.Address
        Do
            Cells(lig, 1) = Sheets(k).Cells(a.Row, 1)
            Cells(lig, 2) = Sheets(k).Cells(a.Row, 2)
            Cells(lig, 3) = Sheets(k).Cells(a.Row, 3)
            Cells(lig, 4) = Sheets(k).Cells(a.Row, 4)
            Cells(lig, 5) = Sheets(k).Cells(a.Row, 5)
            Cells(lig, 6) = Sheets(k).Cells(a.Row, 6)
            Cells(lig, 7) = Sheets(k).Cells(a.Row, 7)
            lig = lig + 1
            Set a = .FindNext(a)
        Loop While Not a Is Nothing And a.Address <> firstAddress
    End If

End With
'End If

Application.EnableEvents = True
End Sub
 

almas

XLDnaute Occasionnel
Re : Aide sur enchainement de macro

déjà merci vgendron pour ces explications

ensuite ton code ne plante plus mais ne fait pas ce que je voulais :D

j 'ai compris pourquoi ca bouclais pas grasse à ton point 2!
en modifiant: le "E3" en "E4" j 'ai bien mes ARTT en 2eme partit de feuille
DeuxièmeRecherche:
If Target.Address <> "$E$4" Then Exit Sub
Application.EnableEvents = False
tx = [E4]


mais la ligne :GoTo DeuxièmeRecherche me shunt totalement la recherche des congés (recherche 1)

en faite au il me fraudais les lignes congés dans la 1er partit et les ligne artt dans la 2eme parti
mais ne peut on pas déclencher la 1er macro en sélectionnant "congés" en E3 et la 2eme en sélectionnant "ARTT" en E4 ? ou déclencher les 2 recherches à la suite avec saut de lignes?
je rejoint le fichier test (qui plante plus cette fois)
 

Pièces jointes

  • test1.xls
    222.5 KB · Affichages: 24
  • test1.xls
    222.5 KB · Affichages: 23
  • test1.xls
    222.5 KB · Affichages: 23
Dernière édition:

vgendron

XLDnaute Barbatruc
Re : Aide sur enchainement de macro

hé hé ;-)
depuis j'ai retravaillé ta macro et trèèèès simplifiée..
1) j'ai supprimé la deuxième case Type (E4)
2) donc j'ai modifié la liste de validation pour E3 pour permettre le choix entre congés et ARTT
3) j'ai modifié tes deux formules en I4 etI5 qui selon le choix fait se trouvait donc fausse..
4) en H62, idem, j'ai modifié..

et ci joint le fichier
 

Pièces jointes

  • test1.xls
    219.5 KB · Affichages: 34
  • test1.xls
    219.5 KB · Affichages: 30
  • test1.xls
    219.5 KB · Affichages: 27

almas

XLDnaute Occasionnel
Re : Aide sur enchainement de macro

ou la la ! effectivement c 'est beaucoup plus claire et c 'est ce que je voulais !
en plus j 'ai " à peut près" compris ce que tu a fait

du coup pour vérifier que j 'avais compris j 'ai rajouter une 3eme recherche :D

et ça MARCHE !!!

Mais voila je me dit que si je veux changer de colonnes entre 2 recherches comment je peut faire avec ton code ?
Cells(lig, 1) = Sheets(NomAgent).Cells(a.Row, 1)
Cells(lig, 2) = Sheets(NomAgent).Cells(a.Row, 2)
Cells(lig, 3) = Sheets(NomAgent).Cells(a.Row, 3)
Cells(lig, 4) = Sheets(NomAgent).Cells(a.Row, 4)
Cells(lig, 5) = Sheets(NomAgent).Cells(a.Row, 5)
Cells(lig, 6) = Sheets(NomAgent).Cells(a.Row, 6)
Cells(lig, 7) = Sheets(NomAgent).Cells(a.Row, 7)
lig = lig + 1
 

Pièces jointes

  • test1-2.xls
    220.5 KB · Affichages: 24
  • test1-2.xls
    220.5 KB · Affichages: 29
  • test1-2.xls
    220.5 KB · Affichages: 28

vgendron

XLDnaute Barbatruc
Re : Aide sur enchainement de macro

Si tu souhaites changer de colonne (source ou destination? parce que celle que tu as mises en rouge sont les sources)
il te suffit de remplacer par une variable que tu changes selon la recherche et au bon moment, comme c'est le cas pour la variable "lig"

la. il faudrait que tu en dises un peu plus sur ce que tu veux faire

Edit: la formule en H111
il faut je pense mettre = I5-G111
et en I5 mettre: =RECHERCHEV(L4;INDIRECT($E2&"!$M$16:$ab$34");13;FAUX)

sauf que la. ca renvoie 0 et donc. le solde est faux..Excel n'aime pas les heures négatives..
et comme je ne vois pas ou et comment tu définis les soldes...
 
Dernière édition:

almas

XLDnaute Occasionnel
Re : Aide sur enchainement de macro

oui effectivement j 'ai pas été très claire :p

je voulais dire par la que les donnée afficher depuis tableau source "D16 : D98" ne sois pas toujours dans le même ordres ou les mêmes dans les divers section( congés/ARTT/exceptionnel)
mais comme les lignes "Cells(lig, 1) = Sheets(NomAgent).Cells(a.Row, 1)" sont commune au 3 recherches pour l' instant la mise en page de chaque section est forcement identique

Alors que j 'aimerai avoir une mise en page différente entre les section( plus ou moins de colonnes ou données différentes)

je sais pas si cela est possible de faire référence à une série de ligne de code personnalisé en fonction du type choisis?
 

vgendron

XLDnaute Barbatruc
Re : Aide sur enchainement de macro

Tout est toujours possible avec VBA, et c'est ca qui est formidable.
la facon de faire dépend fortement de ce que tu veux exactement.
à la limite, ce qu'il faudrait pour adapter le code, c'est que tu créés un onglet "Résultat attendu"
avec les dites colonnes que tu souhaites et où tu les souhaites

voire même une liste des données que tu veux récupérer en fonction du type
par exemple
pour le type Congés, tu souhaites récupérer les données: Date Début, Date Fin, Nb Jour et N° semaine
pour le type ARTT, tu souhaites: Date Fin, Date Début, centième

etc etc
 

almas

XLDnaute Occasionnel
Re : Aide sur enchainement de macro

merci beaucoup Vgendron..je vais regarder ca.....bien que je sois limité en création de code (plus un bidouilleur :p).

Il faudrait prendre le problème par un autre bout directement pour faire ce que je voudrais....
 

Discussions similaires

Réponses
1
Affichages
301
Compte Supprimé 979
C

Statistiques des forums

Discussions
312 228
Messages
2 086 421
Membres
103 205
dernier inscrit
zch