Run macro whenever a cell in a column change

Bonjour,

dans ma database ci jointe, je voudrais que des qu'une date est entrée dans la colonne "AJ" de la feuille "RECAP", la macro "dem_create" s'execute. Cette macro permet de creer un fichier excel a partir d'un modele en reprenant les infos de la feuille recap.

Exemple: dans ma feuille recap, dans la colonne AJ de la ligne 4, je rentre 08-01-16. Alors excel cree un nouveau document, et que ce document reprenne les infos de la ligne 4 de ma feuille recap (vsl, ref, suppliers etc)

Voici la macro "dem create"

Sub DEM_CREATE()

Dim CALCSHEET As Workbook
Dim WSH As Worksheet
Dim IROW As Long

Set WSH = ThisWorkbook.Worksheets("RECAP")

Workbooks.Add Template:= _
        "C:\Users\mciavaldini.TAMOILCY\AppData\Roaming\Microsoft\Templates\DEMURRAGE CALC SHEETS\DEM IN CALC(P).xltm"

IROW = ThisWorkbook.Worksheets("RECAP").ActiveCell.row

With ThisWorkbook.Worksheets("RECAP")
Workbooks("DEM IN CALC(P)1").Worksheets("TOL PREL ESTIM").Range("REF").Value = .Cells(IROW, "C").Value
Workbooks("DEM IN CALC(P)1").Worksheets("TOL PREL ESTIM").Range("SUPPLIERS").Value = .Cells(IROW, "L").Value
Workbooks("DEM IN CALC(P)1").Worksheets("TOL PREL ESTIM").Range("TERM_P").Value = .Cells(IROW, "M").Value
Workbooks("DEM IN CALC(P)1").Worksheets("TOL PREL ESTIM").Range("VSL").Value = .Cells(IROW, "E").Value
Workbooks("DEM IN CALC(P)1").Worksheets("TOL PREL ESTIM").Range("CT_DATES").Value = .Cells(IROW, "O").Value

Workbooks("DEM IN CALC(P)1").Worksheets("TOL PREL ESTIM").Range("LP").Value = .Cells(IROW, "G").Value
Workbooks("DEM IN CALC(P)1").Worksheets("TOL PREL ESTIM").Range("DP").Value = .Cells(IROW, "Y").Value
Workbooks("DEM IN CALC(P)1").Worksheets("TOL PREL ESTIM").Range("GRADE").Value = .Cells(IROW, "F").Value
Workbooks("DEM IN CALC(P)1").Worksheets("TOL PREL ESTIM").Range("BL_DATE").Value = .Cells(IROW, "AI").Value

End With

End Sub

et voice ma macro dans la worksheet "recap"

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Range("AJ:AJ"), Target) Is Nothing And Range("AJ:AJ") <> "" Then

    If Target.Column = 36 Then   ' 36'th colums are active
  Application.EnableEvents = False
        Call DEM_CREATE
        Application.EnableEvents = True
End If
End If

End Sub

clairement je pense mal reference la colonne......quelqu'un peut il m'eclairer?

Bonjour,

Sans regarder le reste, tu peux déjà essayer ça :

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub
    If Not Intersect(Range("AJ:AJ"), Target) Is Nothing And Target <> "" Then
        Application.EnableEvents = False
        Call DEM_CREATE
        Application.EnableEvents = True
    End If
End Sub

Cordialement.

wow ca marche super.......sauf que le document qui s'ouvre ne reprend pas les infos de la ligne update.....

qu'est ce qui ne va pas dans le sub "dem_create".....surement le "irow" que j'ai utilize....je voulais definer la ligne en question

ex: si j'entre une date dans la colonne "aj" ligne 3 de ma feuille RECAP, alors un document "dem in calc" se cree et reprend les infos (vsl, ref, suppliers) de la ligne 3.....

Bonsoir,

j'avais pas regardé l'autre mais ton nom de classeur est sans extension...

Tu as une variable workbook inutilisée. Après ajout du classeur, affecte-le à cette variable, et remplace Workbooks(nomclasseur) par la variable dans la suite.

Cordialement.

Pardon mais je ne connais pas bien VBA j'apprend,

pourrais tu appliquer tes corrections a mon code DEM_CREATE......je n'arrive pas a identifier correctement la ligne

example si dans la ligne 4 colonne AJ, j'ajoute une date, le document doit se creer automatiquement et repeater les infos de la ligne 4

A essayer :

Sub DEM_CREATE()
    Dim CALCSHEET As Worksheet
    Dim WSH As Worksheet
    Dim IROW As Long

    Set WSH = ThisWorkbook.Worksheets("RECAP")
    Workbooks.Add Template:= _
        "C:\Users\mciavaldini.TAMOILCY\AppData\Roaming\Microsoft\Templates\DEMURRAGE CALC SHEETS\DEM IN CALC(P).xltm"

    Set CALCSHEET = ActiveWorkbook.Worksheets("TOL PREL ESTIM")
    IROW = ThisWorkbook.Worksheets("RECAP").ActiveCell.Row

    With ThisWorkbook.Worksheets("RECAP")
        CALCSHEET.Range("REF").Value = .Cells(IROW, "C").Value
        CALCSHEET.Range("SUPPLIERS").Value = .Cells(IROW, "L").Value
        CALCSHEET.Range("TERM_P").Value = .Cells(IROW, "M").Value
        CALCSHEET.Range("VSL").Value = .Cells(IROW, "E").Value
        CALCSHEET.Range("CT_DATES").Value = .Cells(IROW, "O").Value
        CALCSHEET.Range("LP").Value = .Cells(IROW, "G").Value
        CALCSHEET.Range("DP").Value = .Cells(IROW, "Y").Value
        CALCSHEET.Range("GRADE").Value = .Cells(IROW, "F").Value
        CALCSHEET.Range("BL_DATE").Value = .Cells(IROW, "AI").Value
    End With
End Sub

hum non ca ne marche pas.....y a t-il un moyen d'identifier la ligne par la reference peut-etre?


dans le code modifie, le irow=0...............


Ci joint un fichier example peut etre ca peut aider....

Hum ! A essayer :

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub
    If Not Intersect(Range("AJ:AJ"), Target) Is Nothing And Target <> "" Then
        Application.EnableEvents = False
        Call DEM_CREATE(Target.Row)
        Application.EnableEvents = True
    End If
End Sub
Sub DEM_CREATE(IROW As Long)
    Dim CALCSHEET As Worksheet

    Workbooks.Add Template:= _
        "C:\Users\mciavaldini.TAMOILCY\AppData\Roaming\Microsoft\Templates\DEMURRAGE CALC SHEETS\DEM IN CALC(P).xltm"

    Set CALCSHEET = ActiveWorkbook.Worksheets("TOL PREL ESTIM")

    With ThisWorkbook.Worksheets("RECAP")
        CALCSHEET.Range("REF").Value = .Cells(IROW, "C").Value
        CALCSHEET.Range("SUPPLIERS").Value = .Cells(IROW, "L").Value
        CALCSHEET.Range("TERM_P").Value = .Cells(IROW, "M").Value
        CALCSHEET.Range("VSL").Value = .Cells(IROW, "E").Value
        CALCSHEET.Range("CT_DATES").Value = .Cells(IROW, "O").Value
        CALCSHEET.Range("LP").Value = .Cells(IROW, "G").Value
        CALCSHEET.Range("DP").Value = .Cells(IROW, "Y").Value
        CALCSHEET.Range("GRADE").Value = .Cells(IROW, "F").Value
        CALCSHEET.Range("BL_DATE").Value = .Cells(IROW, "AI").Value
    End With
End Sub

waouh ca marche super,

peux tu m'expliquer rapider le target.count?

merci vraiment beaucoup de ton aide

Target.Count renvoie le nombre de cellules impliquées dans la modification de la feuille.

Ainsi, si plusieurs cellules sont en cause, la procédure s'interrompt...

Ah ok merci

par contre je viens de m'apercevoir que la function marche tres bien mais se reproduit a chaque fois que je modifie la cellule dans la colonne "AJ"

serait il possible de l'appliquer seulement a la premiere entrée et pas a chaque modification?

Je me suis contenter d'ajuster la syntaxe pour éliminer les erreurs d'exécution...

Mais ta procédure Change qui teste les changements sur la colonne AJ se déclenchera à chaque modification !

Si tu veux qu'elle ne s'exécute qu'une fois, il faut soit ne pas utiliser une procédure évènementielle et la déclencher manuellement (au moyen d'un bouton par exemple), soit enregistrer quelque part pour chaque cellule pour laquelle elle doit s'exécuter, qu'elle l'a été quand c'est le cas, de façon à pouvoir tester si elle a déjà été exécutée avant lancement.

Cordialement.

comment je dois faire pour "enregistrer quelque part pour chaque cellule pour laquelle elle doit s'exécuter, qu'elle l'a été quand c'est le cas, de façon à pouvoir tester si elle a déjà été exécutée avant lancement"? dans VBA?

C'est toi qui décide de l'organisation de ton fichier et qui voit où tu peux noter si l'opération a été faite pour telle ou telle cellule, si tu choisis cette méthode. Introduire ensuite un test dans le code ne pose pas de difficulté : il suffit de savoir quoi tester et où.

ok merci beaucoup en tout cas de ton aide et ta patience, j'ai appris plein de trucs

Rechercher des sujets similaires à "run macro whenever column change"