Problème Excel : Macro et plage nommée
Résolu
Elodie
-
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
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:
- Nommer une plage de cellule variable vba
- Liste déroulante excel - Guide
- Word et excel gratuit - Guide
- Déplacer colonne excel - Guide
- Si ou excel - Guide
- Excel moyenne - Guide
2 réponses
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)
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
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
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 ...)
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)
A toi de voir selon ce que tu veux faire
bonne suite
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
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