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 :

Passage de variable de type tableau entre feuille ds des fonctions/procedures ?


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 172
    Points : 72
    Points
    72
    Par défaut probleme d ecriture dans une feuille active !!!
    Tout d abord je vous presente mes meilleurs voeux pr 2008

    Depuis peu je travaille sous excel et plus precisement sous VBA.

    Mon probleme est le suivant:

    En cliquant sure le bouton "Semaine précédente" ou "Semaine courante" je récupère des données d'une feuille (pas de probleme pour l instant), je les organise de cette maniere dans la plage de données que voici :


    Le nom des pharmaciens est à entrer à la main.

    Ensuite je clique sur le bouton "Générer Feuille", un tri dans la plage s opère en fonction du numero de lot et certaines vérifications s effectuent.
    Les données de cette plage sont stockées dans la structure suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim tabCommande() As Commande
     
    Private Type Commande
        Client As String
        NomProduit As String
        Atelier As String
        NumLot As String
        NbPalette As Integer
        DateFinFab As Date
        Pharmacien As String
    End Type


    Une fois les données récupérées, je dois :
    - créer des feuilles, 1 feuille par pharmacien avec x vignettes (chaque feuille contiendra x vignettes en fonction des données ci-dessus)
    - formater ces feuilles de facon à afficher des petites vignettes prete à être découper (j ai déjà la fonction de formatage)


    Le problème est que je n arrive pas à passer les données ( du tableau de commande ) d'une feuille à une autre par des fonctions/procédures.


    Pouvez vous m aider ?

    Merci

  2. #2
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 121
    Points : 119
    Points
    119
    Par défaut
    Te serait-il possible de nous envoyer le fichier excel qu'on puisse y regarder car des explications ne sont pas tres claires.

    A premiere vue, ça ne me semble pas tres complexe a faire...

  3. #3
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 172
    Points : 72
    Points
    72
    Par défaut
    Je suis en train de faire des modifications en ce moment.
    Je vous donne ma/mes fonction(s) quand j aurai effectué mes changements, surement en début d'apres midi.

    merci bien

  4. #4
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 172
    Points : 72
    Points
    72
    Par défaut
    Je sais pas si ça va vous aider mais tout le code se trouve dans la meme feuille.

    J ai lu l'aide de silkyroad sur les tableau ( http://silkyroad.developpez.com/vba/tableaux/#LXIII ) mais ça ne marche pas :s

    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
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    ' Dans les déclaraction 
    ' Je declare un tableau de commande
    Dim tabCommande() As Commande
     
    Private Type Commande
        Client As String
        NomProduit As String
        Atelier As String
        NumLot As String
        NbPalette As Integer
        DateFinFab As Date
        Pharmacien As String
    End Type
     
    Sub GenererFeuille()
        'Cellule mise a jour quand on génère la plage en cliquant sur les bouton générer
        nbLigneCommande = Feuil1.Cells(5, 8)
        nbLigneDecalage = myConst.myLigneDecalage
     
        Dim i, j, x, inc, nbFeuilles, nbPaletteTmp As Integer
     
        nbPalettesTmp = 0
     
        nbFeuilles = Worksheets.Count
        'Définit la taille du tableau
        ReDim TabNomFeuille(nbfeuille)
        'MsgBox Worksheets.Count
     
        ' Tableau qui va servir à savoir si les pharmaciens ont bien été entré.
        ReDim tabPharmacien(nbLigneCommande)
     
        '**********
        '*** boolean qui prendra la valeur false si un champ pharmacien n a pas été rempli
        '**********
        Dim pharmacienOk As Boolean
        pharmacienOk = True
     
        '**********
        '*** On crée notre plage de données à trier
        '**********
        Dim plageDonnees, col1, col2 As String
        plageDonnees = "A" & nbLigneDecalage & ":G" & nbLigneDecalage + Feuil1.Cells(5, 8) - 1
        col1 = "D" & nbLigneDecalage
        col2 = "B" & nbLigneDecalage
     
        '**********
        '*** Trie la plage de données par ordre alphabétique du numLot et du nomProduit
        '**********
        Range(plageDonnees).Select
        Selection.Sort Key1:=Range(col1), Order1:=xlAscending, _
            Key2:=Range(col2), Order2:=xlAscending, OrderCustom:=1, Orientation:=xlTopToBottom _
     
        '**********
        '*** On vérifie qu'on a bien saisi tous les pharmaciens
        '**********
        For j = 0 To nbLigneCommande - 1
            If (Feuil1.Cells(nbLigneDecalage + j, 7) <> "") Then
                tabPharmacien(j) = Feuil1.Cells(nbLigneDecalage + j, 7)
            Else
                MsgBox "Veuillez renseigner le nom du pharmacien à la ligne " & nbLigneDecalage + j
                pharmacienOk = False
            End If
        Next j
     
        '**********
        '*** On vérifie si pr chaque couple numLot/nomProduit on a un meme pharmacien
        '**********
        For inc = 0 To nbLigneCommande - 1
            NumLot = Feuil1.Cells(nbLigneDecalage + inc, 4)
            NomProduit = Feuil1.Cells(nbLigneDecalage + inc, 2)
            Pharmacien = Feuil1.Cells(nbLigneDecalage + inc, 7)
            Do
                If (Feuil1.Cells(nbLigneDecalage + inc + 1, 4) = NumLot) Then
                    If (Feuil1.Cells(nbLigneDecalage + inc + 1, 2) = NomProduit) Then
                        If (Pharmacien <> Feuil1.Cells(nbLigneDecalage + inc + 1, 7)) Then
                            MsgBox "Attention !" & vbCrLf & _
                                "Ligne " & nbLigneCommande + inc & " et Ligne " & nbLigneCommande + inc + 1 & vbCrLf & _
                                "Pour le numéro de lot """ & NumLot & """, les pharmaciens sont différents." & vbCrLf & _
                                "Ils devraient être identiques. Corrigez SVP"
                                '"nomProduit=" & nomProduit & vbCrLf & _
                                '"Pharmacien=" & Pharmacien
                            pharmacienOk = False
                            Exit Do
                        End If
                    End If
                Else
                    Exit Do
                End If
                NumLot = Feuil1.Cells(nbLigneDecalage + inc + 1, 4)
                NomProduit = Feuil1.Cells(nbLigneDecalage + inc + 1, 2)
                Pharmacien = Feuil1.Cells(nbLigneDecalage + inc + 1, 7)
     
                inc = inc + 1
            Loop While inc < nbLigneCommande
     
        Next inc
     
     
        '**********
        '*** On redimensionne le tableau en fonction du nombre de ligne
        '**********
        ReDim tabCommande(nbLigneCommande)
     
        Dim newTailleTabCommande As Integer
        newTailleTabCommande = nbLigneCommande
     
        '**********
        '*** On a bien selectionné tous les pharmaciens
        '**********
        If (pharmacienOk = True) Then
     
            '**********
            '*** Si la 1ere ligne est differente de "", on va recalculer la taille du tableau
            '*** On diminue de "1" qd on est sur un meme numero de lot avec le meme nom de produit
            '*** (aucun probleme pour les pharmaciens puisque le teste a été effectuer au dessus
            '**********
            If (Feuil1.Cells(nbLigneDecalage, 1) <> "") Then
     
                For i = 0 To nbLigneCommande - 1
                    NumLot = Feuil1.Cells(nbLigneDecalage + i, 4)
                    'Pharmacien = Feuil1.Cells(nbLigneDecalage + inc, 7)
     
                    If (Feuil1.Cells(nbLigneDecalage + i + 1, 4) = NumLot) Then
                        NomProduit = Feuil1.Cells(nbLigneDecalage + i, 2)
     
                        If (Feuil1.Cells(nbLigneDecalage + i + 1, 2) = NomProduit) Then
                            newTailleTabCommande = newTailleTabCommande - 1
                        End If
     
                    End If
     
                    NumLot = Feuil1.Cells(nbLigneDecalage + i + 1, 4)
                    NomProduit = Feuil1.Cells(nbLigneDecalage + i + 1, 2)
                    'Pharmacien = Feuil1.Cells(nbLigneDecalage + i + 1, 7)
                Next i
     
            Else
                MsgBox "Veuillez générer le tableau ""Semaine Précédente"" ou ""Semaine Courante"" avant de générer les vignettes"
            End If
     
            Dim laDate As Date
            ReDim tabCommande(newTailleTabCommande)
            j = 0
     
            '**********
            '*** On va regrouper les commandes par lot :
            '*** - on compte les palettes
            '*** - on vérifie la date et choisi la date la plus tard
            '**********
            For i = 0 To nbLigneCommande - 1
     
                NomProduit = Feuil1.Cells(nbLigneDecalage + i, 2)
                NumLot = Feuil1.Cells(nbLigneDecalage + i, 4)
                nbPaletteTmp = Feuil1.Cells(nbLigneDecalage + i, 5)
                laDate = Feuil1.Cells(nbLigneDecalage + i, 6)
     
                Do While (NumLot = Feuil1.Cells(nbLigneDecalage + i + 1, 4) And NomProduit = Feuil1.Cells(nbLigneDecalage + i + 1, 2))
     
                    If (laDate < Feuil1.Cells(nbLigneDecalage + i + 1, 6)) Then
                        laDate = Feuil1.Cells(nbLigneDecalage + i + 1, 6)
                    End If
     
                    nbPaletteTmp = nbPaletteTmp + Feuil1.Cells(nbLigneDecalage + i + 1, 5)
                    i = i + 1
     
                Loop
     
                tabCommande(j).Client = Feuil1.Cells(nbLigneDecalage + i, 1)
                tabCommande(j).NomProduit = Feuil1.Cells(nbLigneDecalage + i, 2)
                tabCommande(j).Atelier = Feuil1.Cells(nbLigneDecalage + i, 3)
                tabCommande(j).NumLot = Feuil1.Cells(nbLigneDecalage + i, 4)
                tabCommande(j).NbPalette = nbPaletteTmp
                tabCommande(j).DateFinFab = laDate
                tabCommande(j).Pharmacien = Feuil1.Cells(nbLigneDecalage + i, 7)
     
                If (i <> nbLigneCommande - 1) Then
                    NumLot = Feuil1.Cells(nbLigneDecalage + i + 1, 4)
                End If
     
                j = j + 1
            Next i
     
     
        End If
        '**********
        '*** Fin du "If (pharmacienOk = True)"
        '**********
     
        'For i = 0 To UBound(tabCommande) - 1
     
        '    Feuil1.Cells(24 + i, 1) = tabCommande(i).Client
        '    Feuil1.Cells(24 + i, 2) = tabCommande(i).NomProduit
        '    Feuil1.Cells(24 + i, 3) = tabCommande(i).Atelier
        '    Feuil1.Cells(24 + i, 4) = tabCommande(i).NumLot
        '    Feuil1.Cells(24 + i, 5) = tabCommande(i).NbPalette
        '    Feuil1.Cells(24 + i, 6) = tabCommande(i).DateFinFab
        '    Feuil1.Cells(24 + i, 7) = tabCommande(i).Pharmacien
     
        'Next i
     
     
     
        Dim tabTriPharmacien() As Commande
        Dim tabTmp() As Commande
        tabTriPharmacien() = tabCommande()
     
        ReDim tabTmp(1)
     
        Dim longueur As Integer
        Dim permut As Integer
        Dim retour As Integer
     
        Dim ch1 As String
        Dim ch2 As String
     
        longueur = UBound(tabTriPharmacien)
     
        '**********
        '*** Tri à bulle, trie le tabTriPharmacien par ordre de nom de pharmacien
        '**********
        Do
            permut = 0
     
            For i = 0 To longueur - 1
     
                ch1 = tabTriPharmacien(i).Pharmacien
                ch2 = tabTriPharmacien(i + 1).Pharmacien
                retour = comparCh(ch1, ch2)
                If (retour = 2 And i <> 7) Then
                    tabTmp(0) = tabTriPharmacien(i)
                    tabTriPharmacien(i) = tabTriPharmacien(i + 1)
                    tabTriPharmacien(i + 1) = tabTmp(0)
                    permut = 1
     
                End If
            Next i
     
        Loop While permut = 1
     
        '*********
        '*** Affichage des données stockées ds le tableau de commande
        '*********
        'For j = 0 To newTailleTabCommande - 1
        '
        '        MsgBox "J=" & j & vbCrLf & _
        '               "Client: " & tabCommande(j).Client & vbCrLf & _
        '               "Produit: " & tabCommande(j).NomProduit & vbCrLf & _
        '               "Atelier: " & tabCommande(j).Atelier & vbCrLf & _
        '               "Lot: " & tabCommande(j).NumLot & vbCrLf & _
        '               "Nb Palettes: " & tabCommande(j).NbPalette & vbCrLf & _
        '               "Date: " & tabCommande(j).DateFinFab & vbCrLf & _
        '               "Pharmacien: " & tabCommande(j).Pharmacien
        '
        '
        '
        'Next j
     
     
     
     
        'on génère les feuilles puis les étiquettes
        'For i = 0 To UBound(tabcommande) - 1
            'on créé une feuille si elle n existe pas encore
        '    If (Not FeuilleExiste(ThisWorkbook, tabcommande(i).Pharmacien)) Then
        '        sheets.Add.Name = tabcommande(i).Pharmacien
        '        sheets(tabcommande(i).Pharmacien).Move after:=Worksheets(Worksheets.Count)
                'Sheets(tabCommande(i).Pharmacien).GenererEtiquette (tabCommande(i).Pharmacien)
        '    End If
     
            'ensuite on va creer les vignettes
            'le tableau est trié dans l'ordre alphabétique par rapport au numLot et designation
     
        'Next i
     
        ' Ensuite j ai besoin de passer mon tableau de commande à la procedure
        ' GenererEtiquette mais je n y arrive pas :(
     
        Dim VarTemp As Variant
        VarTemp = tabTriPharmacien()
     
        GenererEtiquette VarTemp
     
    End Sub
     
     
     
    Sub GenererEtiquette(ByVal VarTab As Variant)
     
        Dim i, j, nbEtiquette, nbLigne As Integer
        Dim monClasseur, pharma As String
     
        Dim tabTrierCommande() As Commande
        tabTrierCommande() = VarTab
     
        ...
    End Sub
    voila, s il vous plait aider moi

  5. #5
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 903
    Points
    55 903
    Billets dans le blog
    131
    Par défaut
    Salut

    Peux-tu préciser clairement ce qui pose problème?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  6. #6
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 172
    Points : 72
    Points
    72
    Par défaut
    Mon probleme est que je n arrive pas a faire passer mon tableau à la procedure GenererEtiquette

    J ai deja essayer ça, mais ça ne marche pas !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub GenererFeuille()
        ......
        ' tabTriPharmacien est un tableau de commande trier par nom de pharmacien alphabetiquement
        GenererEtiquette tabTriPharmacien()
     
    End Sub
     
    Sub GenererEtiquette(tab() As Commande)
     
        ...
     
    End Sub
    J ai testé aussi ça mais ça ne marche pas non plus
    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
    Sub GenererFeuille()
        ......
     
        Dim VarTemp As Variant
        VarTemp = tabTriPharmacien()
     
        GenererEtiquette VarTemp
     
    End Sub
     
    Sub GenererEtiquette(ByVal VarTab As Variant)
     
        ...
     
    End Sub

  7. #7
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 144
    Points
    20 144
    Par défaut
    bonjour


    Sub GenererEtiquette(tab() As Commande)
    Tab est un mot clé réservé.


    Tu peux réessayer en utilisant un autre terme:

    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
    Option Explicit
     
    Private Type Commande
        Client As String
        NomProduit As String
    End Type
     
     
    Sub GenererFeuille()
        Dim tabTriPharmacien(2) As Commande
     
        tabTriPharmacien(0).Client = "X1"
        tabTriPharmacien(0).NomProduit = "Prod1"
        tabTriPharmacien(1).Client = "X2"
        tabTriPharmacien(1).NomProduit = "Prod2"
     
        GenererEtiquette tabTriPharmacien()
     
    End Sub
     
     
    Sub GenererEtiquette(varTab() As Commande)
        MsgBox varTab(0).Client & "/" & varTab(0).NomProduit
    End Sub


    bon week end
    michel

  8. #8
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 172
    Points : 72
    Points
    72
    Par défaut
    resolu

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 04/09/2013, 13h53
  2. Passage de variable de type array entre procédures événementielles
    Par Harry Covair dans le forum Général VBA
    Réponses: 1
    Dernier message: 16/07/2010, 13h43
  3. [SQL] PB Partage d'une variable de type tableau d'une page PHP à une autre
    Par fredav dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 02/11/2007, 14h21
  4. [Tableaux] Variable de type tableau
    Par tiyolx dans le forum Langage
    Réponses: 12
    Dernier message: 13/10/2006, 10h14
  5. [VB6]Transferts VARIABLES de TYPE Utilisateurs entre FORMS
    Par KNITTEL dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 24/03/2006, 14h21

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