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 -
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 !
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:
- Bug dans ma macro
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Jitbit macro recorder - Télécharger - Confidentialité
- Télécharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Bug chromecast - Guide
- Convertir chiffre en lettre excel sans macro ✓ - Forum Excel
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:
je suggère de faire plutôt:
ce sera plus rapide, et, surtout, cela évitera l'erreur que tu obtiens parce que rend invisible le dernier élément sélectionné.
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é.
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?
message d'erreur, sur quelle ligne?
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
suggestion:
ajouter une fonction:
que tu pourrais utiliser en remplacant ceci:
par cela:
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
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:
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
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
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
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.
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.
- 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 !
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.