Bug dans ma macro

david3434 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention   -  
david3434 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

J'ai un problème avec mes macros que je n'arrive pas à résoudre. J'ai 4 types de macro, et pour chaque type il existe différents responsable de région.

J'ai donc commencé par faire une macro de chaque type et me suis ensuite assuré quelles fonctionnaient. J'ai ensuite dupliqué mes macros en changeant le responsable de région et les noms de magasins.

Mes macros sont donc exactement les mêmes excepté le nom du responsable de région et les noms magasins. Pourtant certaines fonctionnent et d'autres non.

Pour exemple, la macro dénommée "Données_décôtes_HS" fonctionne parfaitement alors que la macro dénommée "Données_décôtes_AB" bloque dès le 2e magasin sur la phrase "Then .PivotItems(Pi.Name).Visible = False"

Ci-dessous le lien du fichier :

https://mon-partage.fr/f/HDHcqHvH/


Je ne comprends vraiment pas quel est le problème et aurais besoin d'aide.

Merci d'avance !
A voir également:

3 réponses

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
bonsoir,
je vois que tu fais, par exemple:
For Each Pi In .PivotItems
        If Pi.Name <> "AILLANT/THOLON" Then .PivotItems(Pi.Name).Visible = False
        .PivotItems("AILLANT/THOLON").Visible = True
Next

je suggère de faire plutôt:
.PivotItems("AILLANT/THOLON").Visible = True
For Each Pi In .PivotItems
        If Pi.Name <> "AILLANT/THOLON" Then .PivotItems(Pi.Name).Visible = False
Next

ce sera plus rapide, et, surtout, cela évitera l'erreur que tu obtiens parce que rend invisible le dernier élément sélectionné.
0
david3434 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour,

Ok merci je teste ça dans la matinée. Pourrais-tu m'expliquer précisément ce que ça change. Je commence à peine les macros et j'ai souvent du mal à retranscrire le langage VBA.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > david3434 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention  
 
tu parcourais la pivottable, et, pour chaque ligne, tu faisais deux actions: tu déactivais la ligne si ce n'était pas le bon magasin, et, ensuite, tu activais la ligne du bon magasin.
j'ai modifie pour faire ainsi:
- activer la ligne du bon magasin
- parcourir la pivottable, et, pour chaque ligne, déactiver la ligne si ce n'est pas le bon magasin.
ta logique était un peu moins rapide (comme tu activais inutilement plusieurs fois le bon magasin), et, surtout, ne fonctionnait pas car tu arrivais dans la situation où tu déactivais la seule ligne active.
si tu regardes bien les différences entre les deux codes, j'ai simplement sorti une instruction de la boucle for each, puisque cette instruction ne dépendait pas de l'indice de boucle (Pi); Et j'ai mis cette instruction avant la boucle, pour éviter de se retrouver sans ligne active.
0
david3434 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention   > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
J'ai quasiment tout compris merci ! Il me reste juste deux interrogations :

- que signifie "l'indice de boucle (Pi)"
- comment puis-je me retrouver sans ligne active dans une macro alors que pour une autre je n'ai pas le problème. En effet, toutes mes macros sont faites de la même façon mais certaines marchent et d'autres non. C'est vraiment là que je bloque et que j'ai du mal à comprendre la logique.
Peux-tu me donner un exemple concret où je me retrouve sans ligne active que j'aille voir comment cela se produit exactement. Ca m'évitera ainsi de reproduire l'erreur

J'attaque les modifications de mes macros pour tester la nouvelle formule

Merci pour le temps passé à m'aider !
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > david3434 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention  
 
eh bien, l'exemple est simple, c'est toi qui l'a donné avec Données_décôtes_AB.
tout va bien dans ta première boucle avec "AILLANT/THOLON".
quand tu commences ta seconde boucle avec "BONNY/LOIRE", la situation est que seule la première ligne "AILLANT/THOLON" est active.
quand ta boucle commence à travailler sur cette première ligne, tu la déactives car elle est différente de "BONNY/LOIRE". Excel ne te laisse pas faire car cela ne laisserait aucune ligne sélectionée.
Tu as donc l'erreur quand seule la première ligne est sélectionnée
.
que signifie l'indice de boucle:
For Each Pi In .PivotItems
If Pi.Name <> "BONNY/LOIRE" Then .PivotItems(Pi.Name).Visible = False
.PivotItems("BONNY/LOIRE").Visible = True
Next.
Tu as une boucle (for each), avec laquelle tu parcours tous tes .PivotItems. Ta boucle (le code entre le for each et le next) est exécutée plusieurs fois, une fois pour chaque élément de .PivotItems. A chaque exécution, PI (que j'appelle l'indice de la boucle) prend la valeur d'un élément de .PivotItems.
Comme tu peux voir, la seconde instruction dans la boucle n'utilise pas Pi, fait en fait toujours la même chose. C'est donc préférable de l'exécuter une seule fois hors de la boucle. Et avant la boucle, pour éviter de déactiver la seule ligne active.
0
david3434 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention  
 
Parfait ! tout fonctionne merci bcp !
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
peux-tu être plus précis "ça fait déconner ma macro car elle ne retrouve pas le nom des magasins en question"
message d'erreur, sur quelle ligne?
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
suggestion:
ajouter une fonction:
Function magasinpresent(pi As PivotItems, magasin As String) As Boolean
Dim ligne As PivotItem
On Error GoTo absent
Set ligne = pi(magasin)
magasinpresent = True
Exit Function
absent:
magasinpresent = False
End Function

que tu pourrais utiliser en remplacant ceci:
With ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotFields("Mag" _
        )
        For Each pi In .PivotItems
        If pi.Name <> "AUXERRE" Then .PivotItems(pi.Name).Visible = False
        .PivotItems("AUXERRE").Visible = True
        Next
               
    End With
    
    NumSemaine = Cells(1, 2).Value
    Mag = Cells(2, 2).Value
    NomFichier = "Top Ventes S" & NumSemaine & " - " & Mag
    
    Range("A" & Rows.Count).End(xlUp).Select
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
    Filename:="R:\Démarques\Stop Gaspi\PDF\REGION HS\" & NomFichier
    

par cela:
Sheets("Top Ventes").Activate
magasin = "AUXERRE"
With ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotFields("Mag")
    If magasinpresent(.PivotItems, magasin) Then
        For Each pi In .PivotItems
            If pi.Name <> magasin Then .PivotItems(pi.Name).Visible = False
            .PivotItems(magasin).Visible = True
        Next
        NumSemaine = Cells(1, 2).Value
        Mag = Cells(2, 2).Value
        NomFichier = "Top Ventes S" & NumSemaine & " - " & Mag
        
        Range("A" & Rows.Count).End(xlUp).Select
        ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
        Filename:="R:\Démarques\Stop Gaspi\PDF\REGION HS\" & NomFichier
    End If
End With
0
david3434 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour,

Désolé de répondre aussi tard mais j'étais débordé.
J'aimerais vraiment comprendre ce qui change entre les 2 versions.

Dans la première j'ai :

If pi.Name <> "AUXERRE" Then .PivotItems(pi.Name).Visible = False
.PivotItems("AUXERRE").Visible = True

Et j'ai bien compris que s'il ne trouve pas Auxerre alors la macro se mets en débogage

Dans la deuxième j'ai :

magasin = "AUXERRE"

Pourquoi dans ce cas ça marcherait s'il ne trouve pas non plus le non

Quelle est la différence entre les 2 ? J'essaie ça dans la semaine je suis à court de tps en ce moment.

Merci beaucoup pour le coup de main
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > david3434 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention  
 
dans la deuxième, il y a en plus:
If magasinpresent(.PivotItems, magasin) Then
,
qui va éviter de travailler sur les magasins sans données.
par ailleurs, je pense que tu peux énormément simplifier ton code, et éviter d'avoir le même code pour chaque magasin. c'est pour préparer cela que je me suis arrangé pour n'avoir plus qu'une seule fois le nom du magasin
0
david3434 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention  
 
Ah d'accord je vois. Oui je sais bien mais ce que je fais vu mon niveau c'est que je pique des macro existantes que je modifie afin de pouvoir les utiliser dans mes fichiers.

Pour l'instant j'avais tout simplement enlevé le magasin pour lequel je n'avais pas de donnée ^^
J'ai 2,3 dossiers urgents mais dès que j'ai un peu de temps je modifie ma macro avec l'exemple ci-dessus. Faut vraiment que je m'achète un bouquin sur le langage VBA
0