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 :

Manipulation variable tableau 3 dimensions [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Homme Profil pro
    Apprenti GEII
    Inscrit en
    Janvier 2014
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Apprenti GEII
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2014
    Messages : 83
    Points : 109
    Points
    109
    Par défaut Manipulation variable tableau 3 dimensions
    Bonjour,

    J'ai une variable tableau à 3 dimensions dans laquelle je fais pas mal de traitements.

    Prenons la taille Tab(5,10,100) pour l'exemple:
    1ère dimension: nombre de feuilles de calcul
    2ème : Nombre de colonnes
    3ème : Nombre de lignes

    Pour visualiser c'est comme si ce tableau était 5 grilles de 10 * 100 superposées
    (J'ai pris le Nombre de lignes en dernière dimension car seule la dernière dimension est redimensionnable)

    A la fin de mon code je veux transfèrer dans mes 5 feuilles les données du tableau correspondantes.
    Au lieu de boucler sur les éléments du tableau et faire du "point à point" je voudrais savoir si il est possible avec un tableau à 3 dimensions de dire en VBA:

    "Je veux que dans ma feuille 1 dans ma plage allant de Cell(1,1) à Cell(10,100) apparaisse ma grille 10*100 à l'étage 1 de mon tableau"
    ...De la même manière qu'avec un tableau à 2 dimensions!

    Je n'ai trouvé nulle part, ni même réussi à deviner
    Utiliser .Index? Ubound()?
    Est-ce possible? Ou dois-je me contenter d'une boucle?

    Celui qui trouve, aura un sandwich (à la fraise)

    Merci de votre considèration, et bonne journée

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    je sais pas si je me fourvoie ou pas comme je ne sais pas comment ton tableau es constitué!
    d’abord il es possible de de connaitre le Ubound d'un sous dimension!
    ubound(Tab,1) retourne la taille du premier niveau; ubound(Tab,2) retourne la taille du deuxième niveau; ubound(Tab,3) retourne la taille du troisième ect...;

    ensuite tu peux affecter a un plage de cellule un tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     sheets(1).range("A2:C10")=Tab(0)
    sheets(2).range("A2:C10")=Tab(1)

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Points : 1 219
    Points
    1 219
    Par défaut
    J'ai une variable tableau à 3 dimensions dans laquelle je fais pas mal de traitements.

    Prenons la taille Tab(5,10,100) pour l'exemple:
    1ère dimension: nombre de feuilles de calcul
    2ème : Nombre de colonnes
    3ème : Nombre de lignes
    Bonjour,

    Je ne ferais pas comme cela.
    Je passerai par un type défini comme par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Type strucData
      NomFeuille As String
      SourceData As Variant
    End Type
    et je déclarerai une variable tableau dynamique de ce type
    Dim mesData() As strucData
    On pourrait renseigner les sources d'un seul coup et alimenter les destinations de la même manière.

    Si cela vous convient, je peux construire un exemple. Dites le moi.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour PMO2017,
    tout dépend comment est constitué son tableau et ou il en est de sont développement, car mois je passerait par une collection de classe!

    la feuille est mise à jour automatiquement des lors qui rempli son tableau.

  5. #5
    Membre régulier
    Homme Profil pro
    Apprenti GEII
    Inscrit en
    Janvier 2014
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Apprenti GEII
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2014
    Messages : 83
    Points : 109
    Points
    109
    Par défaut
    Merci pour vos réponses!

    rdurupt : Je ne m'en sors pas avec ces méthodes que j'ai essayé à plusieurs sauces...

    PMO2017 : Je ne connais pas les Types... j'ai trouvé ce tuto: http://fauconnier.developpez.com/art...neral/classes/

    Je l'étudie et je reviens vers vous!

  6. #6
    Invité
    Invité(e)
    Par défaut
    dis nous au moins comment tu génère ton tableau!

  7. #7
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Bonjour à tous,

    Citation Envoyé par rdurupt Voir le message
    dis nous au moins comment tu génère ton tableau!
    Tout à fait d'accord !

    En effet, les tableaux aux multiples dimensions peuvent être constitué de différentes façon.

    Par exemple, il serait intéressant de savoir que contiennent les variables oTable(X, 0, Y) et oTable(X, Y, 0) quelque soit X ou Y.

    Bref, je ne pense pas que la communauté puisse te fournir une réponse clair à ton problème tant que tu n'auras pas répondu à la question de Robert.

    Cordialement,
    Kimy
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  8. #8
    Membre expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 869
    Points : 3 442
    Points
    3 442
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    donc :

    - UBound retourne la limite supérieure
    - LBound retourne la limite inférieure

    Va voir ce Tuto il t'aidera surrement
    http://didier-gonard.developpez.com/...s-tableau-vba/
    A+
    Ils ne savaient pas que c'était impossible ... du coup ils l'ont fait (Mark Twain)

    n'oubliez pas de si les messages vous aide ou sont pertinents et de mettre quand cela est !

  9. #9
    Membre régulier
    Homme Profil pro
    Apprenti GEII
    Inscrit en
    Janvier 2014
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Apprenti GEII
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2014
    Messages : 83
    Points : 109
    Points
    109
    Par défaut
    Re,

    J'ai un tableau Source, à 2 dimensions que j'extrait d'une feuille dont je veux traiter les données, comptant beaucoup de lignes;
    Je dimensionne un tableau Réponse (celui dont je parle) à trois dimensions.

    Un code de traitement permet de ventiller les données du tableau à 2 dimensions dans le tableau à 3 dimensions.
    La 3ème dimension me sert à différencier mes différentes feuilles réponses (il y en a 7)
    Le code de traitement définit vers quelle feuille, donc élément de 1 à 7 de ma 1ère dimension (option base 1) , je vais envoyer mes données

    Imaginons TabReponse(1,20,150) me renvoie donc ce que je dois écrire dans la feuille 1, dans la colonne 20, à la ligne 150 !
    Cette case TabReponse(1,20,150) contient du texte, des nombres, ou les deux... (tableau déclaré en type Variant)

    J'aurais voulu ici directement faire un code du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sheets(1).Range("A2:BA2000") = 'TabReponse(1,1,1) à TabReponse(1,TailleColones,TailleLignes)
    Sheets(2).Range("A2:BA2000") = 'TabReponse(2,1,1) à TabReponse(2,TailleColones,TailleLignes)
    .
    .
    .
    Sheets(7).Range("A2:BA2000") = 'TabReponse(7,1,1) à TabReponse(7,TailleColones,TailleLignes)
    Y a-t-il encore des précisions à apporter? je réponds peut être à coté?

    -----------------------------------

    Sinon je peux créer 7 tableaux ça simplifierait le tout...
    Ca reviendrait à la méthode de PMO2017 en passant par un type "feuille de données" et déclarer un tableau pour chaque...

    D'ailleurs ça pourrait me libèrer un peu de mémoire sachant que le "volume" mémoire comparable visuellement à un pavé que je demande à l'ordinateur d'allouer pour le tableau de variable, comporte un nombre de de lignes égale au nombre de lignes de la feuille qui en comporte le plus...
    Donc si j'ai TabReponse(1,20,700) et TabReponse(2,20,300) avec 300 dernière ligne , j'ai 400 cases inutiles dans le tableau 2...

    J'ai l'impression de faire compliqué alors que je peux faire simple

  10. #10
    Invité
    Invité(e)
    Par défaut
    mes pourquoi ne pas utiliser un filtre élaboré il ferait un copier collé de tes valeur en une foies pour chaque feuille!

    http://www.developpez.net/forums/d13...s/#post7481714

  11. #11
    Membre régulier
    Homme Profil pro
    Apprenti GEII
    Inscrit en
    Janvier 2014
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Apprenti GEII
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2014
    Messages : 83
    Points : 109
    Points
    109
    Par défaut
    Euh je ne l'ai peut être pas ou mal précisé, mais dans mon tableau de données réponses j'effectue un gros nombre de traitement de chaines de caractères, de tri, de gestion des doublons...

    Imaginons dans ma source j'ai:
    Nom / Quoi  / Heures / Num concerné
    EEE / 51    / 4h     / 12
    EEE / 51    / 4h     / 12
    EEE / 51    / 3h     / 18
    je dois pourvoir avoir dans la feuille 51:
    Nom/ Total d'heures / 1 / 2 / 3 / .... / 12 / ... / 18 / ...
    EEE /_____11______/__/ __/__/ .... / 8h / ... / 3h / ...

    Mais il y a encore d'autres choses... Un filtre ne suffit pas je pense...
    Je n'ai pas décrit exactement le cahier des charges, juste la partie des tableaux, niveau gestion des données tout est OK et le code plus rapide que ce que j'ai l'habitude de faire (grâce aux tableaux de données justement)
    Et c'est à l'étape de recopie....... Que ça va pas

    mais du coup je pense qu'un filtre actif n'est pas suffisant...

    Je vais essayer de contruire 7 tableaux distincs, ça je sais m'en servir...
    Par contre au niveau de la déclaration, pensez vous qu'utiliser le type feuille peut s'avèrer utile? ou je peux déclarer 7 tableaux indépendants? (sachant que ce nombre 7, est lui fixe)

    Je devrais pouvoir contourner le problème du coup, je marque résolu, merci beaucoup pour votre réactivité et investissement toujours aussi inspirants

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Points : 1 219
    Points
    1 219
    Par défaut
    Je passerai par un type défini comme par exemple

    Type strucData
    NomFeuille As String
    SourceData As Variant
    End Type

    et je déclarerai une variable tableau dynamique de ce type
    J'ai construit un exemple pour 3 feuilles de réponse.
    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
    Type StructData
      NomFeuille As String
      Tbl() As Variant
    End Type
     
    Sub aa()
    Dim S As Worksheet
    Dim var
    Dim i&
    Dim j&
    Dim k&
    Dim myData(1 To 3) As StructData
    Dim Cpt&(1 To 3)
    '---
    '--- On monte toutes les données d'un seul coup ---
    Set S = Sheets("Sources")
    var = S.[a1].CurrentRegion
    '--- On les attribue aux différents tableaux (Tbl) selon le cas ---
    For i& = 1 To UBound(var, 1)
      Select Case var(i&, 3)
        Case "Dispatch1"
          myData(1).NomFeuille = "Reponse1"
          Cpt&(1) = Cpt&(1) + 1
          ReDim Preserve myData(1).Tbl(1 To UBound(var, 2), 1 To Cpt&(1))
          For j& = 1 To UBound(var, 2)
            myData(1).Tbl(j&, Cpt&(1)) = var(i&, j&)
          Next j&
        '---
        Case "Dispatch2"
          myData(2).NomFeuille = "Reponse2"
          Cpt&(2) = Cpt&(2) + 1
          ReDim Preserve myData(2).Tbl(1 To UBound(var, 2), 1 To Cpt&(2))
          For j& = 1 To UBound(var, 2)
            myData(2).Tbl(j&, Cpt&(2)) = var(i&, j&)
          Next j&
          '---
        Case "Dispatch3"
          myData(3).NomFeuille = "Reponse3"
          Cpt&(3) = Cpt&(3) + 1
          ReDim Preserve myData(3).Tbl(1 To UBound(var, 2), 1 To Cpt&(3))
          For j& = 1 To UBound(var, 2)
            myData(3).Tbl(j&, Cpt&(3)) = var(i&, j&)
          Next j&
      End Select
    Next i&
     
     
    '--------------------------------------------------------
    'on peut faire des traitements sur chaque myData.Tbl
    'ATTENTION : les lignes sont en colonnes et vice versa
    '--------------------------------------------------------
     
    '--- Inscription dans les feuilles de destination (ici à partir de A1 mais à vous de voir ) ---
    For i& = 1 To UBound(myData)
      Set S = Sheets(myData(i&).NomFeuille)
      '--- On inscrit à partir de A1 ---
      S.Range(S.Cells(1, 1), S.Cells(UBound(myData(i&).Tbl, 2), UBound(myData(i&).Tbl, 1))) = _
          Application.WorksheetFunction.Transpose(myData(i&).Tbl)
    Next i&
     
    End Sub
    Fichiers attachés Fichiers attachés

  13. #13
    Invité
    Invité(e)
    Par défaut
    Si tu sais faire un tableau, tu sais en faire deux; trois mille!
    si tu sais faire un tableau selon critère j'imagine que le code pour les autre est un peut semblable?

    dans un module standard je sais créer un table selon le critère A par exemple, et je sais renseigner la feuille qui va bien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sub CrationTableau(A)
    end sub
     
    sub EcrirFeuill(A)
    end sub
    imagions avec ce code je peux faire en plusieurs passe les 7 onglet A;B;C;D ect...

    je bascule mon code dans un classe et je fais un table pour les 7 onglets!

    Code MyClass : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public sub CrationTableau(A)
    end sub
     
    Public sub EcrirFeuill(A)
    end sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sub test()
    dim T(7) as new  MyClass
    t(0).CrationTableau(A)
    t(0).CrationTableau(B)
    end sub
    et là tout est automatique

    Avec un module de classe tu n'as pas à gérer le code pour 7 tableaux mais juste pour 1 ce sont les critères qui disent sur quelle feuille!
    Dernière modification par Invité ; 19/03/2015 à 17h13.

  14. #14
    Membre régulier
    Homme Profil pro
    Apprenti GEII
    Inscrit en
    Janvier 2014
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Apprenti GEII
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2014
    Messages : 83
    Points : 109
    Points
    109
    Par défaut
    Merci pour ces méthodes les deux fournissent le résultat souhaité!

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

Discussions similaires

  1. Quelle classe pour manipuler un tableau à n dimensions
    Par philippe6 dans le forum Collection et Stream
    Réponses: 10
    Dernier message: 30/12/2010, 16h13
  2. [PHP 5.2] creer tableau à 2 dimensions avec 3 variables.
    Par ju0123456789 dans le forum Langage
    Réponses: 4
    Dernier message: 13/05/2009, 13h17
  3. variable tableau 2 dimensions et redim preserve
    Par dawood dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 03/01/2009, 15h11
  4. Réponses: 11
    Dernier message: 11/06/2008, 18h05
  5. [débutant] un tableau de dimension variable selon l'objet qui le contient
    Par Epistocles dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 09/01/2007, 18h07

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