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 :

Problème de structure avec des opérateurs logiques [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 73
    Par défaut Problème de structure avec des opérateurs logiques
    Bonjour à tous

    Je vous sollicite aujourd'hui car je n'arrive pas à trouver la bonne combinaison d'opérateur logique pour compter des éléments en tenant compte de nombreux critères.

    J'explique !
    Je veux compter le nombre d'éléments compris ds un intervalle de temps donné.
    J'ai dû préalablement faire une différence entre deux dates.Cette différence est en années, en mois et en jours.

    N.B: pour chaque unité de temps il y a une colonne de référence. Il y a donc une colonne pour les années, une colonne pour les mois et une colonne pour les jours.

    Les critères sont les suivants:
    - x<= 1 mois;
    - 1<x<=6 mois;
    - 6<x<=12 mois;
    - x>12 mois.


    En faite je souhaite compter le nombre ligne correspondant à plusieurs critère.

    Par exemple ligne 2: pour le critère 1 mois < x <= 6 mois, x élement compris dans l'intervalle de temps défini.

    ligne 2 Colonne A: contenu doit commencer par "TH*"
    ligne 2 Colonne S: contenu doit être égale à "BRIVE"
    ligne 2 Colonne AQ(années): contenu doit être égale à 0.
    ligne 2 colonne AR (mois): contenu doit être égale à une valeur comprise dans l'intervalle [1;6] mois.
    ligne 2 colonne AS (jours): contenu doit être égale à une valeur comprise dans l'intervalle [0;30]jours.

    sauf que dés lors qu'on a 6mois il faut obligatoirement 0jours!

    alors que quand il y a 1 mois les jours peuvent varier de 0 à 30 jours.

    Ainsi c'est une véritable logique à adopter!

    Mon code est le suivant :
    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
    Dim B1 As Range, btr1 As Long 
     
    Set DateRange = Range([A1], Cells(Rows.Count, 1).End(xlUp))
     
    For Each B1 In DateRange
     
    If B.Value Like "TH*" Then
    If (B1.Offset(, 42).Value = 0) And (B1.Offset(, 43).Value >= 1) And B1.Offset(, 44).Value <= 30 Xor _
    (B1.Offset(, 44).Value <= 6) And B1.Offset(, 44).Value <= 0 Then
     
        btr1 = btr1 + 1
     
    End If
    End If
    Next B1

    J'ai essayé les opérateurs logiques Or ou Xor; mais je pense que c'est mon code qui n'est pas assez structurer pour répondre totalement au critère correspondant.
    En fait le code précédent ne prend pas en compte tout les résultats possibles, j'ai l'impression...

    Pouvez-vous m'aider à résoudre ce problème?

    Je vous remercie d'avance pour vos réponses .

    Cordialement
    Tiviia

  2. #2
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    Bonjour,

    A mon avis ce serait beaucoup plus simple de tout mettre en jour (au moins pour les calculs)

  3. #3
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 73
    Par défaut
    Le problème est que les mois ont un nombre de jours différent.

    Ainsi, je calcule la différence en années, en mois et en jour pour avoir des résultats fiables.

  4. #4
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    En VBA utilise le code ci dessous pour avoir le nombre de jour entre 2 dates
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DateDiff("d", "01/01/2013", "28/02/2013")
    La formule précédente fait la meme chose mais dans une feuille de calcum

  5. #5
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 73
    Par défaut
    J'ai utilisé cette fonction au début, mais j'avais des problèmes de format de date ( Format Français et Format us).

    Bref cette fonction n'a pas su répondre aux exigences de mon problème; c'est à dire compter le nombre d'éléments dans un intervalle donné.

  6. #6
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    Pour mettre les dates au bon format
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Format("02/20/2013", "dd/mm/yyyy")
    retournera 20/02/3013

  7. #7
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 73
    Par défaut
    Bonjour

    Quel serai selon vous le code associé au:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DateDiff("d", "01/01/2013", "28/02/2013")
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Format("02/20/2013", "dd/mm/yyyy")
    cordialement
    Tiviia

  8. #8
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    Datediff, permet de donner l'écart entre 2 dates
    Format, permet de mettre la date au format que l'on souhaite

    La combinaison des 2 devrait te permettre d'avoir l'écart en jour de entre tes dates (meme si au format US)

  9. #9
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 73
    Par défaut
    Re bonjour

    Je pense que la fonction Datediff n'est pas adapter car les mois n'ont pas le même nombre de jour, de plus il y a différent type d'année...

    Du coup j'ai bien peur que celà fausse tous les calculs...

  10. #10
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    as tu essayé avant de dire que ça ne fonctionne pas.

  11. #11
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 73
    Par défaut
    J'avais déjà essayer cette fonction.

    Maintenant ce n'est pas la différence de date qui me pose problème c'est comment compter les lignes selon les critères donnés.

    Mon code pour faire la différence entre deux dates est le suivant :

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    Function vbaDateDiff(ByVal FirstDateCell As String, ByVal SecondDateCell As String, ByVal StringCode As String) As Long
        dte = FirstDateCell
        dte2 = SecondDateCell
        vbaDateDiff = Application.Evaluate("DATEDIF(DATEVALUE(""" & FirstDateCell & """),DATEVALUE(""" & SecondDateCell & """),""" & StringCode & """)")
    End Function
     
     
    Sub t()
     
     'calcul
     Dim test As Range
    Dim test23 As Range
    Dim diff As Integer
    Dim dest As Range
    Dim dte As Date
    Dim jr As Integer
    Dim mo As Integer
    Dim an As Integer
    With ActiveSheet
     
        Set test = .Range("J2")
        Set test23 = .Range("AH2")
        Set dest = .Range("AQ2")
        For i = 0 To .Columns(1).Find("TH*", , , , xlByColumns, xlPrevious).Row - 1
     
             If IsDate(test.Offset(i, 0)) Then
                diff = test.Offset(i, 0) - test23.Offset(i, 0)
     
              If diff >= 0 Then
                    jr = vbaDateDiff(Format(test.Offset(i, 0), "mm/dd/yyyy"), Format(test23.Offset(i, 0), "mm/dd/yyyy"), "md")
                    mo = vbaDateDiff(Format(test.Offset(i, 0), "mm/dd/yyyy"), Format(test23.Offset(i, 0), "mm/dd/yyyy"), "ym")
                    an = vbaDateDiff(Format(test.Offset(i, 0), "mm/dd/yyyy"), Format(test23.Offset(i, 0), "mm/dd/yyyy"), "y")
                    dest.Offset(i, 0) = an
                    dest.Offset(i, 1) = mo
                    dest.Offset(i, 2) = jr
                Else
                    jr = vbaDateDiff(Format(test23.Offset(i, 0), "mm/dd/yyyy"), Format(test.Offset(i, 0), "mm/dd/yyyy"), "md")
                   mo = vbaDateDiff(Format(test23.Offset(i, 0), "mm/dd/yyyy"), Format(test.Offset(i, 0), "mm/dd/yyyy"), "ym")
                   an = vbaDateDiff(Format(test23.Offset(i, 0), "mm/dd/yyyy"), Format(test.Offset(i, 0), "mm/dd/yyyy"), "y")
                     dest.Offset(i, 0) = an
                    dest.Offset(i, 1) = mo
                    dest.Offset(i, 2) = jr
     
            End If
            End If
     
     
        Next i
    End With
     
    End Sub
    Ps:Je vous remercie d'avoir pris le temps de me répondre.

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

Discussions similaires

  1. [XL-2010] Problème de structure avec des opérateurs logiques
    Par Tiviia dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 26/02/2013, 16h13
  2. Réponses: 7
    Dernier message: 27/09/2012, 17h29
  3. Réponses: 1
    Dernier message: 25/05/2011, 13h55
  4. Problème de "select" avec des valeurs a null
    Par SchpatziBreizh dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 01/07/2005, 17h08
  5. Réponses: 6
    Dernier message: 19/10/2004, 14h46

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