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 :

tableau de nombres variables


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 40
    Par défaut tableau de nombres variables
    Bonjour,


    Je dois créer un tableau de 9 Colonnes (n22, x22, n42, x42, n23, x23, n43, x43, A). voici le lien: http://cjoint.com/?ebjlVRYKXv
    Ces nombres sont variables.

    Les "n" varient de 0 à Z (ici Z=3, on peut changer ce nb et il corrspond au nombre maxis de tours par camion et par jour).

    Les "x" varient de 0 à X (ici X=4, il correspond au nombre de camions maxi par jour).

    A=n22*x22*8 + n42*x42*8 + n23*x23*10 + n43*x43*10.

    Ils doivent vérifier la condition suivante:
    Aa< A <= Ab
    avec Ab le rendement maxi par jour (ici =100)
    et Aa le rendement mini par jour (=Ab-6).

    J'ai imposé une deuxième condition:
    on supprime la ligne si:
    n22 ou x22 =0
    et/ou n42 ou x42= 0
    et/ou n23 ou x23=0
    et/ou n43 ou x43=0.


    Mais j'ai encore énormément de combinaisons possibles.

    Donc j'impose une nouvelle condition qui concerne les temps de rotation de mes camions.

    J'associe T22 à n22 et x22 (ici =1,2722)
    T42 à n42 et x42 (=2,175)
    T23 à n23 et x43 (=1,3722)
    T43 à n43 et x43 (=2,275)

    Voici la macro:
    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
    Sub combinaison()
    [A7.I65536].ClearContents
    Dim n22 As Integer, x22 As Integer, n42 As Integer, x42 As Integer, n23 As Integer, x23 As Integer, n43 As Integer, x43 As Integer, Z As Integer, X As Integer, A As Integer, Aa As Integer, Ab As Integer
    Dim T22 As Single, T42 As Single, T23 As Single, T43 As Single, MAX As Integer, MIN As Integer, Y As Integer, W As Integer
    Dim Ligne As Long
    
    Z = [A1]
    X = [F1]
    Aa = [A3]
    Ab = [F3]
    T22 = [J1]
    T42 = [L1]
    T23 = [J3]
    T43 = [L3]
    MAX = [N1]
    MIN = [N3]
    Ligne = 7
    
    For n22 = 0 To Z
        For x22 = 0 To X
            For n42 = 0 To Z
                For x42 = 0 To X
                    For n23 = 0 To Z
                        For x23 = 0 To X
                            For n43 = 0 To Z
                                For x43 = 0 To X
    
    A = n22 * x22 * 8 + n42 * x42 * 8 + n23 * x23 * 10 + n43 * x43 * 10
    
    If n22 = 0 Xor x22 = 0 Then A = 0
    If n42 = 0 Xor x42 = 0 Then A = 0
    If n23 = 0 Xor x23 = 0 Then A = 0
    If n43 = 0 Xor x43 = 0 Then A = 0
    
    
    If Aa < A And A <= Ab Then
    Cells(Ligne, 1).Value = n22
    Cells(Ligne, 2).Value = x22
    Cells(Ligne, 3).Value = n42
    Cells(Ligne, 4).Value = x42
    Cells(Ligne, 5).Value = n23
    Cells(Ligne, 6).Value = x23
    Cells(Ligne, 7).Value = n43
    Cells(Ligne, 8).Value = x43
    Cells(Ligne, 9).Value = A
    
    
    
    For Y = x22 To x42
    For W = x23 To x43
    
    If MIN * Y <= n22 * T22 * x22 + n42 * x42 * T42 And n22 * T22 * x22 + n42 * x42 * T42 <= MAX * Y Xor MIN * W <= n23 * T23 * x23 + n43 * T43 * x43 And n23 * x23 * T23 + n43 * x43 * T43 <= MAX * W Then
    
    Ligne = Ligne + 1
    
    End If
    
    Next
    Next
    Next
    Next
    Next
    Next
    Next
    Next
    
    Next
    Next
    
    
    End Sub
    Je pose Y, Y doit prendre les valeurs de x22 et X42 et celles qui sont comprises entre.

    W doit prendre les valeurs de x23 et x43 et celles comprises entre.

    MIN correspond à la durée minimale de travail par jour (ici 6h)
    MAX à la durée maxi par jour (ici 7h).

    Ils doivent vérifier:
    MIN * Y <= n22 * T22 * x22 + n42 * x42 * T42<= MAX * Y ET/OU MIN * W <= n23 * T23 * x23 + n43 * T43 * x43<= MAX * W

    En l'écrivant comme je l'ai fait j'ai droit à erreur de compilation: next sans for.

    J'ai essayé d'autres façons, ça m'a mis if sans end if

    si quelqu'un a une idée, elle sera la bienvenue

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 242
    Par défaut
    Bonjour,

    Quand on exécute la macro Combinaison du fichier que tu as joint, elle plante avec l'erreur "Erreur de compilation : Next sans For". Le contenu de ta macro s'affiche et un de tes nombreux Next est surligné. Il suffit de rajouter un "End If" juste au dessus de cette ligne et ta macro ne plante plus.

  3. #3
    Membre Expert Avatar de Fvandermeulen
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 869
    Par défaut
    Salut,
    L'indentation est d'une grande aide dans ce genre de cas, sans avoir testé, et sans avoir vérifier si ton code fais ce que tu souhaite, je vois un End if manquant et un next en trop, voici le code avec indentation:
    J'ai donc ajouté un End if avant le For Y (à vérifier si il est au bon endroit selon le résultat souhaité) et supprimé un Next.
    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
    Sub combinaison()
    [A7.I65536].ClearContents
    Dim n22 As Integer, x22 As Integer, n42 As Integer, x42 As Integer, n23 As Integer, x23 As Integer, n43 As Integer, x43 As Integer, Z As Integer, X As Integer, A As Integer, Aa As Integer, Ab As Integer
    Dim T22 As Single, T42 As Single, T23 As Single, T43 As Single, MAX As Integer, MIN As Integer, Y As Integer, W As Integer
    Dim Ligne As Long
     
    Z = [A1]
    X = [F1]
    Aa = [A3]
    Ab = [F3]
    T22 = [J1]
    T42 = [L1]
    T23 = [J3]
    T43 = [L3]
    MAX = [N1]
    MIN = [N3]
    Ligne = 7
     
    For n22 = 0 To Z
        For x22 = 0 To X
            For n42 = 0 To Z
                For x42 = 0 To X
                    For n23 = 0 To Z
                        For x23 = 0 To X
                            For n43 = 0 To Z
                                For x43 = 0 To X
     
                                A = n22 * x22 * 8 + n42 * x42 * 8 + n23 * x23 * 10 + n43 * x43 * 10
     
                                If n22 = 0 Xor x22 = 0 Then A = 0
                                If n42 = 0 Xor x42 = 0 Then A = 0
                                If n23 = 0 Xor x23 = 0 Then A = 0
                                If n43 = 0 Xor x43 = 0 Then A = 0
     
     
                                If Aa < A And A <= Ab Then
                                    Cells(Ligne, 1).Value = n22
                                    Cells(Ligne, 2).Value = x22
                                    Cells(Ligne, 3).Value = n42
                                    Cells(Ligne, 4).Value = x42
                                    Cells(Ligne, 5).Value = n23
                                    Cells(Ligne, 6).Value = x23
                                    Cells(Ligne, 7).Value = n43
                                    Cells(Ligne, 8).Value = x43
                                    Cells(Ligne, 9).Value = A
                                End If 'End if ajouté, vérifier selon le but de la macro si il est au bon endroit...
     
                                    For Y = x22 To x42
                                        For W = x23 To x43
     
                                        If MIN * Y <= n22 * T22 * x22 + n42 * x42 * T42 And n22 * T22 * x22 + n42 * x42 * T42 <= MAX * Y Xor MIN * W <= n23 * T23 * x23 + n43 * T43 * x43 And n23 * x23 * T23 + n43 * x43 * T43 <= MAX * W Then
                                            Ligne = Ligne + 1
     
                                        End If
                                    Next
                                Next
                            Next
                        Next
                    Next
                Next
            Next
        Next
    Next
     
    End Sub
    A+

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 40
    Par défaut
    en fait, ce que je souhaite c'est que mes (n22, x22, n42, x42, n23, x23, n43, x43) vérifient d'abord la condition Aa< A and A < Ab.

    Ensuite pour la ligne qui vérifie ça, je veux que cette ligne vérifie aussi
    MIN * Y <= n22 * T22 * x22 + n42 * x42 * T42 And n22 * T22 * x22 + n42 * x42 * T42 <= MAX * Y Xor MIN * W <= n23 * T23 * x23 + n43 * T43 * x43 And n23 * x23 * T23 + n43 * x43 * T43 <= MAX * W

    et si ces conditions sont vérifiées on passe à la ligne 2. J'ai essayé de bouger mes "end if" et "next". Ca me donne cette macro:

    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
    Sub combinaison()
    [A7.I65536].ClearContents
    Dim n22 As Integer, x22 As Integer, n42 As Integer, x42 As Integer, n23 As Integer, x23 As Integer, n43 As Integer, x43 As Integer, Z As Integer, X As Integer, A As Integer, Aa As Integer, Ab As Integer
    Dim T22 As Single, T42 As Single, T23 As Single, T43 As Single, MAX As Integer, MIN As Integer, Y As Integer, W As Integer
    Dim Ligne As Long
     
    Z = [A1]
    X = [F1]
    Aa = [A3]
    Ab = [F3]
    T22 = [J1]
    T42 = [L1]
    T23 = [J3]
    T43 = [L3]
    MAX = [N1]
    MIN = [N3]
    Ligne = 7
     
    For n22 = 0 To Z
        For x22 = 0 To X
            For n42 = 0 To Z
                For x42 = 0 To X
                    For n23 = 0 To Z
                        For x23 = 0 To X
                            For n43 = 0 To Z
                                For x43 = 0 To X
     
    A = n22 * x22 * 8 + n42 * x42 * 8 + n23 * x23 * 10 + n43 * x43 * 10
     
    If n22 = 0 Xor x22 = 0 Then A = 0
    If n42 = 0 Xor x42 = 0 Then A = 0
    If n23 = 0 Xor x23 = 0 Then A = 0
    If n43 = 0 Xor x43 = 0 Then A = 0
     
     
    If Aa < A And A <= Ab Then
     
    Cells(Ligne, 1).Value = n22
    Cells(Ligne, 2).Value = x22
    Cells(Ligne, 3).Value = n42
    Cells(Ligne, 4).Value = x42
    Cells(Ligne, 5).Value = n23
    Cells(Ligne, 6).Value = x23
    Cells(Ligne, 7).Value = n43
    Cells(Ligne, 8).Value = x43
    Cells(Ligne, 9).Value = A
    End If
     
    For Y = x22 To x42
    For W = x23 To x43
     
    If MIN * Y <= n22 * T22 * x22 + n42 * x42 * T42 And n22 * T22 * x22 + n42 * x42 * T42 <= MAX * Y Xor MIN * W <= n23 * T23 * x23 + n43 * T43 * x43 And n23 * T23 * x23 + n43 * T43 * x43 <= MAX * W Then
     
    Ligne = Ligne + 1
     
    End If
     
    Next
    Next
    Next
    Next
    Next
    Next
    Next
    Next
    Next
    Next
     
    end sub

    ça se lance et au bout d'un moment ça s'arrête et "Cells(Ligne, 1).Value = n22
    " devient surligné. Je comprends pas.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 40
    Par défaut
    finalement j'ai réussi à postionner correctement ma condition sur les temps de rotation. Ma macro fonctionne.

    Mais en faisant des essais je me suis rendue compte que certaines valeurs de (n22, x22, n42, x42 / n23, x23, n43, x43) vérifient bien cette condition de temps mais pour autant ne sont pas juste.

    En effet, en décomposant, je me retrouve parfois avec un camion qui travaille plus de 7h par jour.

    Je veux écrire une nouvelle condition. A la main, j'arrive à le faire mais je ne vois pas comment l'écrire en langage de programmation.

    j'appelle X nombre total de camions pour les 8m3 (ce qui correspond aux n22, x22, n23, x23) et X' nombre total de camions pour les 10m3 ( ce qui correspond aux n23, x23, n43, x43).
    X et X' sont trouvés suite à la vérifiaction de la condition sur le temps:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    For Y = x22 To x42
    For W = x23 To x43
     
    If MIN * Y <= n22 * T22 * x22 + n42 * T42 * x42 And n22 * T22 * x22 + n42 * T42 * x42 <= MAX * Y And MIN * W <= n23 * T23 * x23 + n43 * T43 * x43 And n23 * T23 * x23 + n43 * T43 * x43 <= MAX * W Then
     
    Ligne = Ligne + 1

    Je veux savoir par exemple pour X, si chaque camion de ce X ne fait pas plus de 7h et travaille au moins 6h.

    Un exemple sera plus parlant:

    n22=3 x22=2 n42=1 x42=5
    n=nb de tours par camions par jour
    x=nb de camions par jour

    (n22, x22)= trajet simple fret
    (n42,x42)= trajet double fret

    en simple fret: nb de tours total=3*2=6 tours
    en double fret: nb de tours total=1*5=5 tours

    le simple fret est associé au temps de rotation T22 (=1,2722 h)
    et le double fret à T42 (=2,175 h).

    Avec ma condition sur les temps de rotation: 6h * X <=3*2*1,2722 + 1*5*2,175<= 7h * X
    X=3 camions.

    j'ai 6 tours + 5 tours à faire faire par 3 camions.

    Camion 1: 3 tours en simple fret + 1 tour en double: Ttot= 5,99 h
    Camion 2: 3 tours en simple fret + 1 tour en double: Ttot=5,99 h
    Camion 3: 3 tours en double: Ttot=6, 525h


    je n'arrive pas à écrire cette condition en langage de programmation.

    Parce que là, on a un cas qui fonctionne mais j'ai eu des cas où en décomposant, un camion faisait plus de 7h.


    Je ne sais pas si tout ce que j'ai dit est bien clair.

  6. #6
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut
    Je n'ai pas trop suivi la discution, mais je pense qu'en lisant ton dernier exemple je procederais comme suis

    On a le nombre de camion qu'il faut pour la tournée ici 3
    On a le temps pour un simple fret 1,2722
    On a le temps pour un double fret 2,175
    On a 6 simple fret et 5 double

    Je créerais un tableau de 5+6, 11 lignes et 3 colonne, la 2eme colonne étant utiliser pour identifier le fret correspondant(je suppose que tu as un identifiant de la tournée qui l'identifie surement) et la 3eme le numéro de camion qui l'effectuera
    je remplirais se tableau en commencant par les fret double, puis les fret simple tu obtiens ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    2,175     T1
    2,175     T5
    2,175     T18
    2,175     T2
    2,175     T6
    1,2722    T9
    1,2722    T14
    1,2722    T12
    1,2722    T13
    1,2722    T21
    1,2722    T4
    Ensuite tu boucles sur ce tableau (3 fois si tu es sur de ton calcul du nombre de véhicules, sinon jusqu'à ce que la colonne 3 du tableau soit complète).
    Tu additionnes les valeurs rencontrées, a condition que la colonne 3 soit vide et sans dépasser 7h.

    Si l'addition respect la règle (total = moins de 7h), tu renseignes la colonne 3 avec le numéro de camion, et tu passes à la valeur suivante.

    Si une addition dépasse 7h, tu conserves le résultat sans cette valeur et tu passes à la ligne suivante, jusqu'à
    soit trouver une nouvelle valeur qui ne te fait pas dépasser les 7h,
    soit arriver à la fin du tableau.

    Normalement tu devrais ainsi maximiser tes tournées
    En bouclant de nouveau sur le tableau tu aura en colonne 3 le numéro du véhicule et en colonne 2 le numéro de la tournée.

    Je pense que le raisonnement peut être affiné un peu, sachant aussi que ce genre d'organisation marche bien sur le papier.... quand a être de même sur le terrain ... je doute qu'il en aille de même .

    A++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 40
    Par défaut
    par contre, je n'arrive pas à écrire une fonction qui copie le temps de rotation (sur une même colonne) autant de fois qu'il y a de nombre de tours en simple fret.


    voici la macro que j'ai commencé à écrire:

    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
    Sub nb_camions()
    Dim Ligne As Long, a As Integer, b As Integer, c As Integer, d As Integer, tableau()
    
    
    a = Worksheets("feuil2").Range("J1").Value 'nb tours totals en simple fret 8m3'
    b = Worksheets("feuil2").Range("J2").Value 'nb tours total double fret 8m3'+ a
    c = Worksheets("feuil2").Range("J4").Value 'nb tours total simple fret 10m3'
    d = Worksheets("feuil2").Range("J5").Value 'nb tours total double fret 10m3' + c
    
    
    Ligne = 7
    Worksheets("feuil2").Range("J1").Value = Worksheets("feuil1").Cells(Ligne, 3).Value
    Worksheets("feuil2").Range("M1").Value = Worksheets("feuil1").Range("N1").Value
    
    Worksheets("feuil2").Range("J2").Value = Worksheets("feuil1").Cells(Ligne, 6).Value
    Worksheets("feuil2").Range("M2").Value = Worksheets("feuil1").Range("P1").Value
    
    Worksheets("feuil2").Range("J4").Value = Worksheets("feuil1").Cells(Ligne, 9).Value
    Worksheets("feuil2").Range("M4").Value = Worksheets("feuil1").Range("N3").Value
    
    Worksheets("feuil2").Range("J5").Value = Worksheets("feuil1").Cells(Ligne, 12).Value
    Worksheets("feuil2").Range("M5").Value = Worksheets("feuil1").Range("P3").Value
    
    
    
    If a = 0 Then
    Range("M2").Copy Destination:=Range(Cells(1, 1), Cells(b, 1))
    Else: Range("M1").Copy Destination:=Range(Cells(1, 1), Cells(a, 1))
    Range("M2").Copy Destination:=Range(Cells(a + 1, 1), Cells(b, 1))
    
    If c = 0 Then
    Range("M5").Copy Destination:=Range(Cells(1, 5), Cells(d, 5))
    Else: Range("M4").Copy Destination:=Range(Cells(1, 5), Cells(c, 5))
    Range("M5").Copy Destination:=Range(Cells(c + 1, 5), Cells(d, 5))
    
    End If
    End If

    j'ai droit à erreur '1004'

  8. #8
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut
    En fait ton problème m'ai revenu en tête dans la journée et mon raisonnement ne sera peut être pas toujours valable. Je crains qu'il n'y ai des cas ou le fait d'organiser les tournées ainsi en toujours mettant le plus de plus grande valeur pour compléter ne permettrait pas le meilleur empilage, tu comprend si A et B sont les temps de tournée simple/double peut être que le faite de mettre un A empêche par la suite de mettre un B (dépassement des 7h) alors qu'il serait possible de mettre 2B a la place du A, mais je ne suis pas sur que cette crainte soit fondée dut a la marge d'une heure (6h - 7h) ou alors des cas vraiment très marginaux.

    Je regarde ton code, pour info tu as un bouton code pour mettre ton code entre balise, dans l'éditeur de message il se trouve en haut et son symbole est #, tu sélectionnes ton code puis tu appuies sur ce bouton.

    [Edit]
    Alors voila une correction du début du code, par contre je comprend que tu veux etaler une valeur par la suite, mais je ne comprend pas trop les critere que tu utilises, j'aimerais comprendre ton raisonnement afin de faire un truc coérent, j'ai bien un bout de ton fichier mais il ne correspond pas au code, le mieux serais de mettre ton fichier "complet" avec au moins les 2 feuilles dont tu parles dans ton code.
    Pour le début du 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
    Sub nb_camions()
    Dim Ligne As Long, a As Integer, b As Integer, c As Integer, d As Integer, tableau()
    Dim TheFeuil1 As Worksheet, TheFeuil2 As Worksheet
     
     
    Set TheFeuil1 = Worksheets("feuil1")
    Set TheFeuil2 = Worksheets("feuil2")
     
    With TheFeuil2
     
        a = .Range("J1").Value 'nb tours totals en simple fret 8m3'
        b = .Range("J2").Value 'nb tours total double fret 8m3'+ a
        c = .Range("J4").Value 'nb tours total simple fret 10m3'
        d = .Range("J5").Value 'nb tours total double fret 10m3' + c
     
     
        Ligne = 7
        .Range("J1").Value = TheFeuil1.Cells(Ligne, 3).Value
        .Range("M1").Value = TheFeuil1.Range("N1").Value
     
        .Range("J2").Value = TheFeuil1.Cells(Ligne, 6).Value
        .Range("M2").Value = TheFeuil1.Range("P1").Value
     
        .Range("J4").Value = TheFeuil1.Cells(Ligne, 9).Value
        .Range("M4").Value = TheFeuil1.Range("N3").Value
     
        .Range("J5").Value = TheFeuil1.Cells(Ligne, 12).Value
        .Range("M5").Value = TheFeuil1.Range("P3").Value
     
    End With
    Je vais relire un peu tes messages pour voir si j'y trouve quelques réponses
    [/Edit]
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  9. #9
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Re
    J'ai repris le 1er code pour essayer de comprendre, j'ai refait l'indentation, elle est différente de celle proposé par FVandermeulen a toi de dire celle qui convient.
    J'éditerais le message au fur est a mesure que je commenterais 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
    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
    Sub combinaison()
    [A7.I65536].ClearContents
    Dim n22 As Integer, x22 As Integer, n42 As Integer, x42 As Integer, n23 As Integer, x23 As Integer, n43 As Integer, x43 As Integer, Z As Integer, X As Integer, a As Integer, Aa As Integer, Ab As Integer
    Dim T22 As Single, T42 As Single, T23 As Single, T43 As Single, MAX As Integer, MIN As Integer, Y As Integer, W As Integer
    Dim Ligne As Long
     
    Z = [A1]
    X = [F1]
    Aa = [A3]
    Ab = [F3]
    T22 = [J1]
    T42 = [L1]
    T23 = [J3]
    T43 = [L3]
    MAX = [N1]
    MIN = [N3]
    Ligne = 7
     
    For n22 = 0 To Z 'on boucle 4 fois (0, 1, 2, 3) alors qu'on a que 3 tournée (Z =3) | For n22 = 1 To Z serait mieux non?
        For x22 = 0 To X
            For n42 = 0 To Z
                For x42 = 0 To X
                    For n23 = 0 To Z
                        For x23 = 0 To X
                            For n43 = 0 To Z
                                For x43 = 0 To X
     
                                    a = n22 * x22 * 8 + n42 * x42 * 8 + n23 * x23 * 10 + n43 * x43 * 10
                                    '   1       2
                                    If n22 = 0 Xor x22 = 0 Then a = 0 'attention avec Xor si n22 et x22 sont à 0, ta condition n'est pas validé - alors qu'avec Or à la place de Xor oui
                                    If n42 = 0 Xor x42 = 0 Then a = 0
                                    If n23 = 0 Xor x23 = 0 Then a = 0
                                    If n43 = 0 Xor x43 = 0 Then a = 0
     
     
                                    If Aa < a And a <= Ab Then
                                        Cells(Ligne, 1).Value = n22
                                        Cells(Ligne, 2).Value = x22
                                        Cells(Ligne, 3).Value = n42
                                        Cells(Ligne, 4).Value = x42
                                        Cells(Ligne, 5).Value = n23
                                        Cells(Ligne, 6).Value = x23
                                        Cells(Ligne, 7).Value = n43
                                        Cells(Ligne, 8).Value = x43
                                        Cells(Ligne, 9).Value = a
     
     
                                        For Y = x22 To x42
                                            For W = x23 To x43
                                                If MIN * Y <= n22 * T22 * x22 + n42 * x42 * T42 And n22 * T22 * x22 + n42 * x42 * T42 <= MAX * Y Xor MIN * W <= n23 * T23 * x23 + n43 * T43 * x43 And n23 * x23 * T23 + n43 * x43 * T43 <= MAX * W Then
                                                    Ligne = Ligne + 1
                                                End If
     
                                            Next
                                        Next
                                    End If 'ajouté
                                Next
                            Next
                        Next
                    Next
                Next
            Next
        Next
    Next
     
     
    End Sub
    Une question, clairement tu cherches a créer un tableau pour connaitre toutes les possibilités c'est bien le but de ton code?
    A++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 40
    Par défaut
    voici mon fichier complet: http://cjoint.com/?egtGtDzZfO

    dans la discussion, j'étais partie sur une première hypothèse de temps:
    If MIN * Y <= n22 * T22 * x22 + n42 * T42 * x42 And n22 * T22 * x22 + n42 * T42 * x42 <= MAX * Y And MIN * W <= n23 * T23 * x23 + n43 * T43 * x43 And n23 * T23 * x23 + n43 * T43 * x43 <= MAX * W Then

    Ligne = Ligne + 1

    mais cette hypothèse n'est pas bonne: elle prend des cas où les camions font plus de 7h de travail quand tu décomposes et elle en élimine surement qui sont corrects.

    Je pensais repartir sur une nouvelle condition selon ce que tu m'as envoyé dimanche.

    Moi je souhaite conserver les cas où:
    n22=x22=0
    n42=X42=0
    n23=x23=0
    n43=x43=0

  11. #11
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Ok alors voila si tu prend l'exemple que tu donne plus haut

    Citation Envoyé par Emma95
    Camion 1: 3 tours en simple fret + 1 tour en double: Ttot= 5,99 h
    Camion 2: 3 tours en simple fret + 1 tour en double: Ttot=5,99 h
    Camion 3: 3 tours en double: Ttot=6, 525h
    Si tu suis le raisonnement que je t'ai donné plus haut tu obtiens

    Camion1: 3D = 6.525
    Camion2: 2D + 2S = 6.8944
    Camion3: 4S = 5.0888

    le but était de caser 5D et 6S, ici on vois que cette organisation te permet même de rajouter 1S au 3eme camion.

    Ok pour l'histoire de valeur a 0, elles permettent de traiter un cas ou pas de tournée 8m3 mais quand même des 10m3.

    Je regarde ton fichier pour voir comment intégrer ça au mieux.
    [Edit]
    Ton fichier est toujours fait dans l'optique de chercher toutes les solution, mais dans quel fichier tu listes les intervention qui sont a faire?
    [/Edit]

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 40
    Par défaut
    j'ai une condition de cubage (à évacuer par jour) à respecter. C'est mon Aa et Ab

  13. #13
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Ton fichier est toujours fait dans l'optique de chercher toutes les solution, mais dans quel fichier tu listes les intervention qui sont a faire?


    Pour le cubage, tu veux dire que placer 1 tournée simple de plus ne te servirait a rien par exemple ? si c'est le cas, il va etre difficile de faire un code qui organise au mieux les tournées ET qui fait attention a repartir les charges de chaque camion afin de donner le mm travail a tous sans dépasser sans dépasser le cubage

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 40
    Par défaut
    mon cubage dépend du rendement de ma pelle.

    Ma pelle par jour ne pourra pas faire plus de Ab m3

  15. #15
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    ha mais ok, j'avais pas les bonnes idées en tête, j'étais partie sur un service de livraison de colis, ce qui en soit ne change rien, mais ça explique les temps fixé qui peuvent être respecté et en effet les histoire de cubage max.

    Par contre a quoi correspond le fret simple et double?

    Salut
    Alors avec les infos que tu m'as transmises, voila un début de raisonnement, j'arrête pour ce soir par ce qu'il y a une petite difficulté de raisonnement et que vu que je suis fatigué, j'ai 90% de chance de faire n'importe quoi ^^.

    Le but de ce code sera de tester toutes le possibilité et en fonction des réglages que tu auras donnés d'en sortir ceux sont les plus adaptés enfin si ça fonctionne

    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
    Sub emma95()
    Dim Min10 As Integer, Min8 As Integer, Min6 As Integer 'Represente le nombre mini de camion de chaque type dispo pour le chantier
    Dim Max10 As Integer, Max8 As Integer, Max6 As Integer 'Represente le nombre maxi de camion de chaque type dispo pour le chantier
    Dim NbrCamion As Integer 'Nombre de camion dans la flotte
    Dim Tab_Flotte() As Integer 'Tableau qui representera la flotte de vehicule dispo (on le dimentionnera plus loin)
    Dim TheCamion As Integer 'Le camion pointé dans le Tableau precedent
    Dim Cm As Integer 'Nombre maxi de camion que l'on souhaite voir sur le chantier
    Dim x As Integer, y As Integer, z As Integer 'Nombre de vehicule de chaque type x-10m3 y-8m3 z-6m3
    Dim NbrSF As Integer, NbrDF As Integer 'Nombre de trajet en fonction du type
    Dim Tmax As Single, Tsf As Single, Tdf As Single 'Les temps de reference (on pourrait si besoin faire des Tsf,Tdf differents en fonction du type de vehicule)
    Dim MinVe As Integer, MaxVe As Integer 'Quantité mini/maxi de terre Evacué
    Dim MinVr As Integer, MaxVr As Integer 'Quantité mini/maxi de Remblai rapporté
    Dim TotalVe As Integer, TotalVr As Integer 'Les Quantité maxi pour une configuration de flotte donnée
    Dim TmpI As Integer 'on a toujours besoin d'un ptit temporaire ;)
     
    'On defini (ces valeurs seront recuperées dans le tableau)
    Cm =
    Tmax =
    Tsf =
    Tdf =
    MinVe =
    MaxVe =
    MinVr =
    MaxVr =
    Min10 =
    Max10 =
    Min8 =
    Max8 =
    Min6 =
    Max6 =
     
     
     
    'On commence par créer un boucle qui va nous generer toutes les flottes possible
    For x = Min10 To Max10
        For y = Min8 To Max8
            For z = Min6 To Max6
                'On verifie que la flotte de vehicule n'est pas plus importante que demandé
                NbrCamion = x + y + z
                If NbrCamion <= Cm Then
                    'On renseigne le tableau (exemple si x=3, y=4, z=2 | on veut un tableau contenant 10|10|10|8|8|8|8|6|6 )
                    ReDim Tab_Flotte(NbrCamion - 1)
                    For TmpI = 0 To NbrCamion - 1
                        If TmpI < x Then
                            Tab_Flotte(TmpI) = 10
                        ElseIf TmpI < x + y Then
                            Tab_Flotte(TmpI) = 8
                        Else
                            Tab_Flotte(TmpI) = 6
                        End If
                    Next
                    'On initialise les valeurs Total, elles representeront le volume maxi que cette flotte pourra charrier
                    TotalVe = 0
                    TotalVr = 0
     
                    'On boucle sur chaque vehicule de la flotte
                    For Each TheCamion In Tab_Flotte
                        'Je fatigue :D, je vais arreter la avant de faire fausse piste ;) a demain
     
     
    End Sub
    J'ai commenté un maximum le code pour que tu puisses te l'approprier, si tu ne comprend pas certain passage demande.

    A++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 40
    Par défaut
    merci pour ce début de code. Pour l'instant, je mets de côté le cas du 6m3, je préfère me concentrer sur les 2 autres types de camion.

    Mais je vois pas trop comment tu comptes faire intervenir ma condition sur les cubages.
    Mon min10, min8 seront égales à 0 et le max10 et max8 proviendront de mes combinaisons vérifiant ma condition de cubage? Ce code est la suite de ce que j'ai déjà où il reprend tout depuis le début?

    je t'avoue que je comprends pas bien non plus comment tu organises ton tableau.

  17. #17
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut
    Je ne vais pas pouvoir passer beaucoup de temps ce soir, pour répondre a tes questions

    Pour ce qui est des cubage ça va venir, en faite je part sur le principe de déterminer le nombre de camion le plus adapté a ton besoin, donc plus tard dans le code (pas bien loin après ce que je t'ai déjà donnée) je vérifierais si l'organisation respect les rendement, ça se met en place petit a petit dans ma tête, tu as beaucoup de paramètres, il n'est pas facile de les intégrer au mieux.

    Pour min10,min8,min6, je l'ai est intégré car ils te permettront de définir une flotte de véhicule, par exemple tu es sur de vouloir au moins 1 camion de 10m3, c'est suite a une de tes remarques et ça ne gate rien de le mettre.

    Le code reprend tout depuis le début, peut être que je vais dans le mur, on le saura assez vite

    Pour le tableau c'est très simple, je te l'expliquerais, je temporise car je ne sais pas s'il va garder cette structure pour l'instant.

    J'ai une question qui m'empêche d'avancer, je sais que tu voulais traiter le problème de ton remblai plus tard, mais il est souvent très néfaste de laisser des détails comme celui ci de coté, car il est par la suite très compliqué de les intègre dans un code déjà réfléchi sans eux (c'est pour ça que j'ai intégré de suite les 6m3).
    Donc ma question est la suivante, comment tu détermines la quantité de remblai que tu souhaites faire rentrer? est ce que c'est vraiment secondaire ou est ce que tu sais par avance ce dont tu as besoin.


    A++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 40
    Par défaut
    on pourra dire, je veux X m3 de remblais1 qui sera mis en oeuvre avec un rendement de Y m3/j. Je veux W m3 de remblais 2.

    Quand on ajoute les remblais, ç

    quand on ajoute les remblais, ça signifie qu'il va y avoir de nouvelles conditions en ce qui concerne le double fret.

    Pour l'instant je pars avec seulement un type de remblais. Donc il faut faire une correspondance entre le nb de tours, le nb de camions, le type de camions pour le double fret en déblais et remblais.

  19. #19
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut
    Oulala y'a plusieurs type de remblai en plus ... ça va devenir vraiment compliquer ton histoire :s
    Quoique non, ça dépend si ce remblai vient du même endroit et donc a le même temps de trajet

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  20. #20
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 40
    Par défaut
    sinon si on réfléchit pour un nombre de tours total par type de camion et type de trajet (N22, N42, N23, N43). Comme dans ce fichier http://cjoint.com/?eipN0l0CIK


    je pose s22 = le tps total pr faire les N22 tours
    s42 pour les N42 tours
    s23 pour les N23 tours
    s43 pour les N43 tours.

    X= nb de camions associés à chaque type de camions et chaque type de trajet

    Je concentre uniquement sur le cas d'un 10m3.
    cas 1: s23<=s43

    a) if s23=s43=0 then 'on va à la ligne suivante
    b) if s23=0 then
    For X43= 1 to n
    'on cherche X43 tel que
    s43<= 7h*X43

    Xtot=X43


    c) if s23<7h then X23=1
    soit B=7H - s23
    i) if B<T43 then
    for X43=1 to n
    7h*(X43-1)<= s43<= 7h*X43
    Xtot= X23+X43=1+X43

    ii) if B>T43
    soit C= s43 - B
    for X43 = 1 to n
    7h*(X43-1)<=C<=7h*X43
    Xtot=X23+X43=1+X43

    d)if s23> 7h then
    For X23=2 to n
    7h*(X23-1)<= s23 <= 7h*X23
    X23=...
    soit D=7h*X23 - s23

    i)if D<T43 then
    For X43= 1 to n
    7h*(X43-1)<= s43 <= 7h*X43
    Xtot=X23+X43


    ii) if D > T43 then
    if D < s43 then X43=1
    Xtot=X23+1

    iii) if D>T43 then
    if D>s43 then E=D - s43
    For X43=1 to N
    7h*(X43 - 1)<= E <= 7h*X43
    Xtot= X43+x23



    après il faut faire la même chose pour s43<s23
    et s22 et S42

    et non les remblais ne sont pas obligés de venir du même endroit

Discussions similaires

  1. Réponses: 0
    Dernier message: 25/03/2013, 14h39
  2. Faire un tableau a nombre de colonnes variables
    Par mcfly37 dans le forum Tapestry
    Réponses: 8
    Dernier message: 17/09/2010, 14h21
  3. [RegEx] Analyse de tableau HTML avec nombre variable de cases
    Par ddelec24 dans le forum Langage
    Réponses: 9
    Dernier message: 11/04/2009, 21h39
  4. Réponses: 8
    Dernier message: 14/11/2007, 10h27
  5. Réponses: 1
    Dernier message: 05/01/2007, 15h33

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