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.

1drb-fred.xlsm (20.89 Ko)
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 !

Rechercher des sujets similaires à "probleme execution macro suivant"