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

VBA Access Discussion :

Code qui colorie x fois la case i au lieu de colorier de la case i à j pour chaque x


Sujet :

VBA Access

  1. #1
    Membre confirmé Avatar de keketteboy
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2008
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2008
    Messages : 100
    Par défaut Code qui colorie x fois la case i au lieu de colorier de la case i à j pour chaque x
    Bonjour,

    Mon intitulé est clair sans trop l'être alors je vais détailler un peu plus. J'ai codé une série de rectangles (365). Ces rectangles doivent se colorier en fonction de si ils appartiennent à la période x (avec x entier allant de 1 à 12 par exemple).
    Cette période x est définie par une "Date_début" et "une Date_fin". J'ai donc codé une fonction qui me parcourt une colonne dans un formulaire "Num_chrono_plan" (qui correspond à mon numéro de période x) et pour chaque valeur de x, correspond une couleur différente donc chaque période possède sa couleur.
    Pour chaque valeur x, je veux que la fonction aille me chercher la Date_début et la Date_fin et qu'elle me colorie toutes les rectangles entre.

    Le problème c'est que ma fonction, au lieu de colorier, pour Num_plan_chrono = x, les cases de i à j, elle me colorie la case x, (j-i) fois. En plus, elle ne me prend que la Date_début et Date_fin pour Num_chrono_plan = 1 et l'applique partout au lieu d'aller me chercher les valeurs pour Num_chrono_plan = 2, etc.

    Voici le code :
    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
     
    Dim i As Integer
    Dim Date_début As Date
    Dim Date_fin As Date
    Dim d As Integer
    Dim Date_début_NbJours As Double
    Dim Date_fin_NbJours As Double
    Dim Debut_Annee As Date
    Dim Num_chrono_plan As Integer
    Dim MonParametre As String
     
    'Implémentation de la date du début d'année
    Debut_Annee = "01/01/" & [Forms]![MonFormulaire]![CbAnnee]
     
    MonParametre = [Forms]![MonFormulaire]![MonParametre]
    Num_chrono_plan = [Forms]![MonFormulaire]![Num_chrono_plan]
     
    'Colorie les périodes pour MonParametre en fonction du Num_chrono_plan
     
    For Num_chrono_plan = 1 To 1
    Date_début_NbJours = DateDiff("d", Debut_Annee, [Forms]![MonFormulaire]![Date_début]) + 1
    Date_fin_NbJours = DateDiff("d", Debut_Annee, [Forms]![MonFormulaire]![Date_fin]) + 1
     
        If MonParametre <> "" Then
            For i = Date_début_NbJours To Date_fin_NbJours
            [Forms]![MonFormulaire]("" & Num_chrono_plan & "").BackColor = vbBlue
            [Forms]![MonFormulaire]("" & Num_chrono_plan & "").BackStyle = 1
            Next i
        End If
     
    Next Num_chrono_plan
     
    For Num_chrono_plan = 2 To 2
    ... etc ...
    Voyez le résultat sur l'image jointe, or moi je voudrais qu'il me colorie en bleu les 61 premières cases si on suit l'exemple sur l'image, puis en blanc les 61 suivantes, etc ...

    Quand je fais le pas-à-pas, le code me réitère 61 fois le coloriage de la case 1 donc il ne parcourt pas mon tableau, et je ne sais vraiment pas pourquoi.

    Merci d'avance.

    PS : Si je passe par une requête SQL pour aller chercher mon Num_chrono_plan et aussi une pour mes 2 dates début et fin, ça sera pareil? Je ne sais pas si ça marchera comme je le veux puisque logiquement, ça fait la même chose que d'aller le chercher directement dans mon formulaire non?
    Images attachées Images attachées  

  2. #2
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    3 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 045
    Par défaut
    ceci ira peut-être mieux ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    If MonParametre <> "" Then
            For i = Date_début_NbJours To Date_fin_NbJours
            [Forms]![MonFormulaire]("" & i & "").BackColor = vbBlue
            [Forms]![MonFormulaire]("" & i & "").BackStyle = 1
            Next i
        End If
    ....

  3. #3
    Membre confirmé Avatar de keketteboy
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2008
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2008
    Messages : 100
    Par défaut
    Merci beaucoup !!! Je suis vraiment trop étourdi !! A force d'être la tête dans le code je ne vois plus les trucs qui pour d'autres pourraient leur sauter aux yeux ! C'est toujours bon d'avoir une vue extérieure plus objective sur son travail surtout quand celle-ci est bien meilleure que nous.

    Sinon, j'ai toujours le problème de la Date_fin et Date_début qui ne sont pas changées, il me reprend toujours les dates pour Num_chrono_plan = 1 et pas pour les autres. Une idée ?? Je pense à une requête SQL qui irait me chercher dans mon tableau les dates correspondantes, mais le tableau est déjà rempli grâce à une requête qui va chercher les dates dans une table.

    Donc appeler les dates directement dans le tableau affiché dans le formulaire par une requête revient à faire une requête qui irait me la chercher directement dans la table qui alimente mon formulaire : donc je ferai 2 fois la même chose ??

    Bref, je vois vraiment pas pourquoi est-ce qu'il ne veut pas me donner les bonnes dates alors que je lui fais parcourir les cases dates en fonction du Num_chrono_plan.

  4. #4
    Membre confirmé Avatar de keketteboy
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2008
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2008
    Messages : 100
    Par défaut
    Alors j'ai essayé de le faire avec une requête SQL mais j'ai un bug, il me dit "Trop peu de paramètres. 2 attendus" quand on fait le pas-à-pas, il s'arrête sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Date_début = CurrentDb.OpenRecordset(Str_Date_début)
    Je vous joins donc le code qui va avec, parce que je l'ai changé un peu depuis la dernière fois, pour la requête :
    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
     
    Dim R As Control
    Dim i As Integer
    Dim d As Integer
    Dim Date_début_NbJours As Double
    Dim Date_fin_NbJours As Double
    Dim Debut_Annee As Date
    Dim Num_chrono_plan As Integer
    Dim MonParametre As String
    Dim Str_Date_début As String
    Dim Str_Date_fin As String
    Dim Date_début As DAO.Recordset
    Dim Date_fin As DAO.Recordset
     
     
    'Implémentation de la date du début d'année
    Debut_Annee = "01/01/" & [Forms]![MonFormulaire]![CbAnnee]
     
    MonParametre= [Forms]![MonFormulaire]![MonParametre]
    Num_chrono_plan = [Forms]![MonFormulaire]![Num_chrono_plan]
     
    'Requête pour aller chercher les Date_début et Date_fin pour chaque Num_chrono_plan de 1 à 12
    For Num_chrono_plan = 1 To 12
    Str_Date_début = "SELECT MaTable.Date_début FROM MaTable WHERE MaTable.MonCritereDeTri = [Forms]![MonFormulaire]![MonCritereDeTri] AND MaTable.Num_chrono_plan = [Forms]![MonFormulaire]![Num_chrono_plan]"
    Str_Date_fin = "SELECT MaTable.Date_fin FROM MaTable WHERE MaTable.MonCritereDeTri = [Forms]![MonFormulaire]![MonCritereDeTri] AND MaTable.Num_chrono_plan = [Forms]![MonFormulaire]![Num_chrono_plan]"
    Set Date_début = CurrentDb.OpenRecordset(Str_Date_début)
    Set Date_fin = CurrentDb.OpenRecordset(Str_Date_fin)
    If Date_début.EOF = True And Date_fin.EOF = True Then
     
    'Calcul à quel ième jour les dates correspondent
    Date_début_NbJours = DateDiff("d", Debut_Annee, Date_début) + 1
    Date_fin_NbJours = DateDiff("d", Debut_Annee, Date_fin) + 1
     
    'Colorie en fonction de la valeur de Num_chrono_plan
    If Num_chrono_plan = 1 Then
     
        If MonParametre <> "" Then
            For i = Date_début_NbJours To Date_fin_NbJours
            [Forms]![MonFormulaire]![MonParametre]("" & i & "").BackColor = vbBlue
            [Forms]![MonFormulaire]![MonParametre]("" & i & "").BackStyle = 1
            Next i
        End If
     
    ElseIf Num_chrono_plan = 2 Then
    etc ...
    End If
    Next Num_chrono_plan
    Malheureusement, mon aide F1 ne marche pas sur la méthode OpenRecordset du coup je ne vois pas ce qui me manque, peut être le type? Le problème c'est que si je mets "Date" comme type, il me prend la fonction et non le type. Comment faire?

    Merci.

  5. #5
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    3 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 045
    Par défaut
    dans ta syntaxe ci-dessus, date_debut est un recordset mais le champ d'un recordset est date_debut(0) pour le 1er, date_debut(1) pour le 2eme ...
    ainsi tu as plusieurs erreurs de syntaxe et de types.

    Essaie plutôt avec la fonction Dlookup :
    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 Date_début as date
    dim Date_fin as date
    ...
     
    'Requête pour aller chercher les Date_début et Date_fin pour chaque Num_chrono_plan de 1 à 12
    For Num_chrono_plan = 1 To 12
    Date_début = dlookup("Date_début","MaTable","MonCritereDeTri ='" & [Forms]![MonFormulaire]![MonCritereDeTri] & "' AND Num_chrono_plan =" & [Forms]![MonFormulaire]![Num_chrono_plan])
    Date_fin = dlookup("Date_fin","MaTable","MonCritereDeTri ='" & [Forms]![MonFormulaire]![MonCritereDeTri] & "' AND Num_chrono_plan =" & [Forms]![MonFormulaire]![Num_chrono_plan])
     
    'Calcul à quel ième jour les dates correspondent
    Date_début_NbJours = DateDiff("d", Debut_Annee, Date_début) + 1
    Date_fin_NbJours = DateDiff("d", Debut_Annee, Date_fin) + 1
     
    ...

  6. #6
    Membre confirmé Avatar de keketteboy
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2008
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2008
    Messages : 100
    Par défaut
    Merci beaucoup micniv !! Là, j'aurai bien été incapable de trouver ça tout seul, même avec beaucoup de volonté.

    J'ai donc testé ta solution mais le problème, c'est qu'il me sort un bug :
    "L'expression entrée comme paramètre de requête est à l'origine de l'erreur suivante : 'Impossible pour Microsoft Access de trouver le nom 'Nom_De_MonCritereDeTri' entré dans l'expression' "
    quand je fais F8 sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Date_début = dlookup("Date_début","MaTable","MonCritereDeTri =" & [Forms]![MonFormulaire]![MonCritereDeTri] & " AND Num_chrono_plan =" & [Forms]![MonFormulaire]![Num_chrono_plan])
    Je précise juste que, si on regarde l'image que j'ai jointe, en fait MonFormulaire est composé d'un sous-formulaire qui correspond au tableau créé grâce à une requête qui va me chercher, dans MaTable, les informations visibles (Num_chrono_plan, Date_début, Date_fin, MonParametre et Nbre) mais aussi MonCritereDeTri qui lui n'est pas affiché dans le tableau mais qui sert donc à sélectionner la série qu'on visualise.

    Le problème viendrait-il du fait que MonCritereDeTri n'est pas visible dans MonSousFormulaire ? J'ai tenté de régler le problème en le rajoutant mais ça n'a pas l'air de fonctionner plus et là, je sèche totalement.

    Sinon, il y a t-il une piste avec une requête SQL ??

    Merci pour ton précieux temps.
    Images attachées Images attachées  

  7. #7
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    3 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 045
    Par défaut
    Je m'étais appuyé sur ton code précédent, alors quelques précisions :
    Date_début = dlookup("Date_début","MaTable","MonCritereDeTri ='" & [Forms]![MonFormulaire]![MonCritereDeTri] & "' AND Num_chrono_plan =" & [Forms]![MonFormulaire]![Num_chrono_plan])
    Cela suppose que MonCritereDeTri est un champ de MaTable
    et que [Forms]![MonFormulaire]![MonCritereDeTri] est un contrôle du formulaire "MonFormulaire" et qui est renseigné ... Au fait,ce champ MonCritereDeTri est de type Text alors il faut encadrer sa valeur par des ' : je modifie dans mon message précédent ...

    Sinon, il y a t-il une piste avec une requête SQL ?
    Oui c'est possible en SQL, puis un recordset mais DLookup fait tout le travail alors pourquoi s'en priver.

    Bonne suite

  8. #8
    Membre confirmé Avatar de keketteboy
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2008
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2008
    Messages : 100
    Par défaut
    Effectivement, il me manquait les ' . Mais la recherche par DLookUp ne semble pas parcourir mon tableau (sur MonFormulaire et non MaTable). Ça ne rentre bizarrement toujours que les dates de la 1ère ligne de mon tableau et ça recolorie 12 fois les mêmes cases (les 60 premières dans notre exemple).

    Quelques petites précisions :
    Cela suppose que MonCritereDeTri est un champ de MaTable
    et que [Forms]![MonFormulaire]![MonCritereDeTri] est un contrôle du formulaire "MonFormulaire" et qui est renseigné
    MonCritereDeTri est bien un champ de MaTable, et [Forms]![MonFormulaire]![MonCritereDeTri] est bien un contrôle de MonFormulaire qui est renseigné.
    De plus Num_chrono_plan appartient également à MaTable.

    Je pense que mon problème vient sûrement d'un mauvais emboîtement de mes boucles For ... je vais essayer de vérifier ça car je pense que DLookUp est la bonne solution mais que je ne place pas correctement mes boucles.

    Enfin, dis moi si je me trompe micniv. Je vais vérifier ça et je te tiens au courant, en tout cas encore merci de ton aide.

    Voici en pièce jointe ce que ça me donne : Num_chrono_plan va de 1 à 12 donc j'ai 12 couleurs différentes : la 1ère couleur = bleu, la 2nde = blanc, ... , la dernière = cyan. Comme tu peux le voir, il a colorié les 60 premières cases (la 1ère période allant du 01/01/2008 au 01/03/2008) en cyan et non en bleu et a laissé le reste sans couleur : donc il a bien colorié 12 fois les mêmes cases.
    Images attachées Images attachées  

  9. #9
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    3 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 045
    Par défaut
    Encore qqls remarques :
    tu as un controle Num_chrono_plan, alors ce n'est pas une bonne idée de nommer une variable locale du meme nom : je l'ai nommée num_plan
    . aussi retouche le critére dans dlookup comme suit
    . fais un point d'arret par F9 au debut de ton code puis, quand tu l'executes, tu continues en pas à pas par F8 : tu peux alors examiner les valeurs que prennent tes varibles.

    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 Date_début as date
    dim Date_fin as date
    ...
     
    'Requête pour aller chercher les Date_début et Date_fin pour chaque Num_plan de 1 à 12
    For Num_plan = 1 To 12
    Date_début = dlookup("Date_début","MaTable","MonCritereDeTri ='" & [Forms]![MonFormulaire]![MonCritereDeTri] & "' AND Num_chrono_plan =" & Num_plan )
    Date_fin = dlookup("Date_fin","MaTable","MonCritereDeTri ='" & [Forms]![MonFormulaire]![MonCritereDeTri] & "' AND Num_chrono_plan =" & Num_plan)
     
    'Calcul à quel ième jour les dates correspondent
    Date_début_NbJours = DateDiff("d", Debut_Annee, Date_début) + 1
    Date_fin_NbJours = DateDiff("d", Debut_Annee, Date_fin) + 1
     
    ...

  10. #10
    Membre confirmé Avatar de keketteboy
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2008
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2008
    Messages : 100
    Par défaut
    Ah merci.

    Entre temps j'avais résolu ce problème de parcours de ma table mais je me suis trouvé face à d'autres problèmes quand j'ai voulu tester sur un autre exemple, les num_chrono_plan ne correspondaient plus et s'affichaient dans le désordre, en plus je devrais plutôt le faire parcourir de 0 à select (count num_chrono_plan) sinon il voudra toujours aller de 1 à 12 même si dans le tableau il n'y a pas 12 num_chrono_plan et puis ça m'a aussi permis de voir que la table est en fait mal remplie, donc j'ai fait une bourde dans ma requête pour remplir la table.

    Je vais tenter de rectifier ça et tester ta solution, je te tiens au courant. PS: Désolé si je te réponds tard mais je n'ai pas internet chez moi, donc quand je te réponds c'est que je suis au travail.

    Merci encore pour le temps que tu me consacres.

  11. #11
    Membre confirmé Avatar de keketteboy
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2008
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2008
    Messages : 100
    Par défaut
    Salut Micniv!

    Alors j'ai quasiment réglé tous mes soucis, sauf que j'ai un problème de valeur Null maintenant dans ma boucle. Alors c'est dû au fait que j'ai plusieurs MonParamètre : P1, P2 et P3.
    Parfois il arrive que pour un Num_chrono_plan, un des 3 soit vide, dans ce cas dans ma variable, il y a une valeur Null qui apparemment n'est pas gérée par la fonction DLookup. Je te mets en joint le schéma de mon problème et voici également mon code :
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
     
    Dim R As Control
    Dim i As Integer
    Dim Date_début As Date
    Dim Date_fin As Date
    Dim d As Integer
    Dim Date_début_NbJours As Double
    Dim Date_fin_NbJours As Double
    Dim Debut_Annee As Date
    Dim Num_chrono_plan As Integer
    Dim P1 As String
    Dim P2 As String
    Dim P3 As String
    Dim Num_plan As Integer
     
     
    '------------- Implémentation de la date du début d'année -------------
     
    Debut_Annee = "01/01/" & [Forms]![MonFormulaire]![CbAnnee]
    Num_plan = 1
     
     
    '------------- Requête pour sélectionner les Date_début et Date_fin pour chaque Num_chhrono_plan -------------
     
    For Num_plan = 1 To [Forms]![MonFormulaire]![MaxDeNum_chrono_plan]
     
    Num_plan = DLookup("Num_chrono_plan", "MaTable", "MonCritèreDeTri ='" & [Forms]![MonFormulaire]![MonCritèreDeTri] & "' AND Num_chrono_plan =" & Num_plan)
    Date_début = DLookup("Date_début", "MaTable", "MonCritèreDeTri ='" & [Forms]![MonFormulaire]![MonCritèreDeTri] & "' AND Num_chrono_plan =" & Num_plan)
    Date_fin = DLookup("Date_fin", "MaTable", "MonCritèreDeTri ='" & [Forms]![MonFormulaire]![MonCritèreDeTri] & "' AND Num_chrono_plan =" & Num_plan)
     
    If P1 = Null Then
    P1 = ""
    End If
    If P2 = Null Then
    P2 = ""
    End If
    If P3 = Null Then
    P3 = ""
    End If
     
    P1 = DLookup("P1", "MaTable", "MonCritèreDeTri ='" & [Forms]![MonFormulaire]![MonCritèreDeTri] & "' AND Num_chrono_plan =" & Num_plan)
    P2 = DLookup("P2", "MaTable", "MonCritèreDeTri ='" & [Forms]![MonFormulaire]![MonCritèreDeTri] & "' AND Num_chrono_plan =" & Num_plan)
    P3 = DLookup("P3", "MaTable", "MonCritèreDeTri ='" & [Forms]![MonFormulaire]![MonCritèreDeTri] & "' AND Num_chrono_plan =" & Num_plan)
     
     
    '------------- Calcul le numéro du jour associé à ces dates -------------
     
    Date_début_NbJours = DateDiff("d", Debut_Annee, Date_début) + 1
    Date_fin_NbJours = DateDiff("d", Debut_Annee, Date_fin) + 1
     
     
    '------------- Colorie les rectangles en fonction du Num_chrono_plan -------------
     
    If Num_plan = 1 Then
     
        If P1 <> "" Then
            For i = Date_début_NbJours To Date_fin_NbJours
            [Forms]![MonFormulaire]![P1]("" & i & "").BackColor = vbBlue
            [Forms]![MonFormulaire]![P1]("" & i & "").BackStyle = 1
            Next i
        End If
     
        If P2 <> "" Then
            For i = Date_début_NbJours To Date_fin_NbJours
            [Forms]![MonFormulaire]![P2]("" & i & "").BackColor = vbBlue
            [Forms]![MonFormulaire]![P2]("" & i & "").BackStyle = 1
            Next i
        End If
     
        If P3 <> "" Then
            For i = Date_début_NbJours To Date_fin_NbJours
            [Forms]![MonFormulaire]![P3]("" & i & "").BackColor = vbBlue
            [Forms]![MonFormulaire]![P3]("" & i & "").BackStyle = 1
            Next i
        End If
     
     
    ElseIf Num_plan = 2 Then
     
        If P1 <> "" Then
            For i = Date_début_NbJours To Date_fin_NbJours
            [Forms]![MonFormulaire]![P1]("" & i & "").BackColor = vbWhite
            [Forms]![MonFormulaire]![P1]("" & i & "").BackStyle = 1
            Next i
        End If
     
        If P2 <> "" Then
            For i = Date_début_NbJours To Date_fin_NbJours
            [Forms]![MonFormulaire]![P2]("" & i & "").BackColor = vbWhite
            [Forms]![MonFormulaire]![P2]("" & i & "").BackStyle = 1
            Next i
        End If
     
        If P3 <> "" Then
            For i = Date_début_NbJours To Date_fin_NbJours
            [Forms]![MonFormulaire]![P3]("" & i & "").BackColor = vbWhite
            [Forms]![MonFormulaire]![P3]("" & i & "").BackStyle = 1
            Next i
        End If
    [P1], [P2] et [P3] correspondent aux sous-formulaires dans lesquels j'y ai mis les rectangles pour chaque MonParamètre P1, P2 et P3.

    Pour l'exemple affiché dans l'image jointe, il me colorie les 182 jours compris entre le 01/01/2008 et le 01/07/2008 puis pour MonParamètre P3, il s'arrête à la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    P3 = DLookup("P3", "MaTable", "MonCritèreDeTri ='" & [Forms]![MonFormulaire]![MonCritèreDeTri] & "' AND Num_chrono_plan =" & Num_plan)
    avec comme message d'erreur "Utilisation incorrecte de Null". J'ai tenté de rectifier ça avec les lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    If P1 = Null Then
    P1 = ""
    End If
    If P2 = Null Then
    P2 = ""
    End If
    If P3 = Null Then
    P3 = ""
    End If
    mais rien n'y fait.
    Je trouve ça bizarre qu'une variable de type String ne gère pas la valeur Null comme un "". Comment forcer cette valeur Null?

    Merci pour ton précieux temps.
    Images attachées Images attachées  

  12. #12
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    3 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 045
    Par défaut
    pour gérér les valeurs nulles tu as la précieuse finction NZ() (vois l'aide)

    Rapidement, je propose les modifs :

    supprime les lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    If P1 = Null Then
    P1 = ""
    End If
    If P2 = Null Then
    P2 = ""
    End If
    If P3 = Null Then
    P3 = ""
    End If
    remplace les lignes
    P1 = DLookup("P1", "MaTable", "MonCritèreDeTri ='" & [Forms]![MonFormulaire]![MonCritèreDeTri] & "' AND Num_chrono_plan =" & Num_plan)
    P2 = DLookup("P2", "MaTable", "MonCritèreDeTri ='" & [Forms]![MonFormulaire]![MonCritèreDeTri] & "' AND Num_chrono_plan =" & Num_plan)
    P3 = DLookup("P3", "MaTable", "MonCritèreDeTri ='" & [Forms]![MonFormulaire]![MonCritèreDeTri] & "' AND Num_chrono_plan =" & Num_plan)
    par :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    P1 = nz(DLookup("P1", "MaTable", "MonCritèreDeTri ='" & [Forms]![MonFormulaire]![MonCritèreDeTri] & "' AND Num_chrono_plan =" & NZ(Num_plan,0)))
    P2 = nz(DLookup("P2", "MaTable", "MonCritèreDeTri ='" & [Forms]![MonFormulaire]![MonCritèreDeTri] & "' AND Num_chrono_plan =" & NZ(Num_plan,0)))
    P3 = nz(DLookup("P3", "MaTable", "MonCritèreDeTri ='" & [Forms]![MonFormulaire]![MonCritèreDeTri] & "' AND Num_chrono_plan =" & NZ(Num_plan,0)))
    Voir si ça suffit pour ton code

  13. #13
    Membre confirmé Avatar de keketteboy
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2008
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2008
    Messages : 100
    Par défaut
    Merci micniv, t'es vraiment génialissime !! ça marche.

  14. #14
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    3 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 045
    Par défaut
    Heureux égalemnt que ça marche ...

    Et qd on est content, on clique "résolu" sur le post

  15. #15
    Membre confirmé Avatar de keketteboy
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2008
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2008
    Messages : 100
    Par défaut
    Ouais t'inquiète pas c'est ce que j'ai fait pour tous mes autres postes, quand c'est définitivement résolu, je clique sur "résolu" mais là je me suis aperçu d'un problème : quand je veux retester les mêmes produits, je remarque qu'il m'a changé MaTable pour Num_chrono_plan et m'a mis un peu tout et n'importe quoi ... bizarre, je vais essayer d'identifier le problème.

  16. #16
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    3 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 045
    Par défaut
    je regardais :
    For Num_plan = 1 To [Forms]![MonFormulaire]![MaxDeNum_chrono_plan]

    Num_plan = DLookup("Num_chrono_plan", "MaTable", "MonCritèreDeTri ='" & [Forms]![MonFormulaire]![MonCritèreDeTri] & "' AND Num_chrono_plan =" & Num_plan)
    Date_début = DLookup("Date_début", "MaTable", "MonCritèreDeTri ='" & [Forms]![MonFormulaire]![MonCritèreDeTri] & "' AND Num_chrono_plan =" & Num_plan)
    Date_fin = DLookup("Date_fin", "MaTable", "MonCritèreDeTri ='" & [Forms]![MonFormulaire]![MonCritèreDeTri] & "' AND Num_chrono_plan =" & Num_plan)
    ...
    mets la ligne "Num_plan = DLookup( ..." en commentaires ou supprime la ...

  17. #17
    Membre confirmé Avatar de keketteboy
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2008
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2008
    Messages : 100
    Par défaut
    Merci, ça a l'air de marcher mais par contre je ne comprends pas pourquoi je ne dois pas définir à quoi correspond ce "Num_plan". Là je veux bien des éclaircissements, car pour moi, il fallait le définir comme étant la valeur de Num_chrono_plan dans MaTable, sinon il ne va pas chercher cette valeur Num_chrono_plan. En fait il devient une simple variable Integer qui va de 1 à maxdeNum_chrono_plan ??? Même si je vois que ça marche j'aimerais bien savoir pourquoi ... enfin sous condition que j'ai été assez clair.

  18. #18
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    3 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 045
    Par défaut
    Tu fais une boucle sur :
    For Num_plan = 1 To [Forms]![MonFormulaire]![MaxDeNum_chrono_plan]
    ...
    par conséquent au départ de chaque boucle Num_plan est initialisé ; c'est un peu béta de faire une ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Num_plan=fonction(...numplan)
    tu risques même pour un peu de perdre l'indice de la boucle

    Es-tu d'accord ?

  19. #19
    Membre confirmé Avatar de keketteboy
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2008
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2008
    Messages : 100
    Par défaut
    Ah ouais d'accord c'est d'ailleurs pour ça que je perdais mon indice de boucle et il ne me le réinitialisait pas forcément, même pas du tout. Mais du coup, ce Num_plan ne correspond pas au Num_chrono_plan de MaTable, même si ils ont la même fonction, donc la même utilisation ? En fait je pensais qu'il fallait aller chercher ce Num_chrono_plan dans MaTable pour que ça marche puisque si par exemple, MaTable est mal remplie et qu'il y a une erreur de frappe qui fait que Num_chrono_plan commence non pas à 1 mais à 2, quel est le risque du fait que Num_chrono_plan soit différent de Num_plan ?

  20. #20
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    3 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 045
    Par défaut
    Date_début = DLookup("Date_début", "MaTable", "MonCritèreDeTri ='" & [Forms]![MonFormulaire]![MonCritèreDeTri] & "' AND Num_chrono_plan =" & Num_plan)
    Date_fin = DLookup("Date_fin", "MaTable", "MonCritèreDeTri ='" & [Forms]![MonFormulaire]![MonCritèreDeTri] & "' AND Num_chrono_plan =" & Num_plan)
    A priori tu n'as pas de risque puisque dans tes critères tu as cette condition remplie : Num_chrono_plan = Num_plan

    reste que c'est toi qui as la vue de l'ensemble ...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Code qui permet à l'utilisateur de cliquer sur un bouton une seule fois
    Par FLORE2222 dans le forum ActionScript 1 & ActionScript 2
    Réponses: 6
    Dernier message: 18/03/2012, 10h31
  2. code qui s'exécute une seule fois
    Par sam01 dans le forum Langage
    Réponses: 7
    Dernier message: 04/06/2010, 17h12
  3. Code qui ne fonctionne qu'une fois sur 2!
    Par Optimiss dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 04/03/2010, 10h41
  4. code qui s excute une fois
    Par sisna dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 20/08/2008, 11h35
  5. code qui s'execute plusieurs fois
    Par khelif dans le forum JBuilder
    Réponses: 1
    Dernier message: 10/03/2005, 21h56

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