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 :

Collection de tableaux dynamiques


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de DJ Caësar 9114
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 135
    Par défaut Collection de tableaux dynamiques
    Bonjour à tous,
    Je poste ici un nouveau message car j'ai revu mon algorithme, ne parvenant pas à utiliser la récursivité. Ce message n'a donc rien à voir avec celui-ci, qui est toujours d'actualité: http://www.developpez.net/forums/d12...e/#post6985946


    Pour remplir certaines cases de mon tableau, j'ai besoin à un moment donné de générer une suite hexagonale. Je la mets pour info pour que vous compreniez le but de la macro:
    3;3;3 - 3;3;2 - 3;3;1 - 3;2;3 - 2;3;3 - 3;1;3 - 1;3;3 - 3;2;1 - 2;3;1 - 2;1;3 - 3;1;2 - 1;3;2 - 1;2;3 - 3;2;2 - 2;3;2 - 2;3;3 - 3;1;1 - 1;3;1 - 1;1;3
    Il s'agit donc de trouver tous le n-uplets de chiffres comprenant au moins le chiffre max y. Ici x = y = 3.

    Le but pour moi est donc de créer un tableau de tableaux en prenant deux paramètres:
    - chiffre max (3 ici)
    - nombre de chiffres dans un bloc (3 aussi ici, par exemple)

    Je lancerai ensuite une macro sur chaque élément de ce tableau.

    Voilà 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
    Sub algo_seq()
    'tottab contient tous les "blocs" de nombre, qui sont des tableaux
        Dim tottab As Collection
     
    'testtab est le tableau "tampon"
        Dim testtab() As Integer
        ReDim testtab(1)
     
    'on prend ici les mêmes valeurs que dans mon exemple
        Dim ch_max As Integer
        Dim nb_max As Integer
        ch_max = 3
        nb_max = 3
     
    'on initialise la collection de base
        For i = 1 To ch_max 
            testtab(0) = i
            Call tottab.Add(testtab)
        Next
     
    'on remplit la collection de base jusqu'à avoir les bonnes longueur de bloc
        While tottab.Item.Value.Rows.Count < nb_max
            fin = tottab.Count
            For i = fin To 1 Step -1
                For j = 1 To ch_max
                    tottab.Add Union(tottab.Item(i).Value, j)
                Next
                tottab.Remove i
            Next
        Wend
     
    'ici je "nettoie" ce dont je ne veux pas
        dim z as variant
        fin = tottab.Count
        For i = fin To 1 Step -1
            z = Filter(tottab.Item(sequence), ch_max)
            If UBound(z) < 0 Then
                 tottab.Remove i 
            End If
        Next
     
     'je lance ma macro sur tous les blocs   
        'For sequence = 1 To tottab.Count
            'ajouter(tottab.Item(sequence).Value)
        'Next sequence
     
    End Sub
    Cependant, lors de l'exécution, j'ai l'erreur «argument non facultatif» sur le «Item» de «tottab.Item.Value.Rows.Count < nb_max»

    D'où vient mon erreur?

    Merci!

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,

    J'ai l'impression que utilises mal l'objet "Collection".

    Qu'est-ce que tu veux faire avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call tottab.Add(testtab)
    l'instrution "Call" appelle une macro.
    Quant à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tottab.Item.Value.Rows.Count
    ça me laisse perplexe. Item n'est pas une propriété, pas même un mot VBA. Tu pourrais mettre "Items(x)" ou x est un nombre ou une variable. "Value" n'a pas de propriété, tu ne peux pas écrire ce que tu as mis, quant à "Rows.count" cela s'applique à un objet "Range". Tu devrais détailler exactement le résultat que tu souhaites obtenir.

  3. #3
    Membre confirmé Avatar de DJ Caësar 9114
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 135
    Par défaut
    Bonjour,
    Il est effectivement possible que j'utilise mal l'objet collection, car je me suis basé sur ce que j'ai vu sur developpez et d'autres sites, et je n'ai pas trouvé les explications claires (c'est bien la première fois d'ailleurs!)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call tottab.Add(testtab)
    sert pour moi à ajouter à ma collection un tableau.
    Ainsi, au début, ma collection est vide, puis elle contient les 3 tableaux {1}, {2} et {3}
    J'ai vu la syntaxe "Call" sur un site internet consacré aux collections. Visiblement les infos sont erronées ou bien ils n'ont publeé qu'un fragment de code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tottab.Item.Value.Rows.Count
    sert pour moi à vérifier la taille des tableaux de ma collection.
    Après l'avoir initialisé (cf. ci-dessus), tant que la collection ne contient pas de tableaux de la taille souhaitée (ici aussi 3, mais plus généralement taille_max), on rajoute des éléments comme ceci:
    pour chaque élément de la collection,
    pour i de 0 à chiffre_max (ici = 3, mais pouvant être distinct de taille_max), on rajoute l'élément du tableau concaténé à i.


    Voilà ce que donnera donc la première boucle:
    {1;1} {1;2} {1;3} {2;1} {2;2} {2;3} {3;1} {3;2} {3;3}

    La collection a accueilli de nouveaux tableaux et a supprimé les anciens. Mais les tableaux ne contiennent pas suffisamment de valeurs, on répétera alors la boucle.

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Il faut d'abord que tu remplaces :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim tottab As Collection
    par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim tottab As New Collection
    pour créer l'objet.

    Il faudrait remplacer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call tottab.Add(testtab)
    par :

    MAIS tu redimensionnes le tableau :

    comme, par défaut, le premier item du tableau à la valeur d'index 0, testab est donc un tableaux à deux items. Quand tu essaies d'ajouter d'un coup les deux items, VBA râle. Il faut donc mettre :

    ou plus simplement, sans tableau :

    Pour tester le nombre d'éléments de la collection :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If tottab.Count < nbmax Then

  5. #5
    Membre confirmé Avatar de DJ Caësar 9114
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 135
    Par défaut
    Merci pour ces éléments.
    En revanche, dans mon test, ce n'est pas la taille de ma collection que je veux mesurer, mais celle de ses éléments (égale pour tous).
    J'ai donc plutôt remplacé par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    While tottab.Item(1).Value.Rows.Count < nb_max
    Mon code entier est donc le suivant:

    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
    Sub algo_seq()
    'tottab contient tous les "blocs" de nombre, qui sont des tableaux
        Dim tottab As New Collection
     
    'testtab est le tableau "tampon"
        Dim testtab() As Integer
        ReDim testtab(1)
     
    'on prend ici les mêmes valeurs que dans mon exemple
        Dim ch_max As Integer
        Dim nb_max As Integer
        ch_max = 3
        nb_max = 3
     
    'on initialise la collection de base
        For i = 1 To ch_max
            testtab(0) = i
            tottab.Add testtab(0)
        Next
     
    'on remplit la collection de base jusqu'à avoir les bonnes longueur de bloc
        While tottab.Item(1).Rows.Count < nb_max
            fin = tottab.Count
            For i = fin To 1 Step -1
                For j = 1 To ch_max
                    tottab.Add Union(tottab.Item(i).Value, j)
                Next
                tottab.Remove i
            Next
        Wend
     
     'je lance ma macro sur tous les blocs
        'For sequence = 1 To tottab.Count
            'ajouter(tottab.Item(sequence).Value)
        'Next sequence
     
    End Sub
    Mais j'ai une erreur d'objet requis justement dans la ligne correspondant au test. Je n'ai pas l'impression qu'il comprenne qu'il s'agit d'un tableau. Que j'essaye avec ou sans «Rows», cela ne fonctionne pas...

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    J'ai donc plutôt remplacé par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    While tottab.Item(1).Value.Rows.Count < nb_max
    Ça alors ! c'est vraiment étonnant ! est-ce que tu as lu mes réponses précédentes ?

Discussions similaires

  1. Tableaux dynamiques
    Par sebduth dans le forum Fortran
    Réponses: 5
    Dernier message: 05/07/2005, 16h36
  2. tableaux dynamiques
    Par Mynautor dans le forum C++
    Réponses: 23
    Dernier message: 12/02/2005, 03h45
  3. [D7] Tableaux dynamiques dans un record
    Par bobby-b dans le forum Langage
    Réponses: 2
    Dernier message: 01/07/2004, 00h23
  4. Article sur les tableaux dynamiques
    Par Eric Sigoillot dans le forum Langage
    Réponses: 2
    Dernier message: 16/04/2004, 23h00
  5. [Kylix] Tableaux dynamiques sour Kylix2
    Par Krän dans le forum EDI
    Réponses: 6
    Dernier message: 07/10/2003, 15h31

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