Aide sur Worksheet_Change

Tsafast Messages postés 4 Statut Membre -  
Tsafast Messages postés 4 Statut Membre -
Bonjour à tous,

J'aimerais bien si possible, une aide pour écrire un code qui pourrait me permettre d'automatiser ce qui suit.

je suis sur Excel 2003.

Voici le code que j'aimerais écrire, si quelqu’un peut me donner une piste de départ.

Merci à l'avance

Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("I4:I46")) Is Nothing Then

if I5 change then
copy range(B5:F5) 'sur la dernière ligne vide disponible du tableau (B6:F6 en jaune)
retrait à gauche sur la cellule E6 'écrire résultat de la soutraction : E5 - I5 = 200
elseif
ainsi de suite jusqu'a I46

Merci.

1 réponse

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonjour,
    veux-tu commencer en I5 ou en I4?
    je suggère de faire une boucle sur toutes les celulles de Intersect, et de faire le boulot pour chacune de ces cellules.
    quelque chose comme:
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim cellule As Range
    Dim intersection As Range
    Set intersection = Intersect(Target, Range("I4:I46"))
    If Not intersection Is Nothing Then
        For Each cellule In intersection
            ' faire le boulot pour la ligne de la cellule 
        Next cellule
    End If
    End Sub
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 772
       
      Salut yg_be,

      Un For Each dans une procédure Change?
      Dans ce cas ce n'est pas utile.
      Private Sub Worksheet_Change(ByVal Target As Range)
      
          If Intersect(Target, Range("I4:I46")) Is Nothing Then Exit Sub
      
      Dim Ligne As Integer, DL As Integer
          DL = Columns(2).Find("*", , , , xlByColumns, xlPrevious).Row + 1
          Ligne = Target.Row
          Range("B" & Ligne & ":F" & Ligne).Copy Range("B" & DL)
      End Sub

      Je n'ai fait que la copie, reste à faire le calcul...
      0
      1. Tsafast Messages postés 4 Statut Membre > pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Bonjour,

        Je vous remercie pour vos réponses, je test et vous redonne des nouvelles.

        Merci!
        Fernand
        0
      2. Tsafast Messages postés 4 Statut Membre > pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Bonjour Pijaku,

        Merci pour ton aide qui est bien apprécié.

        Premier souci:
        la formule fonctionne bien mais j'aimerais si c'est possible qu'il s'en tienne qu'aux tableaux I4 à I46 car j'ai un autre tableau en dessous et il copie sur l'autre tableau. J'ai essayé ceci avant la copie mais il ne copie plus la ligne.
        Range("B46"). End(xlUp). Offset(1, 0). Select.

        Deuxième souci:
        encore une fois si possible et ça je ne l'avais pas mentionné dans mon premier texte
        Je voudrais qu'il copie la ligne seulement si la case qui est modifiée dans la rangée (I) est vide

        Merci encore une fois pour ton aide.
        0
      3. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 772 > Tsafast Messages postés 4 Statut Membre
         
        Salut,

        Désolé je n'avais pas vu ta réponse...

        qu'il s'en tienne qu'aux tableaux I4 à I46
        Dans mon code, remplacer :
        DL = Columns(2).Find("*", , , , xlByColumns, xlPrevious).Row + 1

        par :
        DL = Range("B3").End(xlDown).Row + 1
        If DL > 46 Then Exit Sub


        Je voudrais qu'il copie la ligne seulement si la case qui est modifiée dans la rangée (I) est vide
        Remplacer :
        Range("B" & Ligne & ":F" & Ligne).Copy Range("B" & DL)

        Par :
        If Range("I" & Ligne) = "" Then
            Range("B" & Ligne & ":F" & Ligne).Copy Range("B" & DL)
        End If



        Soit :
        Private Sub Worksheet_Change(ByVal Target As Range)
        
            If Intersect(Target, Range("I4:I46")) Is Nothing Then Exit Sub
        
        Dim Ligne As Integer, DL As Integer
            DL = Range("B3").End(xlDown).Row + 1
            If DL > 46 Then Exit Sub
            Ligne = Target.Row
            If Range("I" & Ligne) = "" Then
                Range("B" & Ligne & ":F" & Ligne).Copy Range("B" & DL)
            End If
        End Sub
        0
      4. Tsafast Messages postés 4 Statut Membre > pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Salut,

        Aucun problème, je te remercie pour ta réponse, je test et te redonne des nouvelles.
        0