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 :

passage d'un tableau statique à un dynamique


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Inscrit en
    Juillet 2007
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 502
    Points : 181
    Points
    181
    Par défaut passage d'un tableau statique à un dynamique
    bonjour
    voici mon code qui fonctionne mais je souhaite optimiser . je dois rajouter de nobreux autre test


    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
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
     
    Private Sub CommandButton1_Click()
     Dim kk As Integer 'index tableaufiltreprochainXXXX
     
    Dim liste As New Collection
    Dim i As Long, DerniereLigne As Long
    Dim k, colonne As Variant
    Dim nbinf, nbsup, nbegal As Long
    Dim resultat() As Double
    Dim typedepari As Integer
    Dim a, b, c, d, aa As Integer
     
    'initialization des divers variables
    typedepari = 0
    colonne = 0
    aa = 0
    a = 0
    b = 0
    c = 0
    d = 0
    kk = 0
    UserForm4.TextBox1.Value = ""
    UserForm4.TextBox3.Value = ""
    UserForm4.TextBox4.Value = ""
    nbegal = 0
    nbinf = 0
    nbsup = 0
     
     
    If CheckBox1.Value = True Then CheckBox2.Value = False And CheckBox3.Value = False And CheckBox4.Value = False
    If CheckBox2.Value = True Then CheckBox1.Value = False And CheckBox3.Value = False And CheckBox4.Value = False
    If CheckBox3.Value = True Then CheckBox1.Value = False And CheckBox2.Value = False And CheckBox4.Value = False
    If CheckBox4.Value = True Then CheckBox1.Value = False And CheckBox2.Value = False And CheckBox3.Value = False
     
     
     
    If OptionButton1.Value = True And CheckBox1.Value = True Then typedepari = 5 'quintesomme
    If OptionButton2.Value = True And CheckBox1.Value = True Then typedepari = 4 'quarte
    If OptionButton3.Value = True And CheckBox1.Value = True Then typedepari = 3 'tierce
    'ici on rajoute d'autre optionbutton
     
    Worksheets("stat").Select ' selectionne la feuille stat
     
     
     
     
     
     
     
     
    Select Case typedepari
     
     
     
    Case 5 'somme qunte
       'pour le quinte
        DerniereLigne = Range("j65536").End(xlUp).Row 'la somme des chx arrivee au quinte
        colonne = 10
         infofiltre = "Somme pour le quinte"
    Case 4 'somme
       'pour le quarte
        DerniereLigne = Range("k65536").End(xlUp).Row 'la somme des chx arrivee au quarte
        colonne = 11
        infofiltre = "Somme pour le quarte"
     
    Case 3 'somme
       'pour le tierce
        DerniereLigne = Range("l65536").End(xlUp).Row 'la somme des chx arrivee au tierce
        colonne = 12
        infofiltre = "Somme pour le tierce"
    'ici on rajoute d'autre choix
     
    End Select
     
     
      On Error Resume Next
     
    For i = 2 To DerniereLigne
        liste.Add Cells(i, colonne), CStr(Cells(i, colonne))
    Next i
    On Error GoTo 0
    ReDim resultat(1 To 4, 1 To liste.Count)
    For k = 1 To liste.Count
     
    nbegal = 0
     nbinf = 0
     nbsup = 0
     
     
        For i = 2 To DerniereLigne - 1
            If Cells(i, colonne) = liste.Item(k) Then
                If Cells(i, colonne) > Cells(i + 1, colonne) Then nbinf = nbinf + 1
                If Cells(i, colonne) = Cells(i + 1, colonne) Then nbegal = nbegal + 1
                If Cells(i, colonne) < Cells(i + 1, colonne) Then nbsup = nbsup + 1
            End If
        Next i
        resultat(1, k) = liste.Item(k) 'a  la valeur somme
        resultat(2, k) = nbinf 'b
        resultat(3, k) = nbegal 'c
        resultat(4, k) = nbsup 'd
     
     
     
    Next k
     
     
     
        UserForm4.TextBox1.Value = ""
        UserForm4.TextBox1.Value = infofiltre & vbCrLf 'affiche l'info sur quel filtre a été realise la stat
     
     
    'affichage dans le textbox
    For k = 1 To liste.Count
     aa = resultat(1, k) ' la somme concernee
     a = resultat(1, k) & "a été trouve " & (resultat(2, k) + resultat(3, k) + resultat(4, k)) 'la valeur somme
     b = (FormatNumber((resultat(2, k) * 100) / (resultat(2, k) + resultat(3, k) + resultat(4, k)), 0))
     c = (FormatNumber((resultat(3, k) * 100) / (resultat(2, k) + resultat(3, k) + resultat(4, k)), 0))
     d = (FormatNumber((resultat(4, k) * 100) / (resultat(2, k) + resultat(3, k) + resultat(4, k)), 0))
     
     'test que le textbox du  % est bien rempli et qu'il est sup egal ou inf à b,c ou d
     If UserForm4.TextBox2.Value > 0 And b > UserForm4.TextBox2.Value Or c > UserForm4.TextBox2.Value Or d > UserForm4.TextBox2.Value Then
        Load UserForm4
        UserForm4.TextBox1.Value = UserForm4.TextBox1.Value & "la valeur somme " & a & "  fois  :  " & " "
        If b > UserForm4.TextBox2.Value Then UserForm4.TextBox1.Value = UserForm4.TextBox1.Value & b & " % des valeurs qui suivent seront <      "
        If c > UserForm4.TextBox2.Value Then UserForm4.TextBox1.Value = UserForm4.TextBox1.Value & c & " " & " % des valeurs qui suivent seront =  "
        If d > UserForm4.TextBox2.Value Then UserForm4.TextBox1.Value = UserForm4.TextBox1.Value & d & " % des valeurs qui suivent seront > " '
     
     
     
        'affiche la somme dans usf3 qui aura la somme suivante sup en fonction du % retenu
        If d > UserForm4.TextBox2.Value And b < UserForm4.TextBox2.Value And c < UserForm4.TextBox2.Value Then      'test que le  textbox du% et checkb somme sup est actif valde
           UserForm4.TextBox3.Value = UserForm4.TextBox3.Value & aa & " " & vbCrLf 'affichag des somme retenues
           'remplir le tablfiltresup
           tablfiltreprochainsup(kk) = aa
           kk = kk + 1
           'MsgBox (" sup le k=" & kk)
        End If
     
     
        'affiche la sommme dans usf3 qui aura somme suivante  inf en fonction du % retenu
        If b > UserForm4.TextBox2.Value And c < UserForm4.TextBox2.Value And d < UserForm4.TextBox2 Then     'test que le txt box du % et checkb somme inf est actif valide
           UserForm4.TextBox4.Value = UserForm4.TextBox4.Value & aa & " " & vbCrLf ' affichage des sommes retenues
           'rempli le tablfiltreprochaninf
           tablfiltreprochaininf(kk) = aa
           kk = kk + 1
     
        End If
     
    UserForm4.TextBox1.Value = UserForm4.TextBox1.Value & vbCrLf ' saut le ligne dans le usf4.txt1
    On Error Resume Next 'permet d'arreter le programme apres la premiere erreur située lors que l'indice i arrive à la derniere ligne de colonne
     
     
     Else
          If UserForm4.TextBox2.Value = 0 Then 'borne du % souhaite  =0 alors on affiche tout
             UserForm4.TextBox1.Value = UserForm4.TextBox1.Value & "Il y a eu pour la valeur somme " & a & "fois  :  " & " " & b & "%valeur < qui suivaient     " & c & " " & "%valeur = qui suivaient    " & d & "%valeur > qui suivaient " & vbCrLf
             On Error Resume Next 'permet d'arreter le programme apres la premiere erreur située lors que l'indice i arrive à la derniere ligne de colonne
          End If
     End If
     
    Next k
     
     'affichage du contenu du tableau tablfiltresup
     
     For II = LBound(tablfiltreprochainsup) To LBound(tablfiltreprochainsup) + kk - 1
          'pour verifier que la tableaufiltreprochainXXXX est bien rempli
         MsgBox ("affichage des somme au prochain tirg seront sup" & tablfiltreprochainsup(II))
     
     
     
     Next II
     
     For II = LBound(tablfiltreprochaininf) To LBound(tablfiltreprochaininf) + kk - 1
         'pour verifier que la tableaufiltreprochainXXXX est bien rempli
         MsgBox ("affichage des sommes au prochain tir sqeront inf " & tablfiltreprochaininf(II))
     
     Next II
     
     
     UserForm4.Show
     
     End Sub


    je cherche à passer en tableaudynamique mes tablfiltreprochainif et tableaufiltresup .
    A chaque fois que j'utilise la fonction REDIM , le tableau se remet à 0 (ce qui normal) , j'ai utilisé la variable KK pour redimensionner les tableaux.

    un petit coup de main serait sympa

    ps si vous voyez d'autre point à optimiser je suis preneur .

    merci


    oscar.cesar

  2. #2
    Membre émérite
    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
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut oscar.cesar et le forum
    voici mon code qui fonctionne mais je souhaite optimiser . je dois rajouter de nobreux autre test
    C'est bien, mais je n'ai pas envie de le créer pour avoir une idée de l'algo. De plus, ne connaissant pas le reste de l'environnement, tout ce que je pourrais imaginer ne sera peut-être que fantasme de ma part.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    '...
    Dim nbinf, nbsup, nbegal As Long
    '...
    Dim a, b, c, d, aa As Integer
    Là, tu déclares nbegal en Long, aa en Integer et nbinf, nbsup, a, b, c, d en variant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If CheckBox1.Value = True Then CheckBox2.Value = False And CheckBox3.Value = False And CheckBox4.Value = False
    ??? Pour moi, "And" est un opérateur logique, donc si CheckBox1 = vrai, on crée le résultat "CheckBox2 = False And CheckBox3 = False And CheckBox4 = False" :
    – Vrai si les 3 Checkbox sont à faux,
    – Faux si une au moins est à vrai.
    Et quel en est le but ? Ça marche peut-être comme tu veux, parce qu'Excel est gentil, mais un jour tu vas avoir des problème et tu ne sauras pas pourquoi : confondre opération logique et action crée quelques fois des aberrations...
    je cherche à passer en tableaudynamique mes tablfiltreprochainif et tableaufiltresup .
    A chaque fois que j'utilise la fonction REDIM , le tableau se remet à 0 (ce qui normal) , j'ai utilisé la variable KK pour redimensionner les tableaux.
    Désolé, je ne comprends pas : Chaque fois que tu lances ta macro, tes tableaux se remettent à zéro.
    Comme tu n'utilises pas ton instruction Redim dans une boucle, c'est normal qu'il repasse à zéro. Si c'est dans une boucle et que tu veux conserver ce que contient le tableau, tu peux utiliser "ReDim Preserve".

    A+


    Nota : Étant le sixième lecteur, je ne pense pas être le seul à ne rien comprendre au sujet

  3. #3
    Membre habitué
    Inscrit en
    Juillet 2007
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 502
    Points : 181
    Points
    181
    Par défaut
    bonjour
    Là, tu déclares nbegal en Long, aa en Integer et nbinf, nbsup, a, b, c, d en variant
    Code :

    If CheckBox1.Value = True Then CheckBox2.Value = False And CheckBox3.Value = False And CheckBox4.Value = False

    ??? Pour moi, "And" est un opérateur logique, donc si CheckBox1 = vrai, on crée le résultat "CheckBox2 = False And CheckBox3 = False And CheckBox4 = False" :
    – Vrai si les 3 Checkbox sont à faux,
    – Faux si une au moins est à vrai.
    Et quel en est le but ? Ça marche peut-être comme tu veux, parce qu'Excel est gentil, mais un jour tu vas avoir des problème et tu ne sauras pas pourquoi : confondre opération logique et action crée quelques fois des aberrations...

    Effectivement cela peut preter à des aberrations . je vais m'atteler à corriger cela . Peut etre sous cette forme ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    If CheckBox1.Value = True Then
       CheckBox2.Value = False
       CheckBox3.Value = False
       CheckBox4.Value = False
    End If






    Citation:
    je cherche à passer en tableaudynamique mes tablfiltreprochainif et tableaufiltresup .
    Citation:
    A chaque fois que j'utilise la fonction REDIM , le tableau se remet à 0 (ce qui normal) , j'ai utilisé la variable KK pour redimensionner les tableaux.
    Désolé, je ne comprends pas : Chaque fois que tu lances ta macro, tes tableaux se remettent à zéro.
    Comme tu n'utilises pas ton instruction Redim dans une boucle, c'est normal qu'il repasse à zéro. Si c'est dans une boucle et que tu veux conserver ce que contient le tableau, tu peux utiliser "ReDim Preserve".
    ma fonction redim est lancée dans ma blc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    For k = 1 To liste.Count
    ......
    apres chaque incrementation de k j'effecuai un redim .

    bref pas top




    Pourqoui passer d'un tableau statisque en dynamique c'est la taille de mon tableau est variable puisque liée avec le list.count

  4. #4
    Membre émérite
    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
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut oscar.cesar et le forum
    ma fonction redim est lancée dans ma blc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    For k = 1 To liste.Count
    ......
    apres chaque incrementation de k j'effecuai un redim.
    ??? la seule instruction ReDim du code donné est ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      On Error Resume Next
    For i = 2 To DerniereLigne
        liste.Add Cells(i, colonne), CStr(Cells(i, colonne))
    Next i
    On Error GoTo 0
    ReDim resultat(1 To 4, 1 To liste.Count)
    For k = 1 To liste.Count
    À moins que le code fournit soit faux, ton instruction ReDim est bien hors de la boucle de K, qui commence à la ligne suivante. De plus, à moins d'erreur de ma part, une boucle For est figée lors de son initialisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub test()
    Dim x as Integer
    For x = 1 To x + 2
        MsgBox x
    Next x
    End Sub
    Ce code, sous Excel 2003, ne donnera que 2 messages, alors qu'on devrait avoir une boucle infinie.
    si tu veux que ton instruction ReDim soit asservie à ta boucle, il faut déclarer ton tableau avant, et l'incrementer en dans la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    For k = 1 To liste.Count
       if k= 1 then 
          ReDim resultat(1 To 4, 1 To k)
       Else
          ReDim Preserve resultat(1 To 4, 1 To k)
       endif
    Tu ne peux pas utiliser Preserve si le tableau n'a pas d'indice, d'où la nécessité de faire un test.
    A+

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

Discussions similaires

  1. Tableau Dynamique pointant sur Tableau Statiques
    Par ShaiLeTroll dans le forum Langage
    Réponses: 15
    Dernier message: 16/11/2009, 14h56
  2. Réponses: 5
    Dernier message: 02/05/2009, 15h27
  3. [MySQL] Différence : tableau statique (hardcodé) et tableau dynamique (mysql) ?
    Par vandeyy dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 30/01/2007, 16h09
  4. Réponses: 4
    Dernier message: 19/12/2006, 20h06
  5. char *, string et tableau statique ou dynamique
    Par salseropom dans le forum C
    Réponses: 2
    Dernier message: 05/12/2005, 11h33

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