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

Résolu
mamie -  
 mamie -
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

5 réponses

  1. pilas31 Messages postés 1878 Statut Contributeur 648
     
    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
    1. mamie
       
      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
  2. pilas31 Messages postés 1878 Statut Contributeur 648
     
    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
  3. mamie
     
    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
  4. pilas31 Messages postés 1878 Statut Contributeur 648
     
    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
    1. mamie
       
      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
      1. mamie > mamie
         
        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
      2. pilas31 Messages postés 1878 Statut Contributeur 648 > mamie
         
        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
      3. mamie > pilas31 Messages postés 1878 Statut Contributeur
         
        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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. mamie
     
    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