1 votes

VBA intersect range ne devrait fonctionner que dans les feuilles ayant la plage cible définie mais contourne cette demande.

Afin de réinitialiser une liste déroulante enfant (liste déroulante 2 en fonction du choix effectué dans la liste déroulante 1), j'ai le code suivant dans "ThisWorkbook".

Il est censé effacer le contenu de la liste déroulante enfant si une cellule d'une plage spécifique (où se trouve la liste déroulante 1) change. Cela fonctionne bien sur la feuille où ce nom de plage existe (le nom de la plage est "RSTcabFINISHING").

ENJEU

sur n'importe quelle autre feuille (= feuille où ce nom de plage n'existe pas), ce code efface le contenu de n'importe quelles 3 cellules jusqu'à une cellule dont je change le contenu.

La solution serait de mettre le code uniquement sur la feuille qui en a besoin, je suppose. Mais (dites-moi si je me trompe) il semble plus logique de mettre le code dans "ThisWorkbook" puisque les feuilles ayant la plage décrite ci-dessus sont sujettes à être multipliées (=copie)...

Je ne suis pas sûr que tout cela ait un sens... Je suppose que la question est "que dois-je faire pour éviter que ce contenu de compensation ne se produise ailleurs que là où je le souhaite ?".

Merci.

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
'Initialize cabinet finishing board
On Error Resume Next
If Not Intersect(Target, Range("RSTcabFINISHING")) Is Nothing Then
    Application.EnableEvents = False
    Target.Offset(0, 1).Resize(, 3).ClearContents
End If

Exit Sub
End Sub

0voto

Jonno Points 20324

Ok, votre ou vos problèmes proviennent principalement de l'utilisation de On Error Resume Next .

  1. Votre instruction if produira une erreur si l'intervalle n'existe pas. Cela signifie qu'elle ne sera pas évaluée et qu'au lieu de cela, vous passerez à la ligne suivante à cause de resume next.

  2. Maintenant, ça va désactiver les événements. Ainsi, votre événement ne se déclenchera qu'une fois, puisque vous ne semblez jamais le réactiver.

  3. Maintenant, il effacera tout le contenu, sans avoir jamais testé que votre intersect était valide.

Donc, nous devons faire deux choses :

  1. Réparer l'évaluation
  2. Abandonnez l'option Application.EnableEvents = false, ou au moins corrigez-la. La plupart des événements ne sont soulevés que par l'utilisateur qui effectue des modifications plutôt que par le script VBA, donc vous pouvez probablement ignorer cela entièrement.

La meilleure façon de résoudre ce problème serait d'appeler une fonction plus sûre qui vérifie l'existence de la plage et renvoie vrai ou faux en fonction de ce résultat.

Quelque chose comme ceci pourrait vous être plus utile :

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    'Initialize cabinet finishing board
    If RangeExists("RSTcabFINISHING") Then          'See below for what this does. We only progress if we get true.
        If Not Intersect(Target, Range("RSTcabFINISHING")) Is Nothing Then
            Target.Offset(0, 1).Resize(, 3).ClearContents
        End If
    End If
End Sub

Function RangeExists(RangeName As String)
    On Error GoTo NotValid:             'If we fail, jump to "NotValid"
    If Range(RangeName).Rows >= 0 Then  'Test if the range exists - if it doesn't we'll get an error, if it does it
                                        'will have 0 or more rows
        RangeExists = True              'We didn't error and we do have 0 or more rows, so the function is true
    End If
    Exit Function                       'Break out of the function before we hit our error handler
NotValid:                               'We only get this far if an error was thrown (Range doesn't exist)
    RangeExists = False                 'Flag the function as false before returning
End Function

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X