Résolu / exécuter une macro sur un changement de valeur d'une cellule sur chaque ligne

emmanuel67

XLDnaute Nouveau
Bonjour à toutes et tous,

je vais essayer d'être clair ; )

mon tableau actuel :
BQDateCompteLibelleLibellé détailHT DebHT CreTVASituationPosition
BPO
19/04/2018​
10800000Compte ExploitantCompte Exploitant Ass
180,00​
30,00​
Tva DecD
sur ce tableau j'appliquais jusqu'à présent une petite macro manuellement pour ajouter la seconde ligne de données

BQDateCompteLibelleLibellé détailHT DebHT CreTVASituationPosition
BPO
19/04/2018​
10800000Compte ExploitantCompte Exploitant Ass
180,00​
30,00​
Tva DecD
BPO
19/04/2018​
4433Compte ExploitantCompte Exploitant Ass
30​

maintenant que des modifications les colonnes Situation (avec un si en fonction de position) et Position ajoutées
j'aimerai quand je passe de dans position de D à E
que ma macro se lance pour ajouter la seconde ligne automatiquement

j'ai essayé différente choses mais je suis dans le mur
soit cela se lance et tourne en boucle
soit erreurs

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Cells(ActiveCell.Row, 12).Select
If Range(Columns("M")).Value = "TvaDec" Then Call hello2
End Sub

je suis preneur d'une piste merci
 

emmanuel67

XLDnaute Nouveau
Salut
j'ai essayé rien ne se passe
par contre si je modifie le 13 en 14 la macro se lance, mais s’arrête
avec erreur 1004


la macro est la suivante :
Sub hello2()
Cells(ActiveCell.Row + 1, 1).Select 'cellule cliquée plus nouvelle position de la cellule active après insertion
Selection.EntireRow.Insert 'insertion ligne

Cells(ActiveCell.Row, 1) = Cells(ActiveCell.Row - 1, 1) 'recopie le contenu de la ligne -1 col 1
Cells(ActiveCell.Row, 2) = Cells(ActiveCell.Row - 1, 2) 'recopie le contenu de la ligne -1 col 2
Cells(ActiveCell.Row, 4) = Cells(ActiveCell.Row - 1, 4) 'recopie le contenu de la ligne -1 col 4
Cells(ActiveCell.Row, 5) = Cells(ActiveCell.Row - 1, 5) 'recopie le contenu de la ligne -1 col 5

Cells(ActiveCell.Row, 3).Select 'se positionne dans le code pour tva collectee varier en fonction de la cellule de destination et nb de colonne du tableau


Application.CutCopyMode = False 'remplace le code TVA
ActiveCell.FormulaR1C1 = "4433test"

Cells(ActiveCell.Row, 8).Select 'nouvelle cellule active
ActiveCell.FormulaR1C1 = Cells(ActiveCell.Row - 1, 10) 'recopie le montant de la tva

End Sub
 

bérylion

XLDnaute Occasionnel
ah bin c'etait juste pour te donner une piste, maintenant si tu veux 'la totale' essaye ça :
VB:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
  With Target
    If .Count = 1 Then
      If .Column = 14 And .Offset(0, -1) = "TvaDec" Then
        With Application
          .EnableEvents = Not .EnableEvents
          ActiveCell.Offset(-1, 0).Select
          Call hello2
          .EnableEvents = Not .EnableEvents
        End With
      End If
    End If
  End With
End Sub
;)
 

bérylion

XLDnaute Occasionnel
Les touches F1 et F8 sont tes meilleures amies...

pour essayer de répondre simplement à ta question :
la macro de départ est une procédure événementielle (c.a.d qui se déclenche automatiquement lorsque l'event choisi se produit ; dans ton cas un changement de valeur dans une cellule)
si les conditions à tester sont vraies alors cette macro en appelle une autre qui va changer les valeur dans des cellules et donc faire se déclencher automatiquement la 1ere macro de départ qui risque de s'appeler en boucle un moment...
donc pour eviter ce genre de pb, on désactive le déclenchement automatique juste avant d'appeler la 2e macro, et on le réactive juste apres qu'elle est terminée
et c'est la propriété Application.EnableEvents qui permet de modifier comment excel doit réagir
= true si on veut que ca soit activé
= false si on veut que ca soit désactivé
la comme on est déja dans l'exécution d'une macro événementielle, alors la propriété avait déjà la valeur "True"
donc il suffit juste de la régler sur Not("True") pour qu'elle devienne "False"
et de faire le contraire en fin de procédure : Not("False") = "True" pour qu'excel puisse à nouveau déclencher automatiquement les macro événementielles