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 :

Comment utiliser ReDim Preserve


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 16
    Points : 10
    Points
    10
    Par défaut Comment utiliser ReDim Preserve
    Bonjour a tous, je fais un stage, et on me demande de faire une macro VB comme la suivante (voir ci dessous).
    Le probleme etant que je ne la comprends pas entierement.
    C'est pour faire une recherche sur un fichier, une sorte de Vlookup.
    Si quelqu'un peut m'aider a la comprendre, ce serait gentil.

    Voila le code de la macro.
    J'ai mis en rouge ce qui me pose probleme et que j'aimerais que l'on m'explique.

    Merci a tous.

    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    Sub data_analysis()
    
    Dim Vector()
    Dim Vector2()
    Dim Party()
    Dim Position()
    
    Start = Sheets("Expiries").Range("C2")
    Final = Sheets("Expiries").Range("C3")
    
    z = 1
    x = 1
    
    teller = Sheets("per klant").Range("A65536").End(xlUp).[COLOR="Red"]Row - 13
    teller2 = teller + 2
    
    For i = 1 To teller
        If Sheets("per klant").Range("G" & 13 + i) >= Start Then
            If Sheets("per klant").Range("G" & 13 + i) <= Final Then
                ReDim Preserve Vector(1 To z)
                Vector(z) = 13 + i
                z = z + 1
            End If
        End If
        If Sheets("per klant").Range("K" & 13 + i) >= Start Then
            If Sheets("per klant").Range("K" & 13 + i) <= Final Then
                ReDim Preserve Vector2(1 To x)
                Vector2(x) = 13 + i
                x = x + 1
            End If
        End If
    Next i
       
    Sheets("Expiries").Range("C6").ClearContents
    With Sheets("Expiries").Range("C12:I100")
        .ClearContents
        .Font.ColorIndex = 1
    End With
    
    Sheets("Expiries").Range("G6").ClearContents
    
    y = 1
    For i = 1 To teller2
        If Sheets("per klant").Range("A" & 11 + i).Interior.ColorIndex = 2 Then
            ReDim Preserve Party(1 To y)
            ReDim Preserve Position(1 To y)
            Party(y) = Sheets("per klant").Range("A" & 11 + i)
            Position(y) = 11 + i
            y = y + 1
        End If
    Next i
    
    Sheets("counterparties").Range("B3:B1000").ClearContents
    
    For a = 1 To UBound(Party)
        With Sheets("counterparties").Range("B2")
            .Offset(a, 0) = Position(a)
            .Offset(a, 1) = Party(a)
        End With
    Next a
    
    Sheets("Expiries").Range("C6") = z - 1
    
    If z > 1 Then
    For j = 1 To UBound(Vector)
            With Sheets("Expiries")
                .Range("C" & 11 + j) = Vector(j)
                .Range("D" & 11 + j) = Sheets("per klant").Range("G" & Vector(j))
                .Range("E" & 11 + j).FormulaR1C1 = "=vlookup(RC[-2],COUNTERPARTIES!R3C2:R" & UBound(Party) + 2 & "C3,2)"
            End With
        Next j
    Else
        Sheets("Expiries").Range("C12") = "no expiries in reference period"
    End If
    Sheets("Expiries").Range("G6") = x - 1
    
    If x > 1 Then
        For m = 1 To UBound(Vector2)
            With Sheets("Expiries")
                .Range("G" & 11 + m) = Vector2(m)
                .Range("H" & 11 + m) = Sheets("per klant").Range("K" & Vector2(m))
                .Range("I" & 11 + m).FormulaR1C1 = "=vlookup(RC[-2],COUNTERPARTIES!R3C2:R" & UBound(Party) + 2 & "C3,2)"
            End With
        Next m
    Else
        Sheets("Expiries").Range("G12") = "no calls in reference period"
    End If
    
    End Sub
    Je suis desole je n'arrive pas a incorpore dans ce message les print ecran du fichier excel (il me met fichier invalide ??). Mais je peux peut-etre les envoyer par email.
    Pour les decrire :

    Sur l'onglet "per klant", il y a de A1 a A10, des codes de couleur (telle couleur pour tel caracteristique).
    Puis de A11 a K11, les intitules des colonnes avec en A11 "counterparty" et en G11 "expiry".

    Sur l'onglet "expiries", je mets une date de debut en C2 et une date de fin en C3.
    Puis je lance la macro et les resultats s'affichent en colonne a partir de C-D-E-12 et G-H-I-12.
    C12 = le numero de la ligne de la reponse
    D12 = la "expiry date"
    E12 = le nom de la societe
    G12, H12, I12 = Pareil que CDE12 sauf que ce n'est pas pour la date d'expiration mais la "call date".

    Ce n'est pas important, juste l'explication pour la "expiry Date" me servira.

    Merci.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 393
    Points : 451
    Points
    451
    Par défaut
    Bonjour, voici quelques elements de reponse...
    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 Vector()
    '(...)
    z = 1
     
    For i = 1 To teller
        If Sheets("per klant").Range("G" & 13 + i) >= Start Then
            If Sheets("per klant").Range("G" & 13 + i) <= Final Then
                ReDim Preserve Vector(1 To z)
                Vector(z) = 13 + i
                z = z + 1
            End If
        End If
        ' (...)
    Next i
    En gros, on déclare un tableau Vector() (ce qu'on appelle un vecteur (Array en anglais) en maths), dont on ne connaît pas la taille. On veut y mettre des données, mais on ne sait pas encore combien. En fait au fur et à mesure qu'on met des données dans ce tableau, on l'agrandit d'une case pour rajouter la nouvelle donnée. Bref on redimensionne le tableau à chaque fois.
    Ainsi "Redim tableau(5)" permet de vider le tableau et dire à VBA que c'est un tableau de taille maximale 5 (sachant que les indexes iront de 0 à 5). Cette taille maximale est donnée par "Ubound(tableau)". Pour redimensionner le tableau tout en gardant les données déjà existantes, il faut rajouter un "Preserve".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    For a = 1 To UBound(Party)
        With Sheets("counterparties").Range("B2")
            .Offset(a, 0) = Position(a)
            .Offset(a, 1) = Party(a)
        End With
    Next a
    Party et Position sont deux autres tableaux, de même taille apparemment... L'index max. est donc donné par "Ubound(Party").
    Range("B2").Offset(i, j) équivaut à faire [B2] + i lignes et + j colonnes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range("B2").Offset(5,1) = [C7]
    Range("B2").Offset(-1, 24) = [Z1]
    J'espere que j'aurais ete assez clair...

  3. #3
    Membre averti Avatar de mordrhim
    Inscrit en
    Avril 2007
    Messages
    270
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2007
    Messages : 270
    Points : 314
    Points
    314
    Par défaut
    perso j'aurais juste changé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                ReDim Preserve Vector(1 To z)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                ReDim Preserve Vector(z)

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    Merci beaucoup, je commence a comprendre.
    J'espere pouvoir finir cette macro avant la fin de mon stage la semaine prochaine.
    Si tu permets, en cas de probleme je reviendrai vers toi.
    Merci encore, non seulement de ton temps, mais aussi d'avoir repondu si vite, et si clairement.

    Certains n'aiment pas internet a cause de certaines derives et ils ont raison pour cela. Mais Internet a permis de decouvrir que les gens sont plus altruistes qu'on peut le penser dans la vie de tous les jours.
    a+.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 16
    Points : 10
    Points
    10
    Par défaut Encore 2 petites choses s'il vous plait.
    1/

    Si je mets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    teller = Sheets("data").Range("A65536").End(xlUp).Row - 12
    teller2 = teller + 2
    ...
    For i = 1 To teller
        If Sheets("data").Range("I" & 12 + i) >= Start Then
    ...
    Et que :
    * mon tableau commence en A13, (la ligne 12 etant celles des intitules du tableau),
    * et la dernier ligne de mon tableau est la ligne 40,

    Cela me donne le resultat suivant ?

    Pour i = 1
    j'obtiens la ligne 12 + 1 = 13

    Et pour i = teller
    j'obtiens la ligne 12 + 28 = 40.

    car teller = ligne 40 - 12 = ligne 28.

    C'est ca ?
    Et la ca marche.

    Mais alors ils se seraient trompes dans la macro dont je dois m'inspirer ??
    Parce que eux ils oublient que i commence a 1 et non a 0, et ils mettent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    teller = Sheets("data").Range("A65536").End(xlUp).Row - 13
    teller2 = teller + 2
    
    For i = 1 To teller
        If Sheets("data").Range("I" & 13 + i) >= Start Then.....
    ------------------------------------------------------------------------

    2/
    Pourquoi créer une seconde variable "teller2" et ne pas reutiliser la variable
    "teller" ??
    Il me semble que "teller2" fausse tout car pour le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    y = 1
    For i = 1 To teller2
        If Sheets("per klant").Range("A" & 11 + i).Interior.ColorIndex = 2 Then
            ReDim Preserve Party(1 To y)
            ReDim Preserve Position(1 To y)
            Party(y) = Sheets("per klant").Range("A" & 11 + i)
            Position(y) = 11 + i
            y = y + 1
        End If
    Next i
    si i = 1
    j'obtiens la ligne 11 + 1 = 12 [ce qui ne va pas, moi je veux 13]

    Et si i = teller2
    j'obtiens la ligne 11 + ((40 - 12) + 2) = 41 [ce qui ne va pas, moi je veux 40]

    ???

    Merci, et desole si pour vous ces questions peuvent paraitre desuetes : je ne suis pas programmeur du tout, mais mes boss se sont mis dans la tete que oui.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 393
    Points : 451
    Points
    451
    Par défaut
    Désolé, je n'avais pas lu tout le code et j'avais seulement regardé ce qui était en rouge, et tu avais raté une tag [/color]...
    Citation Envoyé par fakebis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    teller = Sheets("per klant").Range("A65536").End(xlUp).[color="Red"]Row - 13
    Apparemment, d'après ce que tu viens décrire, ce que tu dis me paraît correct.
    1/ Si l'entete commence a la ligne 12, le code avec teller va surement louper la ligne 13... Peut-etre y'avait-il avant 1 ligne en plus que qqn aurait supprimée...
    2/ Il est inutile d'avoir 2 variables teller et teller2 surtout que teller n'est pas modifiée... Mais la personne qui avait codé cela, voulait peut-etre "naviguer" avec 2 variables sur 2 plages différentes, et bien les distinguer... teller sur les colonnes G et K, et teller2 sur la colonne A...?

    Je suis aussi perplexe que toi. Mais justement, tu dois être là pour peut-être simplifier tout ça, et peut-être même corriger certaines erreurs...

    Bon courage donc!

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 16
    Points : 10
    Points
    10
    Par défaut Mon stage se finira bien !!
    Merci beaucoup Dadavyvy.
    J'ai fini ma macro, en changeant le code de départ, vu qu'il y avait des erreurs et des lourdeurs.
    Je n'ai mis qu'une seule variable teller, et j'ai arrangé un peu l'ensemble.
    Mes boss ont fait des tests et ca marche nickel.
    Bon j'avoue n'avoir pas encore tout très bien saisi dans cette macro, mais quand même, je suis content d'avoir appris certaines choses, et d'en avoir fini.
    Encore merci.
    a+.

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

Discussions similaires

  1. Utilisation de Redim preserve
    Par nbelg27 dans le forum Général VBA
    Réponses: 6
    Dernier message: 23/01/2007, 17h55
  2. comment utiliser actionscript ?
    Par webs dans le forum Flash
    Réponses: 3
    Dernier message: 09/02/2003, 23h11
  3. [VB6] Erreur 9 sur redim preserve
    Par tomnie dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 22/10/2002, 17h29
  4. Comment utiliser OUT ?
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 3
    Dernier message: 20/07/2002, 09h35
  5. Réponses: 5
    Dernier message: 11/06/2002, 15h21

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