Problème Excel : Macro et plage nommée

Résolu
Elodie -  
 Elodie -
Bonjour,

Sur une feuille Excel, j'avais ajouté une macro pour que lorsqu'on tapait "ok" dans une certaine case, une macro "boite" se lance.
Tout marchait très bien sauf que j'ai voulu nommer la plage de cellule pour pouvoir ajouter ou supprimer des colonnes sans que ça influe sur la première macro.
Or avec la plage nommé, la première macro ne marche plus...
Quelqu'un aurait-il une idée pour m'aider ???

La macro avec les plages non nommées :

Private Sub Worksheet_Change(ByVal Target As Range)

For k = 3 To Range("X65536").End(xlUp).Row

Select Case Range("X" & k)
Case "ok"
Call boite
End Select
Next k

End Sub

La macro avec les plages nommées :

Private Sub Worksheet_Change(ByVal Target As Range)

For k = 3 To Range("RFI_Received").End(xlUp).Row

Select Case Range("RFI_Received" & k)
Case "ok"
Call boite
End Select
Next k

End Sub

Merci de votre aide !
Elodie

2 réponses

  1. ccm81 Messages postés 11033 Statut Membre 2 434
     
    bonjour

    1. peut être comme ça
    La plage nommée est vue comme un tableau, et on accede à ses cellules avec cells(ligne,colonne) et sa première cellule apour coordonnées (1,1)

    Private Sub Worksheet_Change(ByVal Target As Range)  
    For k = 1 To Range("RFI_Received").rows.count  
      Select Case Range("RFI_Received").cells(k,1).value  
        Case "ok"  
          Call boite  
        End Select  
    Next k  
    End Sub 

    2. je ne comprends pas pourquoi tu as mis ce code dans Worksheet_Change sans tester Target (la plage ou se produit le changement)
    3. le select case avec une seule condition me parait un peu lour (un if suffirait)
    bonne suite
    0
    1. Elodie
       
      Bonjour ccm81,

      Merci de ta réponse. Avec ton code, la macro marche.
      J'ai également suivi ton conseil et remplacé le Select Case par un If et ça marche toujours.
      Pour répondre à ta question n°2, j'ai utilisé Worksheet_Change sans tester Target, tout simplement parce que je "bidouille" juste sur Visual Basic et que j'ai trouvé ce code qui marchait sur un forum... Si t'as une solution plus simple à proposer pour l'action s'execute automatiquement, je suis preneuse.

      Mon code est désormais le suivant :

      Private Sub Worksheet_Change(ByVal Target As Range)

      For k = 1 To Range("RFI_Received").Rows.Count

      If Range("RFI_Received").Cells(k, 1).Value = "ok" Then
      Call boite
      End If
      Next k

      End Sub
      0
  2. ccm81 Messages postés 11033 Statut Membre 2 434
     
    re

    RQ1. avec ton code, dès que le contenu d'une cellule change dans la feuille, Worksheet_Change est exécutée
    RQ2. si tu veux tester un changement se produisant uniquement dans la plage RFI_Received, il faut tester si Target (la cible) appartient à cette plage (j'ai ajouté la déclaration des variables pour faire plus propre) (explication : si l'intersection de la cible et de la plage n'est pas vide alors ...)
    Private Sub Worksheet_Change(ByVal Target As Range)   
    Dim nbli As Long, li As Long   
    If Not Intersect(Target, Range("RFI_Received")) Is Nothing Then   
      nbli = Range("RFI_Received").Rows.Count   
      For li = 1 To nbli   
        If Range("RFI_Received").Cells(li, 1).Value = "ok" Then   
          Call boite   
        End If   
      Next li   
    End If   
    End Sub

    RQ3. avec ce code (et ton ancienne version), l'integralité des lignes de la plage RFI_Received est testé et chaque fois que "ok" est rencontré la procedure "boite" s'exécute.
    ça me parait curieux
    Si tu veux tester uniquement un changement dans la cellule active, et lorsque celle ci se trouve dans la plage RFI_Received, et exécuter éventuellement la procedure "boite" uniquement pour la ligne de la cellule active
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim li As Long  
    If Not Intersect(Target, Range("RFI_Received")) Is Nothing Then  
      li = Target.Row - Range("RFI_Received").Cells(1, 1).Row + 1  
      If Range("RFI_Received").Cells(li, 1).Value = "ok" Then  
        Call boite  
      End If  
    End If  
    End Sub 

    A toi de voir selon ce que tu veux faire

    bonne suite
    0
    1. Elodie
       
      Merci beaucoup pour ces explications et pour ce dernier code qui permet de ne pas tout remouliner à chaque fois et donc de gagner du temps d'attente.

      Bon week-end !
      0