Bug dans ma macro
david3434
Messages postés
31
Statut
Membre
-
david3434 Messages postés 31 Statut Membre -
david3434 Messages postés 31 Statut Membre -
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 !
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 !
3 réponses
-
yg_be Messages postés 23437 Date d'inscription Statut Contributeur Dernière intervention Ambassadeur 1 588
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é.-
-
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. -
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 ! -
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. -
-
-
yg_be Messages postés 23437 Date d'inscription Statut Contributeur Dernière intervention Ambassadeur 1 588
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? -
yg_be Messages postés 23437 Date d'inscription Statut Contributeur Dernière intervention Ambassadeur 1 588
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-
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- 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
-
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
-