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 :

Faire un tableau multi-dimensionnel, pas facile (intégrer et trier)


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2008
    Messages : 87
    Points : 65
    Points
    65
    Par défaut Faire un tableau multi-dimensionnel, pas facile (intégrer et trier)
    Bonjour,

    Merci d'avance pour essayer de m'aider, j'espère que l'on y arrivera .

    A la base je voulais de l'aide pour un tri de données dans mon tableau dimensionnelle à 3 colonnes et x lignes.

    Mais je vais vous expliquer mon Objectif = Determiner pour chaque commande une date de rupture du produit sans prendre en compte la commande puis avec la commande et s'il y a plusieurs commandes reboucler avec les commandes précédentes.
    Pour ce faire j'ai la liste des besoins dans un onglet et j'ai une liste de commande que je remets en forme pour ajouter les informations citées ci-dessus.

    J'ai réussi à integrer les besoins et la commande dans un tableau dimensionnelle mais je séche sur le tri car la commande va être intégrer en début de tableau et les besoins par la suite donc lors de mon tri j'ai la derniere ligne qui ne s'affiche pas.
    J'obtiens dans la fenêtre d'execution sans le tri, ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
                                    1429,73 'stock de départ Tabbesoin(0,3)
    'date             qté          cumul
    'tabbesoin(i,1) tabbesoin(i,2) tabbesoin(i,3)
    15/01/2011     1000          2429,73 
    25/10/2010    -85,83         2343,9 
    25/10/2010    -143,02        2200,88 
    04/11/2010    -143           2057,88 
    03/01/2011    -143           1914,88 
    06/01/2011    -143           1771,88 
    12/01/2011    -143           1628,88 
    18/01/2011    -143           1485,88 
    24/01/2011    -143           1342,88 
    27/01/2011    -143           1199,88
    Et voilà ce que j'obtiens avec mon tri, le cumul se fait après le tri bien sûr :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
                                 1429,73 'stock de départ Tabbesoin(0,3)
    'date             qté          cumul
    'tabbesoin(i,1) tabbesoin(i,2) tabbesoin(i,3)
    25/10/2010    -85,83         1343,9 
    25/10/2010    -143,02        1200,88 
    04/11/2010    -143           1057,88 
    03/01/2011    -143           914,88 
    06/01/2011    -143           771,88 
    12/01/2011    -143           628,88 
    15/01/2011     1000          1628,88 
    18/01/2011    -143           1485,88 
    24/01/2011    -143           1342,88 
                                 1342,88
    la ligne du 27/01/2010 ne se réécrit pas.

    et voici 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
     
    Option Explicit
    Option Base 0
    Sub Couverture_Cde()
     
    ' Macro crée le 28/10/2010 par Bilbault Wilfried
    '____________________________________________________________________________________________________________________________________
     
    '----------------------------------------------------------------Déclaration des variables-------------------------------------------
        Dim i As Integer, j As Long, Daterupture As Date, Stock As Variant, Codearticle As Variant, finListe As Long, x As Long
        Dim dpt As Integer, z As Integer, NbreCde As Integer, finBes As Long, cpteur As Integer, y As Integer, t As Variant
     
        Dim wsB As Worksheet, wsS As Worksheet, wsC As Worksheet
     
        'Définit le tableau à 2 dimensions ainsi que leur taille.
        Dim TabBesoin(0 To 65535, 1 To 4) As Variant
     
    Set wsB = Sheets("Besoin")
    Set wsS = Sheets("Total stock")
     
    ''-----------------------------------------------------------Mise en forme la liste des commandes-------------------------------------
    ''Tri des commandes par code puis date de libération
    'Sheets("Ordre d'achat").Copy Before:=Sheets(2)
    '
    'Sheets("Ordre d'achat (2)").Name = "Analyse Commande"
     
    Set wsC = Sheets("Analyse Commande")
    finListe = wsC.Range("A65536").End(xlUp).Row
    'dernier besoin
    finBes = wsB.Range("A65536").End(xlUp).Row
    x = 2
    For x = 2 To finListe Step 1
     
        Codearticle = 15    'wsC.Cells(x, 1)
        NbreCde = WorksheetFunction.CountIf(wsC.Columns(1), Codearticle)
     
    Erase TabBesoin
     
    ' Récupération du stock associé au code article commandé
            Stock = WorksheetFunction.SumIf(wsS.Columns(1), Codearticle & "Stock-Accepté", wsS.Columns(3)) + _
                    WorksheetFunction.SumIf(wsS.Columns(1), Codearticle & "Stock-Quarantaine", wsS.Columns(3))
    '----------------------------------------------------------------Calcul de la rupture-----------------------------------------------------------------------
    ' intégration du stock dans le tableau
            TabBesoin(0, 3) = Stock
    dpt = 1
    i = 1
    cpteur = 0
    'intégration des commandes dans le tableau (partie à revoir car ne fonctionne pas avec plusieurs commandes)
        For dpt = 1 To NbreCde
        'date du commande
        TabBesoin(i, 1) = wsC.Cells(x + cpteur, 5)
        'quantité
        TabBesoin(i, 2) = wsC.Cells(x + cpteur, 3)
        i = i + 1
     
        'intégration des besoins correspondants au code article commandé
            For j = 2 To finBes
            'conditions pour incrementer le tableau dimensionnelle
                If wsB.Cells(j, 3) = Codearticle And wsB.Cells(j, 8) = "Ferme" And (wsB.Cells(j, 7) Like "M*") = False Then
                    'date du besoin
                    TabBesoin(i, 1) = wsB.Cells(j, 1)
                    'quantité
                    TabBesoin(i, 2) = wsB.Cells(j, 5) * -1
                    i = i + 1
                End If
            Next j
     
    'boucle de tri
        For z = 1 To i Step 1
            If TabBesoin(z, 1) > TabBesoin(z + 1, 1) Then
                    For y = 1 To 2
                        t = TabBesoin(z, y)
                        TabBesoin(z, y) = TabBesoin(z + 1, y)
                        TabBesoin(z + 1, y) = t
                    Next y
            End If
     
        Next z
     
           'calcul stock projeté et affichage        
    For i = 1 To i
     
            TabBesoin(i, 3) = WorksheetFunction.Round(TabBesoin(i - 1, 3) + TabBesoin(i, 2), 2)
                Debug.Print TabBesoin(i - 1, 1), TabBesoin(i - 1, 2), TabBesoin(i - 1, 3)
    Next i
    Merci beaucoup pour votre aide

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    592
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 592
    Points : 730
    Points
    730
    Par défaut
    Bonsoir,

    C'est un peu hard de te dépanner pour un pb de tri perdu dans un tas de lignes de code qui n'ont rien à voir avec la choucroute.

    Néanmoins il me semble avoir trouvé quelques anomalies. Voici une partie 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
     
     
        'intégration des besoins correspondants au code article commandé
            For j = 2 To finBes
            'conditions pour incrementer le tableau dimensionnelle
                If wsB.Cells(j, 3) = Codearticle And wsB.Cells(j, 8) = "Ferme" And (wsB.Cells(j, 7) Like "M*") = False Then
                    'date du besoin
                    TabBesoin(i, 1) = wsB.Cells(j, 1)
                    'quantité
                    TabBesoin(i, 2) = wsB.Cells(j, 5) * -1
                    i = i + 1
                End If
            Next j
     
    'boucle de tri
        For z = 1 To i Step 1
            If TabBesoin(z, 1) > TabBesoin(z + 1, 1) Then
                    For y = 1 To 2
                        t = TabBesoin(z, y)
                        TabBesoin(z, y) = TabBesoin(z + 1, y)
                        TabBesoin(z + 1, y) = t
                    Next y
            End If
     
        Next z
    Dans la boucle de chargement du TabBesoin la variable i est incrémentée une fois de trop, le dernier TabBesoin(i) n'est pas initialisé, il vaut donc rien).
    Si ta dernière information est en ligne 5, i vaut 6.
    Ensuite quand tu fais le tri, il se retrouve naturellement dans la dernière valeur de ton tableau.
    Enfin avec ton test If TabBesoin(z, 1) > TabBesoin(z + 1, 1) tu compares avec TabBesion(7, )

    De plus ton algorithme de tri ne fonctionne que dans des cas très particuliers.
    Pour le vérifier, il te suffit de mettre en entrée un tableau complètement à l'envers.

    Bonne suite et bonnes modifications

    PPz

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2008
    Messages : 87
    Points : 65
    Points
    65
    Par défaut
    Merci pour ton aide.
    Oui c'est très mal construit surement, mais je ne sais pas comment faire pour incrementer le tableau sans faire un code continu lineaire. En plus je t'ai epargné toutes les mises en formes et la copie d'onglet lol.

    sinon j'ai pris en compte ce que tu m'as dis et j'ai réalisé ce qui suit, ça fonctionne mais c'est certainement pas ça la solution à laquelle tu t'attendais. Ceci étant merci
    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
            For j = 2 To finBes
            'conditions pour incrementer le tableau dimensionnelle
                If wsB.Cells(j, 3) = Codearticle And wsB.Cells(j, 8) = "Ferme" And (wsB.Cells(j, 7) Like "M*") = False Then
                    'date du besoin
                    TabBesoin(i, 1) = wsB.Cells(j, 1)
                    'quantité
                    TabBesoin(i, 2) = wsB.Cells(j, 5) * -1
                    i = i + 1
                End If
            Next j
     
    'boucle de tri
        For z = 1 To (i - 1) Step 1
            If TabBesoin(z, 1) > TabBesoin(z + 1, 1) And Not IsEmpty(TabBesoin(z + 1, 1)) Then
                    For y = 1 To 2
                        t = TabBesoin(z, y)
                        TabBesoin(z, y) = TabBesoin(z + 1, y)
                        TabBesoin(z + 1, y) = t
                    Next y
            End If
     
        Next z

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    592
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 592
    Points : 730
    Points
    730
    Par défaut
    Bonjour,

    Avec cette nouvelle version, je pense qu'il y a encore des problèmes :
    1- à la fin de ta boucle For j = 2 To finBes si la dernière valeur remplie est TabBesoin(5) ta variable i est égale à 6
    2- ensuite tu fais une boucle For z = 1 To (i - 1) Step 1 donc z prendra les valeurs entre 1 et 5, mais dans la boucle tu utilises z+1 TabBesoin(z + 1, 1) tu vas donc utiliser une valeur non initialisée.

    Et pour finir, je te rappelle que ta boucle de tri n'est pas bien programmée. Un tri (programmé de façon simple) doit comporter deux boucles imbriquées pour répondre à tous les cas.

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2008
    Messages : 87
    Points : 65
    Points
    65
    Par défaut
    Merci PPz78,

    Comment je peux faire pour dire d'incrementer le TabBesoin alors ? J'incrémente un 1 seul tableau à partir de 3 sources d'information. Si tu as une idée je veux bien la voir.

    Et pour le tri je vais voir ce que je peux faire.

    Bonne journée,
    Will

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    592
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 592
    Points : 730
    Points
    730
    Par défaut
    Salut,

    le plus simple vu l'état de ton code : à la sortie de ta boucle tu ajoute Le plus propre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            
            i = 0
    For j = 2 To finBes
        'conditions pour incrementer le tableau dimensionnelle
        If wsB.Cells(j, 3) = Codearticle And wsB.Cells(j, 8) = "Ferme" And (wsB.Cells(j, 7) Like "M*") = False Then
            i = i + 1
            'date du besoin
            TabBesoin(i, 1) = wsB.Cells(j, 1)
            'quantité
            TabBesoin(i, 2) = wsB.Cells(j, 5) * -1
        End If
    Next j

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2008
    Messages : 87
    Points : 65
    Points
    65
    Par défaut
    Hy,

    J'ai un peu avancé dans la macro et ça fonctionne. J'ai remplacé l'incrémentation du i comme tu me l'as dis PPz78 et j'ai revue ma boucle de tri.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    'boucle de tri
        For u = 1 To i
            For z = 1 To i - 1
                If CDate(TabBesoin(z, 1)) > CDate(TabBesoin(z + 1, 1)) Then
                    For y = 1 To 2
                        t = TabBesoin(z, y)
                        TabBesoin(z, y) = TabBesoin(z + 1, y)
                        TabBesoin(z + 1, y) = t
                    Next y
                End If
            Next z
        Next u
    C'est nickel ceci fonctionne. Donc déjà un grand Merci pour ton aide.

    Maintenant je veux passer à la seconde partie de mon pb. C'est d'analyser la situation commande après commande.

    voilà mon code à aujourd'hui, ça intégre toutes les commandes à chaque fois :
    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
     
     
        NbreCde = WorksheetFunction.CountIf(wsC.Columns(1), Codearticle)
    'integration des commandes dans le tableau
        For m = 0 To NbreCde - 1
                i = i + 1
                    If m = 0 Then
                        'date du commande
                        TabBesoin(i, 1) = wsC.Cells(x, 5)
                        'quantité
                        TabBesoin(i, 2) = wsC.Cells(x, 3)
                    Else
                        'date du commande
                        TabBesoin(i, 1) = wsC.Cells(x + m, 5)
                        'quantité
                        TabBesoin(i, 2) = wsC.Cells(x + m, 3)
                    End If
    '        End If
        Next m
    et voici ce que ma boucle d'analyse que je souhaite après chaque intégration de commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        'dés que manque ingrédient, relever la date du besoin et sortir de la boucle
        For b = 1 To i
            If TabBesoin(b, 3) < 0 Then
                Daterupture = TabBesoin(b, 1)
                wsC.Cells(x + m, 10) = Daterupture
            End If
        Next b
            If Daterupture = 0 Then
                wsC.Cells(x + m, 10) = "Pas de rupture"
            End If
    Merci je suis vraiment en galère avec ça, à tel point que je me demande si c'est possible. Ca se trouve je m'y prends mal, je ne devrais peut etre pas passer par un tableau multicolonnes.

Discussions similaires

  1. Réponses: 7
    Dernier message: 08/02/2007, 10h52
  2. Réponses: 5
    Dernier message: 04/10/2006, 18h49
  3. [Tableaux] Tableau multi dimensionnel
    Par gids01 dans le forum Langage
    Réponses: 7
    Dernier message: 02/10/2006, 16h18
  4. [Tableaux] tri sur un tableau multi-dimensionnel
    Par nicoaix dans le forum Langage
    Réponses: 1
    Dernier message: 12/04/2006, 21h23
  5. Réponses: 4
    Dernier message: 24/08/2005, 14h09

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