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 :

Créer des tableaux de tableaux, c'est possible ?


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2015
    Messages : 75
    Points : 57
    Points
    57
    Par défaut Créer des tableaux de tableaux, c'est possible ?
    Bonjour à tous,

    1er post sur ce forum donc j'espère ne pas aller à l'encontre de certaines règles

    Je suis en plein développement d'une macro VBA qui fait pour l'instant du traitement/analyse de données : il s'agit de logistique d'interventions programmées dans de la maintenance, donc une ligne correspond à chaque fois à une intervention de maintenance.
    J'ai donc 2 classeurs en entrée manipulant les mêmes données, l'un étant celui de la semaine précédente, l'autre de la semaine suivante. Mon job est de comparer les 2, de mettre en évidence les nouvelles interventions apparues et celles qui ont été traitées (donc disparues).

    J'en viens à mon problème : ces interventions sont réparties sur 5 zones géographiques (donc 5 feuilles dans chaque classeur). Or mon travail d'analyse est le même sur chaque zone prise séparément.
    Je cherche donc à tout écrire en une fois et à l'appliquer aux 5 zones via une boucle "for ... next". Cela marche bien pour pas mal de variables, je construit à chaque fois un tableau qui les contient, leur position dans le tableau correspondant à la zone à traiter (une variable de comptage des interventions par exemple : lmacro1, lmacro2, ... --> tlmacro() )

    Le problème est que, pour une zone donnée, il me faut aussi construire un tableau contenant les nouvelles interventions et un autre tableau contenant les interventions traitées ( tnew() et tend() )

    Y-a-t-il donc un moyen pour obtenir quelque chose du genre : tnew(i)(j), où i désignerait la zone parmi les 5 ?

    J'ai déjà pas mal cherché sur le net sans vraiment trouver : ma seule piste est de construire un Array contenant mes tableaux (tnew = Array(tnew1, tnew2, etc)) mais je me suis rendu compte en faisant des tests que si je rentre des valeurs en manipulant l'array (tnew(1)(1) = 10) cela ne se répercute pas sur les tableaux qu'il contient (tnew1(1) = ?) et vice-versa !!

    Je remercie toute aide, je commence à chauffer du cerveau

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur Industrialisation
    Inscrit en
    Mai 2015
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Industrialisation
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2015
    Messages : 222
    Points : 412
    Points
    412
    Par défaut
    Salut à toi,

    Je ne suis pas certain d'avoir bien compris, mais tu peux créer des tableaux avec autant de dimensions que tu veux (ou en tout cas, suffisamment )

    Tu peux par exemple avoir un tableau à 2 dimensions avec en gros :
    Tableau(Dimension1 = la page, Dimension2 = les plages avec lesquelles tu vas travailler)

    par exemple, tu veux travailler avec la range ("A1") de la page 1 et 2 et la range("A2") de la page 1 et ("A3") de la page 2 tu peux avoir quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim Tableau(1 To 2,1 To 2) As Range
    Set Tableau(1,1) = Sheets(1).Range("A1")
    Set Tableau(2,1) = Sheets(2).Range("A1")
    Set Tableau(1,2) = Sheets(1).Range("A2")
    Set Tableau(2,2) = Sheets(2).Range("A3")
    Je ne sais pas si ça peut t'aider à quoi que ce soit, mais ça peut être pratique... Ensuite, tu peux boucler dans les index des pages pour remplir automatiquement ton tableau si les ranges sont définies.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2015
    Messages : 75
    Points : 57
    Points
    57
    Par défaut
    Alors j'ai du nouveau
    J'ai continué de chercher et j'ai creusé la question de l'array :
    En fait je peux faire un tableau de tableaux en définissant d'abord mes tableaux 1D comme il faut, puis un tableau de type Variant 1D qui va les contenir.
    Donc dans mon cas j'ai créé les tableaux tnew1, tnew2, etc ... et le tableau tnew qui les contient.

    Ce qui m'étonne maintenant, c'est au niveau de l'affectation de valeurs :
    Si je fais par exemple : new1(1) = 10, la valeur ne s'enregistre pas dans tnew(1)(1).
    Et inversement si je rentre tnew(1)(1) = 10, cela ne s'enregistre pas dans tnew1(1).

    Mon problème stricto sensu est donc réglé mais je ne comprend pas ce comportement ? quel est le lien réel entre mes tableaux et le tableau de tableau ?? comment expliquer ce que j'ai remarqué ?

    En tout cas merci de ta réponse !

  4. #4
    Membre expérimenté
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 747
    Points : 1 332
    Points
    1 332
    Par défaut
    Bonjour à tous,

    Si tes tableaux tnew1, tnew2... etc ont tous la même taille, la solution proposée par Quentin est plus simple
    Sinon les tableaux tnew1, tnew2... etc ne servent qu'à créer un tableau de la bonne taille dans la case de tnew, plus de lien ensuite
    Pour trouver la valeur ou pour en affecter une, tu ne devras travailler qu'avec tnew

    Tu peux aussi envisager de travailler avec un Type personnalisé qui contient un tableau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Type Personne
    Nom as string
    PrenomsEnfants() as string
    End Type

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2015
    Messages : 75
    Points : 57
    Points
    57
    Par défaut
    Mes tableaux tnew1, 2 etc sont effectivement de tailles différentes
    Je te remercie

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

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut

    Je ne sais pas trop comment tu crées et remplis tes tableaux.
    Excel fonctionne sur deux principe, ByVal et ByRef donc par Valeur ou par Référence

    A mon avis tu fais quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TNew(0) = TNew1
    TNew(1) = TNew2
    Lorsque tu fais ça tu dis à Excel je veux créer un tableau dans TNew(x) ayant les valeurs contenues dans TNew1, ainsi VBA te crée un nouveau tableau dans TNew(x)(Il vient de travailler ByVal)
    Il n'y a donc plus aucun lien entre TNew1 et le contenu de TNew(X), les modifications de l'un ne se reportent pas sur l'autre, ce sont deux tableaux distinct.

    Pour garder un lien, il faut comme tu l'as surement deviné travailler ByRef.
    Je ne sais pas si c'est possible avec un array contenu dans un variant
    [Edit] Je ne trouve pas d'exemple avec des tableaux, que ce soit des array ou non VBa semble toujours les passer par valeur. J'ai même essayé avec une collection mais la collection fonctionne aussi par valeur lorsqu'on lui demande de pointer un tableau...
    Le fonctionnement Par référence est plus explicite avec un objet...
    Avec les objets tu utilises le mot clef Set pour préciser à VBA que tu travailles par référence.
    Ici tu dis à VBA UnObjet est la même chose que MonObjet, si tu modifie l'un l'autre est de facto modifié, tu peux voir UnObjet comme un raccourci vers MonObjet.[/Edit]

    J'espère avoir éclairé ta lanterne et ne pas avoir dit trop de bêtise

    ++
    Qwaz

    PS : Attention au multiposte (création de plusieurs sujets dans le forum portant sur le même problème), visiblement c'est le cas pour ce sujet.

    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 du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2015
    Messages : 75
    Points : 57
    Points
    57
    Par défaut
    Super merci beaucoup, cela éclaire ma ptite lanterne de connaissances en VBA
    Désolé pour le multipost je n'ai malheureusement pas fait exprès et je l'ai signalé au admins vu que je ne pouvais le supprimer moi-même (en tout cas je n'ai pas réussi)
    Merci encore !

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/09/2011, 15h27
  2. Question : Est-il possible d'avoir des champs de tableaux
    Par Glherbier dans le forum VBA Access
    Réponses: 5
    Dernier message: 07/08/2008, 16h40
  3. [POI]Utiliser des modèles de document, c'est possible ?
    Par hugo123 dans le forum Documents
    Réponses: 5
    Dernier message: 04/09/2006, 12h52
  4. Gestion des exception en C: c'est possible ?
    Par hoangnam72 dans le forum C
    Réponses: 12
    Dernier message: 22/12/2005, 14h28
  5. [CR] Est il possible de créer des univers avec Seagate Info?
    Par Frank dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 27/06/2002, 15h22

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