Problème Excel : Macro et plage nommée

Résolu/Fermé
Elodie - 11 août 2011 à 17:16
 Elodie - 12 août 2011 à 16:41
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
A voir également:

2 réponses

ccm81 Messages postés 10851 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 16 avril 2024 2 404
Modifié par ccm81 le 11/08/2011 à 19:07
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
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
ccm81 Messages postés 10851 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 16 avril 2024 2 404
Modifié par ccm81 le 12/08/2011 à 15:19
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
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