IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Figer la date si la valeur de la cellule ne change pas [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    ingénieur
    Inscrit en
    Septembre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2014
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Figer la date si la valeur de la cellule ne change pas
    Bonjour,
    Dans la colonne B je dois renseigner des avancement (en pourcentage) et la colonne C reçoit la date de modification des valeurs de la colonne B.
    Par exemple si je met 10% à une date, la date s'enregistre dans la colonne C et si les jours suivants il arrive que j'inscris le même 10%, la date ne doit pas changer, par contre si j'inscris une autre valeur que 10% la date doit changer. voici un code mais le soucis est que lorsque je tire une cellule par le bas pour avoir les même pourcentages, le code ne s'applique aux autres cellules, c'est-à-dire aucune date ne s'inscrit.
    je voudrais avoir la possibilité d'avoir le même résultat lorsque je tire une cellule par le bas. je sais pas comment faire. y t-a-il un autre code ou comment adapter ce code.
    Ci joint le fichier pour plus de visibilité.
    Merci


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Option Explicit
     
    Dim T, V, Col
    Dim plage As Range
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column <> 3 Then Exit Sub
    Application.EnableEvents = False
    For Each plage In Target
            T = Target.Value
            Application.Undo
            V = ActiveCell
            ActiveCell = T
            If T <> V Then
            plage.Offset(0, 1) = Date
            End If
            Next plage
    Application.EnableEvents = True
    End Sub
    Fichiers attachés Fichiers attachés

  2. #2
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Bonjour christian_koffi

    Si je comprends bien ton but :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    Option Explicit
     
    Private Sub Worksheet_Change(ByVal Target As Range)
     
    Dim C
    Dim C_precedent
    Dim d
    Dim d_precedent
    Dim Plage
     
    If Target.Column <> 3 Then Exit Sub
     
    Application.EnableEvents = False
    For Each Plage In Target
           If Plage.Column = 3 Then
                C = Plage.Value
                C_precedent = Plage.Offset(-1, 0).Value
                d_precedent = Plage.Offset(-1, 1).Value
                If C = "" Then
                    Plage.Offset(0, 1) = ""
                ElseIf C = C_precedent Then
                     Plage.Offset(0, 1) = d_precedent
                Else
                    Plage.Offset(0, 1) = Date
                End If
            End If
    Next Plage
    Application.EnableEvents = True
    End Sub
    Cordialement

    Docmarti.

  3. #3
    Candidat au Club
    Homme Profil pro
    ingénieur
    Inscrit en
    Septembre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2014
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Bonjour Docmarti,
    Merci mais ça ne marche toujours pas.

    Par exemple ce que je voudrais:
    Si le 27/09/2014 je mets 10% en C2, D2 reçoit 27/09/2014. Si le 28/09/2014 je remets 10% en C2, D2 reçoit 27/09/2014 car la valeur n'a pas changé. Par contre si le 28/09/2014 je mets 20%, D2 reçoit 28/09/2014 car la valeur a changé. J'ai testé le code mais ça ne marche pas.

  4. #4
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim c As Range, memo As Double
        If Target.Column <> 3 Or Target.Row = 1 Then Exit Sub
        Application.EnableEvents = False
        memo = Target.Range("A1").Value
        Application.Undo
        For Each c In Target
            If c <> memo Then
                c.Offset(0, 1) = Date
            End If
            c = memo
        Next c
        Application.EnableEvents = True
    End Sub
    EDIT: code modifié pour la recopie incrémentée, à tester... Ne fonctionne que si c'est la même valeur qui est recopiée.

    eric

  5. #5
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Teste ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Dim Valeur As Date
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
     
        If Target.Address(0, 0) = "C2" Then Valeur = Target.Value
     
    End Sub
     
    Private Sub Worksheet_Change(ByVal Target As Range)
     
        If Target.Address(0, 0) = "C2" Then
     
            If Target.Value > Valeur Then
     
                Application.EnableEvents = False
     
                    Target.Offset(, 1).Value = Date
     
                Application.EnableEvents = True
     
            End If
     
        End If
    End Sub
    Hervé.

    Oups, petite erreur

    Remplace :
    Par :
    Hervé.

  6. #6
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Citation Envoyé par Theze Voir le message
    Remplace :
    Par :
    Hervé.
    Bonjour,

    Pourquoi?
    Pour VBA comme pour Excel, une date est un nombre.
    Il n'y a aucune raison de définir une variable qui doit contenir une date en Single.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  7. #7
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    christian_koffi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    Private Sub Worksheet_Change(ByVal Target As Range)
     
    If Target.Column = 3 And Target.Columns.Count <> 1 Then MsgBox "Recopiez la colonne 3 seulement.": Exit Sub
    If Target.Column <> 3 Then Exit Sub
     
    Application.EnableEvents = False
     
    Set targ = Target
    tg = targ.Value
    Target_Row = targ.Row - 1
    Target_Column = targ.Column - 1
     
    Application.Undo
     
    On Error Resume Next
    ub = UBound(tg)
    Test_Tab = Err.Number
    On Error GoTo 0
     
    For Each c In targ
     c.Select
     
      If Test_Tab <> 0 Then
     
      If c.Value <> tg Or c.Offset(, 1) = "" Then
       c.Value = tg
       c.Offset(, 1) = Date
      End If
     
     
     Else
      c.Value = tg(c.Row - Target_Row, c.Column - Target_Column)
      c.Offset(, 1) = Date
     End If
     
    Next
     
    Application.EnableEvents = True
     
    End Sub
    Cordialement

    Docmarti.

  8. #8
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Pourquoi?
    Pour VBA comme pour Excel, une date est un nombre.
    Il n'y a aucune raison de définir une variable qui doit contenir une date en Single.
    Hello Alain, parce que la variable ne contient pas de date mais le pourcentage d'avancement (d'ailleurs je viens de m'apercevoir que la cible est B2 et non C2 donc, à rectifier dans le code). La variable pourrai être déclarée Integer mais je ne sais pas si les pas d'avancement sont avec ou sans décimale.

    Hervé.

  9. #9
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Aaaaahhhh, ok.

    J'avais pas vu.

    Remarque à oublier, donc.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  10. #10
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 020
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 020
    Points : 169
    Points
    169
    Par défaut
    Bonjour,
    Ma technique serait de déclencher une marco à la modification de la cellule voulue qui inscrit la date avec la fonction puis dde faire un copier/coller de la valeur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, [F2:F1000]) Is Nothing Then
    Exit Sub 'rien faire
    Else 'c'est la bonne cellule
    'et tu peux rajouter un test sur le contenu
     
    If Target.Value <> "" Then
     
     ActiveSheet.Unprotect
     
        Range("A65536").End(xlUp).Offset(1, 0).Select
        ActiveCell.Formula = "=NOW()"
        Selection.Copy
        Range("A65536").End(xlUp).Select
        Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
            xlNone, SkipBlanks:=False, Transpose:=False
        Application.CutCopyMode = False
     
     
     
        ActiveWorkbook.Save
     
      ActiveSheet.Protect
          'votre code
     
     
    Else
    Exit Sub
    End If
    End If
     
     
    End Sub
    A adapter....

  11. #11
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    J'ai l'impression que le demandeur se désintéresse totalement des réponses apportées...

  12. #12
    Candidat au Club
    Homme Profil pro
    ingénieur
    Inscrit en
    Septembre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2014
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Bonjour,
    Je n'étais pas à mesure de répondre pour des soucis de réseaux internet. J'ai essayé le code de Eric et ça marche parfaitement comme je le veux. en ce qui concerne les pourcentages d'avancement sont sans décimal.
    Merci à vous, ce forum est génial.
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 19/11/2014, 19h39
  2. Valeur de ComboBox qui ne change pas quand je clique
    Par pools dans le forum Windows Forms
    Réponses: 1
    Dernier message: 20/05/2009, 17h16
  3. Date courante comme valeur par défaut
    Par joeyinbox dans le forum Débuter
    Réponses: 4
    Dernier message: 27/04/2006, 16h11
  4. [POO] La valeur de l'attribut ne change pas...
    Par slydemusli dans le forum Langage
    Réponses: 3
    Dernier message: 26/03/2006, 12h10
  5. Réponses: 3
    Dernier message: 15/02/2006, 17h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo