[VBA-E] variable Mois

Bonjour,
Je cherche à faire la différence entre 2 dates dans une macro. Je saus faire la différence entre des jours mais en heure, comment faire la différence entre 2 dates mais en mois.
Exemple pour mieux illustrer :
Dim dateheure as date
dateheure = 36

if ....> dateheure / 24 ' différence en heures.

Comment faire la différence pour faire en mois:
if ... [supèrieure ou égale à 1 mois] Then...

j'ai pensé à faire 24h * 31 jours dans un mois = 744 mais ca n'est pas très propre.
merci de m'aider.

11 réponses

  • Votes
  • Date
  • Date décroissante
  1. Bonjour,
    Pourquoi ne pas utiliser tout simplement la fonction DATEDIFF ?
    Exemple de code
    Dim Date1 as Date
    Dim Date2 as Date
    Dim NombreMois
    
    NombreMois = datediff("m",Date1,Date2)

    Tu peux aussi utiliser cette fonction pour connaître le nombre d'heures entre deux dates, le nombre de jours...
    Tu trouveras de la documentation sur cette fonction ici
    A plus
    1. Merci Christounet !
      J'ai un autre problème avec mon code :
      Sub TEST1()
      Dim lig As Long
      Dim datesur36 As Single
      datesur36 = 36
      For lig = 2 To [A65536].End(xlUp).Row
              If Cells(lig, 1) - Now > datesur36 / 24 Then 'Colonne A
                  Cells(lig, 15).Value = "en retard"         'Colonne O
              End If
          Next lig
      End Sub


      Le problème avec ce code c'est que admettons que ma feuille soit sans donnée, je me place au milieu de la feuille sur A160, j'entre une date infèrieure de 36h à la date d'ajourd'hui pour faire executer mon "test1", la valeur de ma cellule Z160 inscrit : en retard. Le problème c'est que toutes, toutes les cellules au dessus de Z135, c'est à dire Z134, jusqu'à Z1 on prit la valeur : en retard ! alors que a34, a33 etc n'est même pas remplit !
      j'esspere que mon explication est claire ? comment empecher ca ?

      Merci de m'aider c'est important !
      1. Bonjour,

        Tu peux tester d'abord si la cellule est vide ou non
        For lig = 2 To [A65536].End(xlUp).Row
                If Cells(lig,1).value <> ""
                    If Cells(lig, 1) - Now > datesur36 / 24 Then 'Colonne A
                        Cells(lig, 15).Value = "en retard"         'Colonne O
                    End If
               End If
            Next lig
        

        A plus
        1. Une derniere question j'ai besoin d'envoyer dans le corps d'un email via une macro une plage de cellule.
          donc dans .body, j'ai mis :
          .body = Sheets("feuil1").Range["a1:z65535"].Value
          j'ai testé aussi : Sheets("feuil1").Range("a1:z65535").Value

          mais ca ne fonctionne pas comment faire ?
          1. J'ai testé ce code mais il me renvoi un erreur sur .send a la fin. j'ai excel 2000. une idée?
            merci !

            Sub PlageDeCellulesDansCorpsDuMessage()
            'testé avec XP
            'adapté de : https://support.microsoft.com/en-us/help/286430
            Dim iMsg As Object, iConf As Object
            Dim strHTML As String
            Dim i As Byte, j As Byte
            
            Set iMsg = CreateObject("CDO.Message")
            Set iConf = CreateObject("CDO.Configuration")
            
            strHTML = ""
            strHTML = strHTML & "<HEAD>"
            strHTML = strHTML & "<BODY>"
            strHTML = strHTML & "Bonjour , <BR>vous trouverez ci joint le tableau demandé<BR><BR>"
            strHTML = strHTML & "<B><SPAN STYLE='background-color:green;font-size:6mm'>Résultats : </SPAN></B><BR><BR>"
            strHTML = strHTML & "<TABLE BORDER>"
            
            For i = 1 To 5 'nombre de lignes (exemple plage A1:B5)
                strHTML = strHTML & "<TR halign='middle'nowrap>"
                For j = 1 To 2 'nombre de colonnes
                    strHTML = strHTML & "<TD bgcolor='yellow'align='center'><FONT COLOR='blue'SIZE=3>" _
                    & Cells(i, j) & "</FONT></TD>"
                Next j
                strHTML = strHTML & "</TR>"
            Next i
            
            
            strHTML = strHTML & "</TABLE>"
            
            strHTML = strHTML & "<BR><BR>Cordialement<BR>" & Environ("username")
            strHTML = strHTML & "</BODY>"
            strHTML = strHTML & ""
            
            With iMsg
                Set .Configuration = iConf
                .To = "destinataire@dvp.fr" 'renvoie une erreur si l'adresse est non valide
                '.From = "youralias@yourdomain.com"
                .Subject = "Test Envoi Tableau par mail"
                .HTMLBody = strHTML
                .Send
            End With
            
            End Sub
            
            1. Bonjour,

              CDO (Collaboration Data Object) nécessite un Exchange Server pour Outlook, ou alors tu dois définir dans Configuration.Fields.Item le nom du serveur SMTP que tu as (exemple pour Free : smtp.free.fr) comme dans cet exemple.
              A plus
              1. C aussi compliquer juste pour intégrer une plage de cellule dans le corps du texte d'un mail outlook ?
                Il n'y a pas d'autres solutions?
                1. Bonjour,

                  J'ai testé le code ci-dessous (Excel 2003, Outlook 2003)
                  Sub Send_Range()
                     
                     ' Sélection des cellules.
                     ActiveSheet.Range("A1:B5").Select
                     
                     ' Indique si l'en-tête de composition du message et la barre d'outils d'enveloppe sont tous deux visibles..
                     ActiveWorkbook.EnvelopeVisible = True
                     
                     'Définition du titre (Introduction) , Destinataire (To) , Sujet (Subject)  et Envoi (Send)
                  
                     With ActiveSheet.MailEnvelope
                        .Introduction = "Voici les cellules - C'est le titre."
                        .Item.To = "Adresse destinataire"
                        .Item.Subject = "Le sujet"
                        .Item.Send
                     End With
                  End Sub

                  Il te faut encore changer le range, l'introduction, le To et le subject.
                  A toi de voir si cela fonctionne avec Excel 2000
                  A plus