Excel vba - pas de bug... mais pas d'action
Résolu/Fermé
A voir également:
- Excel vba - pas de bug... mais pas d'action
- Bug yahoo mail - Accueil - Mail
- Liste déroulante excel - Guide
- Tubidy film d'action telecharger - Télécharger - TV & Vidéo
- Si et excel - Guide
- Aller à la ligne excel - Guide
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
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+
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+
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
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+
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+
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
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
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
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 :
A+
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+
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
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
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
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
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
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+
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+
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
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
21 oct. 2009 à 13:59
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