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 :

Macro pour comparer des dates et écrire dans des cellules


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    consultant en gestion de projet
    Inscrit en
    Novembre 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : consultant en gestion de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2016
    Messages : 3
    Par défaut Macro pour comparer des dates et écrire dans des cellules
    Bonjour à tous,

    Je débute dans la programmation VBA et notamment pour l'application excel.

    J'ai extrait des dates de ms project et je voudrais les comparer pour pouvoir écrire dans une cellule : fait, en cours, à faire.

    Voici ce que j'ai écris comme programme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub etat()
     
    Dim sysdate As Date
    sysdate = Format(DateSerial(Year(Date), Month(Date), Day(Date)), "dd/mm/yyyy")
     
    If sysdate < DateSerial(2016, 11, 3) And sysdate > DateSerial(2016, 11, 3) Then
    Columns(7) = "Fait"
    'Ton traitement
     
    End If
     
    End Sub
    Lorsque j'exécute la macro rien ne se passe.

    Avez-vous des idées ?

    Merci

  2. #2
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour,

    Il me semble qu'une date ne peut pas être en même temps supérieure au 3/11/2016 et inférieure au 3/11/2016 donc ....

  3. #3
    Membre émérite
    Avatar de eric4459
    Homme Profil pro
    Ingénieur Gestion de Projets
    Inscrit en
    Avril 2014
    Messages
    605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Gestion de Projets
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 605
    Par défaut
    Bonsoir,
    Effectivement ta variable "sysdate" fait référence à la date du jour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sysdate = Format(DateSerial(Year(Date), Month(Date), Day(Date)), "dd/mm/yyyy")
    que tu cherches à comparer à deux dates ... qui sont la date du jour
    Je suppose que tu va comparer les dates de fin de ton planning avec la date du jour donc il te faut lister toutes tes dates en utilisant une variable, variable que tu intégrera dans ta condition.
    Admettons que tu ai exporté tes données MSP dans excel avec la date de fin en colonne I, tu pourrais faire quelque chose comme 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
    25
    26
    27
    28
    29
    Sub Compare_Date()
    Dim Ws As Worksheet
    Dim DateComp As Range
    Set Ws = ThisWorkbook.Sheets("Sheet1")
    Set DateComp = Ws.Range("I2") 'J'ai supposé que ta date de fin est en colonne I
    Dim i As Integer
    Dim NbLigne As Integer
    Dim sysdate As Date
    sysdate = Format(DateSerial(Year(Date), Month(Date), Day(Date)), "dd/mm/yyyy")
     
    With Ws
     NbLigne = .Cells(.Rows.Count, 1).End(xlUp).Row 'Ici on compte le nbre de ligne en colonne 1 (Je n'ai pas mis en colonne J car tu pourrais avoir des Jalons de début)
    End With
     
    For i = 0 To Nbline
    If sysdate > DateSerial(DateComp.Offset(i, 0)) Then
    Columns(7) = "Fait"
    ElseIf sysdate < DateSerial(DateComp.Offset(i, 0)) And sysdate < DateSerial(DateComp.Offset(i, -1)) Then ' DateSerial(DateComp.Offset(i, -1))etant la date de debut de la tache en colonne H
    'DateSerial(DateComp.Offset(i, 0))étant la cellule au croisement de la ligne i et de la colonne I (DateComp = Ws.Range("I2"))
    'pour la cellule en colonne H j'ai appliqué un offset de -1 : DateComp.Offset(i, -1)
    Columns(7) = "A Faire"
    ElseIf sysdate < DateSerial(DateComp.Offset(i, 0)) And sysdate > DateSerial(DateComp.Offset(i, -1)) Then
    Columns(7) = "En cours"
    End If
     
    'Ton traitement
     
    Next i
    End Sub
    Eric
    "Vous n’avez cessé d’essayer ? Vous n’avez cessé d’échouer ? Aucune importance !
    Réessayez, échouez encore, échouez mieux." Samuel Beckett
    Pensez aux balises et
    Visitez les FAQ Excel et allez faire un tour ici
    Tutoriels de SilkyRoad

  4. #4
    Futur Membre du Club
    Homme Profil pro
    consultant en gestion de projet
    Inscrit en
    Novembre 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : consultant en gestion de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2016
    Messages : 3
    Par défaut
    Merci Eric,

    Tu as exactement compris ce que je veux faire, désolé pour ma manière de m'exprimer je débute en programmation et ce n'est pas facile.

    J'essaie de décrypter ton code et je pense qu'il est correct.

    Malheureusement lors de son exécution, j'ai un message d'erreur indiquant "argument non facultatif".

    Je voudrais une forme comme ça sur excel :


    Merci beaucoup
    Images attachées Images attachées  

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 175
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je suis très étonné que tu n'aies pas un message d'erreur pour incompatibilité de type.
    En effet, tu déclares en ligne 3 la variable sysDate comme une Date
    et en ligne 4, tu lui assignes une valeur String
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sysdate = Format(DateSerial(Year(Date), Month(Date), Day(Date)), "dd/mm/yyyy")
    donc une erreur doit être signalée

    Quelle est la raison d'utiliser du VBA, alors qu'une simple formule Excel peut résoudre ce problème ?

    [EDIT]
    En supposant qu'il y ait des dates dans les deux colonnes (Début en colonne A et Fin en colonne B) et que la formule doit être en colonne C. La formule excel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(B2>AUJOURDHUI();"En cours";"Fait")
    et si vraiment il faut utiliser du VBA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub t1()
     Dim myFormula As String
     myFormula = "=IF(B2>TODAY(),""En cours"",""Fait"")"
     ThisWorkbook.Worksheets("Feuil1").Range("C2:C501").Formula = myFormula
    End Sub
    Dans l'exemple ci-dessus la formule est placée dans la plage C2:C501. Si l'on souhaite ne conserver que le résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub t1()
     Dim myFormula As String
     myFormula = "=IF(B2>TODAY(),""En cours"",""Fait"")"
     With ThisWorkbook.Worksheets("Feuil1").Range("C2:C501")
     .Formula = myFormula
     .Value = .Value
     End With
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Membre émérite
    Avatar de eric4459
    Homme Profil pro
    Ingénieur Gestion de Projets
    Inscrit en
    Avril 2014
    Messages
    605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Gestion de Projets
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 605
    Par défaut
    Bonjour
    J'ai écris ce bout de code un peu rapidement et l'erreur que tu me décris doit être due au fait que j'ai mal utilisé la fonction Format.
    Essayes ceci et dis-moi ce qu'il en est:
    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
    Sub Compare_Date()
    Dim Ws As Worksheet
    Dim DateComp As Range
    Set Ws = ThisWorkbook.Sheets("Sheet1")
    Set DateComp = Ws.Range("F2") ' date de fin est en colonne F ligne 2 car tu as peut-etre un intitulé en ligne 1 (si tu n'as pas de ligne intitulé tu mets Range("F1")
    Dim i As Integer
    Dim NbLigne As Integer
    Dim sysdate As Date
    Dim Date_Debut As Date
    Dim Date_fin As Date
    sysdate = Format(DateSerial(Year(Date), Month(Date), Day(Date)), "dd/mm/yyyy")
     
    With Ws
     NbLigne = .Cells(.Rows.Count, 1).End(xlUp).Row 'Ici on compte le nbre de ligne en colonne 1 (Je n'ai pas mis en colonne F car tu pourrais avoir des Jalons de début)
    End With
     
    For i = 0 To Nbline
     
    Date_Debut = Format(Year(DateComp.Offset(i, -1)), Month(DateComp.Offset(i, -1)), Day(DateComp.Offset(i, -1)), "dd/mm/yy")
    Date_fin = Format(Year(DateComp.Offset(i, 0)), Month(DateComp.Offset(i, 0)), Day(DateComp.Offset(i, 0)), "dd/mm/yy")
     
    If sysdate > Date_fin Then
    Columns(7) = "Fait" 'Colonne(7) est ta colonne G j'ai donc mis la date de fin en colonne F (DateComp = Ws.Range("F2")) et la date de début en E (DateComp.Offset(i,-1))
    ElseIf sysdate < Date_Debut Then
    Columns(7) = "A Faire"
    ElseIf sysdate < Date_fin And sysdate > Date_Debut Then
    Columns(7) = "En cours"
    End If
     
    'Ton traitement
     
    Next i
    End Sub
    Mais comme le dit justement Philippe, avec une formule tu peux aussi avoir le même resultat.
    Eric
    "Vous n’avez cessé d’essayer ? Vous n’avez cessé d’échouer ? Aucune importance !
    Réessayez, échouez encore, échouez mieux." Samuel Beckett
    Pensez aux balises et
    Visitez les FAQ Excel et allez faire un tour ici
    Tutoriels de SilkyRoad

  7. #7
    Futur Membre du Club
    Homme Profil pro
    consultant en gestion de projet
    Inscrit en
    Novembre 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : consultant en gestion de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2016
    Messages : 3
    Par défaut
    MERCI ERIC ET PHILIPPE!

    J'ai testé ton code Éric malheureusement ça ne fonctionne pas, j'ai un message d'erreur "l'indice n'appartient pas à la sélection".

    J'ai donc ensuite essayé la proposition de Philippe et cela fonctionne parfaite j'aurais tout de même aimé pouvoir ajouter "à faire" pour dissocier les tâches qui ont déjà commencé mais qui ne sont pas fini et les tâches qui n'ont pas commencé du tout.

    Si vous avez une solution je suis preneur.

    Merci vraiment de vos réponses rapide et efficace.

  8. #8
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 175
    Billets dans le blog
    53
    Par défaut
    Bonjour Eric,
    J'ai écris ce bout de code un peu rapidement et l'erreur que tu me décris doit être due au fait que j'ai mal utilisé la fonction Format.
    Essayes ceci et dis-moi ce qu'il en est:
    Ma réponse ne t'était pas destinée. Je répondais à l'instigateur de cette discussion mais je constate que tu as également utilisé la fonction Format qui renvoie une chaîne de caractères.
    Si tu types une variable comme une date, il est évident que tu ne peux lui attribuer une valeur String or Format transforme une valeur numérique en chaîne de caractères.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

Discussions similaires

  1. Réponses: 25
    Dernier message: 14/04/2015, 14h58
  2. [XL-2010] Pb Macro pour ouvrir un fichier Word et copier des données dans des signets
    Par MPRIBOM dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 30/10/2014, 14h00
  3. [XL-2003] macro pour afficher les dates des troisièmes vendredi du mois
    Par julius999 dans le forum Macros et VBA Excel
    Réponses: 21
    Dernier message: 28/10/2009, 17h39
  4. Réponses: 2
    Dernier message: 27/06/2007, 10h42

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