Excel vba - pas de bug... mais pas d'action

Résolu/Fermé
mamie - 20 oct. 2009 à 23:03
 mamie - 22 oct. 2009 à 23:33
Bonjour,

voici mon code, qui je le precise ne bug pas, mais ne fait pas d'action (alors que normalement cela devrait!)
voir les IsError:

ANAsc = une cellule nommée qui contient une formule. Si la formule contient une erreur, alors...

... la plage nommée ANA doit être supprimée.

Il y a bien une erreur dans la cellule nommée ANAsc, mais pourtant VB passe dessus sans faire quoi que ce soit! Quelle est l'erreur? (les noms et leur référence sont corrects)


Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False

ActiveSheet.Copy After:=Sheets(Sheets.Count)
ActiveSheet.Name = "sauvegarde"
Sheets(Range("A1").Value).Activate

If IsError(["ANAsc"]) Then
Range("ANA").EntireRow.Delete

End If

If IsError(["AIBUSsc"]) Then
Range("AIBUS").EntireRow.Delete
End If
A voir également:

5 réponses

pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
21 oct. 2009 à 00:58
Bonsoir,

Difficile de comprendre exactement se qui se passe mais voici d'abord les syntaxes correctes pour désigner des plages nommées :

soit Range("AIBUSsc") soit tout simplement [AIBUSsc]

Ensuite il faut voir que quand la fonction s'éxécute et supprime une ligne c'est une nouvelle modification et donc elle se réexécute et provoque une erreur due à la création d'une feuille qui existe déjà c'est à dire "sauvegarde"

Bon il est un peu tard pour que j'aille plus loin mais voici ma première reflexion ...

A+
1
ouiiii merci pilas pour cette "reflexion" !

effectivement ma macro s'execute sur un changement dans la feuille.

mais le probleme est que cette macro créer un changement aussi (suppression de lignes). J'imagine donc que la macro se relance au premier changement!

que puis je faire pour que les changement qui decoulent de ma macro ne soient pas pris en compte (et que la macro se relance...???

merci
0
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
22 oct. 2009 à 14:45
Bonjour,

Pour la question la réponse est oui, les plages "s'adaptent" si on supprime des lignes en haut ou des colonnes à gauche d'un nom, la référence associée à ce nom évolue. Par contre si on supprime entièrement la ligne qui contient une référence nommée, le nom contient alors un "#REF" qui est en erreur.

Pour la question du post 5 je crois que l'erreur vient de la syntaxe qui n'est pas correcte à partir de
IsError("AENIAsc") qui doit être IsError(Range("AENIAsc"))

A+
1
me revoila ;-)

bon j'ai un peu modifié mon code. Mais j'ai une erreur ici (ligne en gras). Ce qui me rend dingue c'est que la plage AIBUS est bien supprimée, alors que c'est la ligne juste après l'erreur dans le code!!!

If IsError(Range("AIBUSsc")) Then
Range("AIBUS").EntireRow.Delete


aidez moi s'il vous plait
merci
0
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
21 oct. 2009 à 17:51
Bonjour,

Pour éviter que la fonction "s'appelle" elle-même dés qu'il y a une modification, il faut désactiver la gestion des événements au début puis réactiver à la fin.

Cette méthode comporte un risque :s'il y a un bug au milieu de la fonction, les événements restent désactivés. Voila pourquoi je conseille en cas d'erreur de renvoyer à la dernière instruction qui réactive de toute façon les événements.

Voila le schéma des instructions :

Application.EnableEvents = False
On Error GoTo FIN
...
...
FIN:
Application.EnableEvents = True
End Sub


A+
0
bonjour Pilas,

merci pour ta réponse, j'avance!

par contre je ne comprends pas pourquoi la suppression de ligne n'est effective uniquement que pour la premiere occurence IsError.

Pour le reste il n'y a pas d'action. Je précise que mes noms sont bien définis.

Tu as une idée? Voici mon code en entier (je n'ai pas encore essayé ta gestion des erreurs)
merci

Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
Application.EnableEvents = False
ActiveSheet.Copy After:=Sheets(Sheets.Count)
ActiveSheet.Name = "sauvegarde"
Sheets(Range("A1").Value).Activate

If IsError(Range("ENAsc")) Then
Range("ENA").EntireRow.Delete
Else

If IsError(Range("ARBUSsc")) Then
Range("ARBUS").EntireRow.Delete
Else

If IsError("AENIAsc") Then
Range("AENIA").EntireRow.Delete
Else

If IsError("DFSsc") Then
Range("DFS").EntireRow.Delete
Else

If IsError("DNAsc") Then
Range("DNA").EntireRow.Delete
Else

If IsError("EAVsc") Then
Range("EAV").EntireRow.Delete
Else

If IsError("ERCONTROLsc") Then
Range("ERCONTROL").EntireRow.Delete
Else

If IsError("FRQEUNTISsc") Then
Range("FRQUENTIS").EntireRow.Delete
Else

If IsError("HONEWELLsc") Then
Range("HONEWELL").EntireRow.Delete
Else

If IsError("INDRsc") Then
Range("INDR").EntireRow.Delete
Else

If IsError("NATMIGsc") Then
Range("NATMIG").EntireRow.Delete
Else

If IsError("NTSsc") Then
Range("NTS").EntireRow.Delete
Else

If IsError("NRACONsc") Then
Range("NRACON").EntireRow.Delete
Else

If IsError("SACsc") Then
Range("SAC").EntireRow.Delete
Else

If IsError("SLEXsc") Then
Range("SLEX").EntireRow.Delete
Else

If IsError("THAESsc") Then
Range("THAES").EntireRow.Delete

End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If

Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
0
mamie > mamie
21 oct. 2009 à 22:07
RE

j'ai modifié la macro car ma synthaxe etait fausse (je crois!). Il ne faut pas mettre de else!

bref cela ressemble a ca (je ne colle q'un bloc if ici pou te montrer):

If IsError(Range("AENAsc")) Then
Range("AENA").EntireRow.Delete
End If


Par contre cela ne résoud pas le problème expliqué dans mon dernier post... snif
0
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643 > mamie
22 oct. 2009 à 00:10
Bonsoir,

Non, suite à ta dernière correction (sur les else) je ne comprends pas pourquoi ça ne fonctionne pas. Si tous les else sont bien transformés en End if et si tous ces noms définis sont bien sur des lignes différentes...et tous dans ta feuille de départ.

Il faut quand même mettre le on error goto FIN au début et le FIN: juste avant les 2 dernières instructions. On ne sait jamais car sinon les événements ne marchent plus.

Sinon je n'ai pas d'idée pour le moment..

A+
0
mamie > pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020
22 oct. 2009 à 12:52
Petite question bête:

Est ce que quand je défini un nom ex: "ABC" qui renvoie à la page B1:C1,

si je supprime la ligne A la référence du nom s'adapte t elle automatiquement et devient A1:B1?

j'ai regardé l'evolution de mes noms après la suppression les lignes pour la zone "AIBUS" (cf mes derniers posts - première occurence avec IsError) et ils s'adapte bien (les références suivent les données en d'autres termes...).

Je poste ma macro entière ici si vous avez une idée par rapport à mon prroblème du post 5

merci


Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
Application.EnableEvents = False
ActiveSheet.Copy After:=Sheets(Sheets.Count)
ActiveSheet.Name = "sauvegarde"
Sheets(Range("A1").Value).Activate

If IsError(Range("AENAsc")) Then
Range("AENA").EntireRow.Delete
End If

If IsError(Range("AIBUSsc")) Then
Range("AIBUS").EntireRow.Delete
End If

If IsError("AENIAsc") Then
Range("AENIA").EntireRow.Delete
End If

If IsError("FSsc") Then
Range("FS").EntireRow.Delete
End If

If IsError("SNAsc") Then
Range("SNA").EntireRow.Delete
End If

If IsError("NAVsc") Then
Range("NAV").EntireRow.Delete
End If

If IsError("EUCONTROLsc") Then
Range("EUCONTROL").EntireRow.Delete
End If

If IsError("REQEUNTISsc") Then
Range("REQUENTIS").EntireRow.Delete
End If

If IsError("ONEYWELLsc") Then
Range("ONEYWELL").EntireRow.Delete
End If

If IsError("NDRAsc") Then
Range("NDRA").EntireRow.Delete
End If

If IsError("ATMIGsc") Then
Range("ATMIG").EntireRow.Delete
End If

If IsError("ATSsc") Then
Range("ATS").EntireRow.Delete
End If

If IsError("ORACONsc") Then
Range("ORACON").EntireRow.Delete
End If

If IsError("EACsc") Then
Range("EAC").EntireRow.Delete
End If

If IsError("ELEXsc") Then
Range("ELEX").EntireRow.Delete
End If

If IsError("TALESsc") Then
Range("TALES").EntireRow.Delete
End If

Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ouïe... j'ai honte... Quelle erreur!!!

effectivement il manquait le range( sur les lignes suivantes...!

Tout marche très bien maintenant :GENIAL !!!

je te remercie 1000 fois Pilas de m'avoir aidé! c'est adorable!

Très bonne soirée
0