Problème exécution macro suivant cellule
Salut à tous,
Alors je commence à étudier le VBA, et je bloque pour l'exécution d'un macro dès lorsque la valeur d'une cellule change.
Voici mon code :
Sub Intercalaire(ByVal Target As Range)
If Target.Address = Range("C3").Address Then
ActiveWorkbook.ActiveSheet.Shapes("WordArt 3").TextFrame.Characters.Text = Range("C3")
End If
If Target.Address = Range("C4").Address Then
ActiveWorkbook.ActiveSheet.Shapes("WordArt 9").TextFrame.Characters.Text = Range("C4")
End If
If Target.Address = Range("C5").Address Then
ActiveWorkbook.ActiveSheet.Shapes("WordArt 2").TextFrame.Characters.Text = "S" & Range("C5")
ActiveWorkbook.ActiveSheet.Shapes("WordArt 2").TextFrame.Characters.Font.ColorIndex = Range("C5").Interior.ColorIndex
End If
End Sub
J'ai voulu dire :
- si la valeur C3 change, alors..
- si la valeur C4 change alors..
- si la valeur C5 change alors..
Le problème c'est que rien ne change.
Cordialement
Bonsoir,
pour suivre "l'évolution" d'une cellule (ou autre), il faut utiliser les surveillances événementielles de la feuille.
Pour cela, clic droit sur le nom de l'onglet de la feuille, afficher le code, sur la fenêtre de droite de VBE liste déroulante en haut à gauche, choisir "worksheet" puis liste déroulante de droite choisir "change"
Un début de procédure s'écrit, c'est à partir de là qu'il faut coder.
@ bientôt
LouReeD
Salut à toi, très bien sa marche mais du coup sa engendre un autre soucis.
En effet dans ma sub j'ai :
Sub Intercalaire()
ActiveWorkbook.ActiveSheet.Shapes("WordArt 3").TextFrame.Characters.Text = Range("C3")
ActiveWorkbook.ActiveSheet.Shapes("WordArt 9").TextFrame.Characters.Text = Range("C4")
ActiveWorkbook.ActiveSheet.Shapes("WordArt 2").TextFrame.Characters.Text = "S" & Range("C5")
ActiveWorkbook.ActiveSheet.Shapes("WordArt 2").TextFrame.Characters.Font.ColorIndex = Range("C5").Interior.ColorIndex
End Sub
Et donc :
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = Range("C3").Address Then
Call Intercalaire
End If
End Sub
De ce fait, vu que j'ai tout dans la sub "Intercalaire", sa appel toute la sub.
Si je comprend bien, il faut que je sépare la sub, en 3 sub au total ?
Et du coup, dans la sub "Worksheet_Change(ByVal Target As Range)", sa fait beaucoup de ligne non ? C'est qu'un petit projet mais si j'imagine un gros programme, il va y avoir beaucoup d'instruction non ?
Cordialement
Bonjour,
Passant à l'étude... il faut que tu aies le souci de qualifier tes Range ou Cells..., car même si tu n'as pas de souci immédiat relatif à la feuille censée être active, cela pourra survenir ultérieurement, et dans tous les cas la qualification (référence explicite à une feuille) permettra une exécution plus rapide.
Pour simplifier ton code :
Sub Intercalaire(ByVal Target As Range)
Dim i%, shp
shp = Array(0, 0, 0, 3, 9, 2)
With ActiveSheet
For i = 3 To 5
If Target.Address = .Range("C" & i).Address Then
With .Shapes("WordArt " & shp(i)).TextFrame.Characters
.Text = IIf(i = 5, "S", "") & Target
If i = 5 Then .Font.Color = Target.Interior.Color
End With
Exit For
End If
Next i
End With
End Sub
Mais il reste une ambiguïté : cette procédure n'est pas une évènementielle ! Elle ne se lance pas automatiquement, il faut la lancer (et il faut savoir comment et où elle se trouve, car sa place est normalement dans un module standard).
J'ai mis sous With la feuille active, car on peut supposer que tu la lanceras à partir de la feuille sur laquelle tu opères, donc pas de souci si c'est le cas, et le mieux est naturellement à partir d'un bouton car un bouton est nécessairement placé sur une feuille et au déclenchement la feuille sur laquelle il se trouve est forcément active (et une fois qu'on l'a mise en mémoire, elle peut aussi bien cesser de l'être, sa référence demeurera).
Maintenant, si tu t'attendais à ce qu'elle intervienne automatiquement, il te faut coder une procédure évènementielle, de type Change dans ton cas. Et cette procédure évènementielle d'une feuille sera toujours :
Private Sub Worksheet_Change(ByVal Target As Range)
Et elle doit être dans le Module de la feuille concernée, et la feuille se désigne par le mot-clé Me.
Cordialement.
Bonjour,
Un exemple dans le fichier joint.
La procédure est événementielle et placée dans le module de la feuille.
Cdlt.
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Select Case Target.Address
Case "$C$3"
Me.Shapes("WordArt 3").TextFrame.Characters.Text = Target.Value
Case "$C$4"
Me.Shapes("WordArt 9").TextFrame.Characters.Text = Target.Value
Case "$C$5"
With Me.Shapes("WordArt 2").TextFrame.Characters
.Text = "S" & Target.Value
.Font.ColorIndex = Target.Interior.ColorIndex
End With
End Select
End Sub
MFerrand, alors ok pour la deuxième partie, sa c'est OK.
Bon même si comme j'ai dit plus haut, sa fait un paquet de ligne si on aurait à lancer des instructions dès qu'une cellule change.
Après c'est peut-être que peu courant de faire ça..
Bon pour la première partie, je débute, je suis en pleine lecture d'un livre (variable, boucle, condition etc..) donc sa me parait très abstrait, mais à force de pratiquer, sa devrait paraître plus clair..
Sinon, j'ai un soucis, mineur si je puis dire..
Dans ma procédure :
Sub Intercalaire3()
ActiveWorkbook.ActiveSheet.Shapes("WordArt 2").TextFrame.Characters.Font.ColorIndex = Range("C5").Interior.ColorIndex
ActiveWorkbook.ActiveSheet.Shapes("WordArt 2").TextFrame.Characters.Text = "S" & Range("C5")
End Sub
Le texte change bien, mais pas la couleur.
Si j'exécute en revanche manuellement depuis l'éditeur, la couleur change bien..
Cordialement
Re, Salut LouReed !
Adaptation (rapide) de mon code précédent en évènementielle :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i%, shp
shp = Array(0, 0, 0, 3, 9, 2)
With Me
For i = 3 To 5
If Target.Address = .Range("C" & i).Address Then
With .Shapes("WordArt " & shp(i)).TextFrame.Characters
.Text = IIf(i = 5, "S", "") & Target
If i = 5 Then .Font.Color = Target.Interior.Color
End With
Exit For
End If
Next i
End With
End Sub
Cordialement.
Merci à vous, c'est marrant comme les deux codes sont structurés de façon totalement différente, mais ça marche.
Après j'avouerais que l'une est plus accessible que l'autre (à mon niveau), pour le moment du moins !