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 :

"ReDim" fonctionne "ReDim Preserve" non [XL-2002]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 187
    Par défaut "ReDim" fonctionne "ReDim Preserve" non
    Bonjour,

    Dans mon code si je remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReDim MyTable(Taille,1)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReDim Preserve MyTable(Taille,1)
    , la boucle qui suit dans le code et qui est censée afficher la liste des éléments du tableau n'apparait pas avant que la macro plante alors que sans le "Preserve" j'ai une liste vide + un élement (le dernier élément du tableau, normal c'est lui que je définis après l'incrémentation du tableau).

    J'ai regardé des exemples de code avec "Redim Preserve" mais je ne vois pas de différence avec mon code ... :'(

    Merci d'avance et pour votre indulgence car ça sent le problème de syntaxe

  2. #2
    Membre chevronné
    Inscrit en
    Décembre 2003
    Messages
    434
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 434
    Par défaut
    Salut,

    Un morceau de code un peu plus consequent serait le bien venu.
    C'est un peu juste, on ne sait pas comment est initialise Taille par exemple...

    ++
    Minick

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut dalmasma et le forum
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReDim Preserve MyTable(Taille,1)
    ne peut pas marcher :
    ... il n'a pas de jambes
    Seul le dermier indice peut être modifié
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ReDim Preserve MyTable(Taille)
    'ou
    ReDim Preserve MyTable(1,Taille)
    'ou si tu as 50 colonnes 
    ReDim Preserve MyTable(50,Taille)
    fonctionnera.
    A+

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 187
    Par défaut
    Voilà mon bout de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Dim NombreParametresMetier As Integer, Prmtr As String
    NombreParametresMetier = 0
    n = 1
    Do
        Prmtr = ValeurExcel("A" & CStr(n))
        'MsgBox Prmtr
        If ValeurExcel("B" & CStr(n)) <> "" And ValeurExcel("B" & CStr(n))<> "#NOM?" Then
               NombreParametresMetier = NombreParametresMetier + 1
               ReDim Preserve ListeParametresMetier(NombreParametresMetier)
               ListeParametresMetier(NombreParametresMetier, 1) = ValeurExcel("A" & CStr(n))
               ListeParametresMetier(NombreParametresMetier, 2) = ValeurExcel("B" & CStr(n))
        End If
        n = n + 1
    Loop Until Prmtr = ""
    Tu es vicieux Gorfael c'est pas gentil le faux espoir J'ai remplacé mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReDim Preserve ListeParametresMetier(NombreParametresMetier,2)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReDim Preserve ListeParametresMetier(NombreParametresMetier)
    mais ça ne marche pas

  5. #5
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    Bonjour,
    je pense que tu n'a pas bien compris l'explication de Gorfael

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       If ValeurExcel("B" & CStr(n)) <> "" And ValeurExcel("B" & CStr(n))<> "#NOM?" Then
               NombreParametresMetier = NombreParametresMetier + 1
               ReDim Preserve ListeParametresMetier(2, NombreParametresMetier)
               ListeParametresMetier(1, NombreParametresMetier) = ValeurExcel("A" & CStr(n))
               ListeParametresMetier(2, NombreParametresMetier) = ValeurExcel("B" & CStr(n))
        End If
    A+

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 187
    Par défaut
    En effet c'est pas clair pour moi,

    Ce que je crois comprendre:
    Si je veux modifier un tableau de 2 lignes 4 colonnes en 2 lignes 5 colonnes il faut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReDim Preserve MyTable (2,5)
    alors que si j'avais voulu le modifier en 3 lignes 4 colonnes il fallait écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReDim Preserve MyTable (4,3)
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReDim Preserve MyTable (3)
    Ou

    vous voulez dire qu'on ne peux modifier que les colonnes et donc prévoir une extension selon les colonne quoiqu'il arrive.

    C'est quoi qui est juste là dedans ?

  7. #7
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    Je répète ce qua dit Gorfael seul le dernier indice peut être modifié avec preserve.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Redim tableau(5,6)
    redim preserve tableau(8,6) 'ca plante
    redime preserve tableau(5,8) 'fonctionne
    donc il te suffit d'inverser tes indice commence par l'indice fixe puis l'indice qui varie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReDim Preserve MyTable(1,Taille)
    Par contre mettre une dimension a 1 est inutile si elle reste a 1 dans tout le code.

    Pour répondre a ta question une fois que le premier indice est définie il ne peut pas être modifié avec redim préserve

    si tu fait
    le 2 seras impossible a modifier avec un preserve, tu ne pourras faire varier que la deuxième dimension le 4 qui peut devenir un 5


    Maintenant imaginons que le nombre de colonne soit fixe et que le nombre de ligne varie (cas fréquent). Tu vas me dire que cela pose un problème puisque le premier ne peux pas varier. mais il y a une solution très simple.
    Il te suffit de décider (c'est purement arbitraire de toute façon) que le premier indice correspond aux colonnes et le deuxième au ligne.

    Pour être exact le concept de ligne, colonne est complètement inutile, il ne sert que pour une représentation graphique.
    Surtout cela "empêche" l'utilisation "spontané" de tableau a 4 dimension ou plus qui sont pourtant très pratique

    J'espère que c'est un peu plus clair pour toi

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut dalmasma et le forum
    Non, je ne suis pas vicieux, juet un peu pervers
    vous voulez dire qu'on ne peux modifier que les colonnes et donc prévoir une extension selon les colonne quoiqu'il arrive.
    Nous on ne veut rien. Mais Excel fait ce qu'on lui demande (quand il peut) et pas ce que l'on veut.

    avec une variable de de type, Tableau(C,L), excel ne peut jouer que sur L (avec preserve, bien entendu). Il ne peut pas toucher à C. Je pense (eh oui, ça m'arrive) que c'est lié à la structure du tableau dans la mémoire (une dimension).
    si on a Tableau (A, B, C, D, E), Excel ne peut jouer que sur E.

    Ce qui donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Dim NombreParametresMetier As Long, Prmtr As String
    NombreParametresMetier = 0
    n = 1
    Do
        Prmtr = ValeurExcel("A" & n)
        'MsgBox Prmtr
        If ValeurExcel("B" & n) <> "" And ValeurExcel("B" & n) <> "#NOM?" Then
               NombreParametresMetier = NombreParametresMetier + 1
               ReDim Preserve ListeParametresMetier(1 To 2, NombreParametresMetier)
               ListeParametresMetier(1, NombreParametresMetier) = ValeurExcel("A" & n)
               ListeParametresMetier(2, NombreParametresMetier) = ValeurExcel("B" & n)
        End If
        n = n + 1
    Loop Until Prmtr = ""
    Je ne comprends pas ton "acharnement" à vouloir mettre l'indice fixe en dernier. Je sais que c'est une gymnastique intelectuelle, mais ceux qui ont construit Excel sont américain . C'est pour ça que cells(ligne, colonne), alors que la logique aurait voulu que ce soit colonne en premier. Mais ça fait partie des "charmes" d'excel.

    Pour l'instant tu as : ListeParametresMetier(X, Y) avec X pouvant recevoir les indices 1 et 2 et Y pouvant recevoir de 0 à NombreParametresMetier

    Si plus tard tu veux modier le premier indice (X), en conservant les données, tu as toujours des solutions :

    - soit dès le début, tu prévois la dimension Max de X (1 à 50, par exemple). Si tu as une perte de mémoire vive tant que tu n'atteints pas le nombre max, il est sérieusement compensé par la simplicité du rajout.

    - soit tu crées un autre tableau temporaire avec les indices en cours de ListeParametresMetier, tu le charges avec ce dernier, tu modifies les indices et tu recharges en tenant compte des modifications apportées.
    Mais là, ça commence à devenir usine à gaz.

    L'informatique aide à résoudre les problèmes. Mais seul le morceau de framge blanc entre les oreilles peut trouver des solutions.

    Nota / regarde l'aide sur Option Base
    A+

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

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