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 à 3 dimensions avec X classeurs à 1 onglet [XL-2013]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Mai 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 11
    Par défaut Tableau à 3 dimensions avec X classeurs à 1 onglet
    Bonjour à tous,

    Je suis confronté à un problème actuellement auquel je n'arrive pas à faire face. Toute aide sera la bienvenue.

    J'ai actuellement X fichiers excel contenant chacun un onglet. Chaque fichier excel ne possède qu'un onglet, qui a un nombre variable de lignes, mais qui a toujours la même structure générale (9 colonnes fixes). Je recherche un moyen de rassembler toutes les données qui sont dans tous les fichiers à un seul endroit (afin de procéder à un post-traitement plus tard, mais ce n'est pas encore le sujet ici).

    Mon idée était (et est encore) de créer un tableau à 3 dimensions qui pourrait contenir toutes ces données, mais je n'ai pas de pistes concernant la syntaxe qu'il faut utiliser. La première dimension contiendrait un id unique (1, 2, 3 etc... jusqu'à X), la deuxième dimension les colonnes et la troisième les lignes.

    Cela a pour but d'accélérer le temps d’exécution de l'ensemble de ma macro. Actuellement ce que je fais, c'est de tout recopier dans fichier excel puis de faire mon post-traitement. Néanmoins, cela prends trop de temps lors de l’exécution.

    Si quelqu'un a des idées, je suis preneur.

    D'avance merci.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    En fait, je pense que tu veux dire un tableau à 2 dimensions dont la première colonne (si on peut dire) contiendrait les Index.
    Pour s'imaginer ce qu'est un tableau à 3 dimensions, il y a le Rumicube ou encore les feuilles de calcul Excel où par exemple la 1ère dimension serait les lignes, la seconde les colonnes et la troisième le nombre de feuilles et ça pourrait donner ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ReDim Tbl(1 To Lignes, 1 To Colonnes, 1 To Feuilles)
    où :
    Tbl(1, 1, 1) = Cellule A1 de la 1ère feuille
    Tbl(1, 1, 2) = Cellule A1 de la 2ème feuille
    Tbl(2, 1, 1) = Cellule A2 de la 1ère feuille
    Tbl(1, 2, 2) = Cellule B2 de la 2ème feuille
    Tbl(1, 2, 3) = Cellule B2 de la 3ème feuille
    etc...
    Pas facile à gérer !
    Pour toi, ça devrait plutôt ressembler à ça (une colonne est rajoutée par rapport à la plage A1:I40 pour inscrire les index ici, de 1 à 40) :
    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
     
    Sub Test()
     
        Dim Tbl()
        Dim Index As Long
        Dim X As Long
        Dim Y As Long
        Dim I As Long
        Dim J As Long
     
        X = 9 'colonnes (colonne A à I)
        Y = 40 'lignes (ligne 1 à 40)
     
        'redimensionne le tableau en ajoutant une colonne en plus pour les index
        ReDim Tbl(1 To X + 1, 1 To Y)
     
        For I = 1 To Y 'par ligne
     
            Index = Index + 1
            Tbl(1, I) = Index 'la première colonne sert aux index
     
            For J = 2 To X + 1 'par colonne
     
                'commence à A1, B1, C1...
                           'A2, B2, C2...
                           'A3, B3, C3...
                           'etc...
                Tbl(J, I) = Cells(I, J - 1).Value
     
        Next J, I
     
        'pour le test, inscrit les valeurs à partir de K1 (colonne K, les index)
        For I = 1 To UBound(Tbl, 2)
     
            For J = 1 To UBound(Tbl, 1)
     
                Cells(I, J + 10).Value = Tbl(J, I)
     
        Next J, I
     
        'ou directement en transposant...
        Range(Cells(1, 11), Cells(UBound(Tbl, 2), UBound(Tbl, 1) + 10)) = Application.WorksheetFunction.Transpose(Tbl())
     
    End Sub
    Pour tester déjà dans un premier temps pour 1 seul classeur, tu entre des valeurs de A1 à I40 puis tu lance la procédure Test en choisissant la façon que te veux pour retranscrire les valeurs dans la feuille à partir de K1 soit avec les boucles soit avec la fonction Transpose. Tu peux tester les deux en mettant une des deux en commentaire.

  3. #3
    Invité
    Invité(e)

  4. #4
    Expert confirmé
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132

  5. #5
    Membre habitué
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Mai 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 11
    Par défaut
    Bonjour à tous,

    Un grand merci pour vos réponses.

    N'ayant pas trop l'habitude, j'avoue que je m'y perds un peu. Je vais essayer d'exprimer un peu mieux mon besoin :

    Postulat de départ :
    J'ai 50 fichiers excel avec un seul onglet. Chacun d'eux ont 9 colonnes et 1000 lignes (je simplifie).

    Ce que je souhaiterais pouvoir faire est la chose suivante :
    Récupérer à un seul endroit, et avec la manière la plus rapide possible, toutes ces données-la. Par la suite, je devrais faire des opérations (suppression/ajout de ligne, fusion d'autres) mais je verrai ça plus tard. Mon idée de base était de faire quelque chose qui ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Tab(1,x,y) = workbook(1).worksheet(1).Range("A1:I1000")
    Tab(2,x,y) = workbook(2).worksheet(1).Range("A1:I1000")
    Tab(3,x,y) = workbook(3).worksheet(1).Range("A1:I1000")
    ...
    Tab(50,x,y) = workbook(50).worksheet(1).Range("A1:I1000")
    Est-ce possible ? J'ai remarqué que l’exécution sur un tableau à 2 dimensions était extrêmement rapide, mais je n'arrive pas à appliquer cette démarche à un tableau 3D (du coup, je pense que je ne peux pas me passer des 3 dimensions pour mon tableau).

    Merci pour votre aide

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    C'est exactement ce que je te propose dans mon lien et il n'y a pas plus rapide q'ado!

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

Discussions similaires

  1. Tableau à 3 dimensions avec données string & numériques
    Par nianko dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/02/2009, 11h33
  2. Bug d'affichage avec un classeur d'onglet
    Par pev15 dans le forum IHM
    Réponses: 3
    Dernier message: 10/06/2008, 10h15
  3. Tableau à 2 dimensions avec utilisation de MALLOC
    Par johnalias110 dans le forum C
    Réponses: 3
    Dernier message: 28/02/2007, 18h54
  4. créer un tableau 2 dimensions avec Malloc
    Par nimportekoi dans le forum C
    Réponses: 14
    Dernier message: 15/11/2006, 13h01
  5. allouer un tableau 2 dimensions avec shmget.
    Par youp_db dans le forum C
    Réponses: 3
    Dernier message: 12/06/2006, 11h11

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