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 :

Manipulation de Tableaux [Toutes versions]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Architecte systèmes embarqués
    Inscrit en
    Juin 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte systèmes embarqués

    Informations forums :
    Inscription : Juin 2015
    Messages : 21
    Par défaut Manipulation de Tableaux
    Bonjour tout le monde !
    Je suis un petit nouveau sur le forum mais je le visite depuis très longtemps et jusqu'ici il m'a été très souvent utile !

    Je viens vous voir aujourd'hui car j'ai un problème que je n'arrive pas à résoudre dans le cadre de mon travail professionnel :

    Principe général de mon code :
    J'ai une colonne "Colonne" que je rentre dans un graphique grâce à vba : Fait !
    Grâce à une userform mon utilisateur vient modifier un peu cette courbe : Fait !
    Durant son traitement de la courbe il peut en visualiser les effets par appui sur un CommandButton: le soucis est là !

    Principe du code de mon problème :
    Le bouton et l'appel de la procédure c'est fait !
    Je crée une variable de stockage "Stock" sur laquelle j'effectue le traitement. Je mets dans cette variable les données de ma colonne "Colonne", puis grâce à une boucle for je modifie élément par élément les valeurs présentent dans Stock jusqu'à un évènement "Event" qui me fait sortir de ma boucle for par Exit For.

    Ainsi j'ai en résultat pour Stock : Les valeurs de "Colonne" avec traitement de la part de l'utilisateur jusqu'à l'indice auquel se produit "Event" puis les valeurs de "Colonne" sans traitement jusqu'à la fin de ma courbe. Puis j'envoie ma variable Stock dans mon graphique pour visualisation par l'utilisateur.

    (Lignes est une variable "public as Integer" issue d'une autre procédure qui contient le nombre de lignes de "Colonne")

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim  i As Integer
    Dim Stock() As Single                                                           <---Le problème est que Stock semble selon moi changer de type entre ici 
    ReDim Stock(Lignes - 1)
    Stock()= "Valeurs de Colonne"                                                <--- ici 
    For i = 2 To Lignes
        Stock(i - 2) = "Traitement basé sur une moyenne glissante"    <--- et ici même si pour moi il est tout le temps un Single !
    If "Event" Then
            Exit For
        End If
    Next
        ActiveSheet.ChartObjects("Graphique 1").Activate
        ActiveChart.SeriesCollection(4).Values = Stock

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    il manque une information capitale : quel effet néfaste cela engendre ?

    voici un exemple simple, sur lequel j'ai des Double (pas des Single) ... mais ça devrait également faire l'affaire :

    - j'ai mis en colonne A des chiffres à virgule
    - je travaille sur la feuille active car ce n'est qu'un test
    - j'ai repris la variable Lignes en local pour le test
    - je déclare mon Stock mais je ne le type pas, je laisse VBA le faire

    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
    Sub test()
    Dim i As Integer
    Dim Lignes As Long
    Dim Stock
     
    ' nombre de ligne de la colonne A
    Lignes = Cells(Rows.Count, 1).End(xlUp).Row
    ' remplissage de Stock avec les valeurs de la colonne A
    Stock = Application.Transpose(Range(Cells(1, 1), Cells(Lignes, 1)).Value)
     
    ' pour chaque valeur de stock
    For i = 1 To Lignes
        ' je modifie arbitrairement la valeur (j'y ajoute la valeur de i)
        Stock(i) = Stock(i) + i
        ' renvoi le type 5 : Double
        Debug.Print VarType(Stock(i))
    Next i
     
    End Sub

  3. #3
    Membre averti
    Homme Profil pro
    Architecte systèmes embarqués
    Inscrit en
    Juin 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte systèmes embarqués

    Informations forums :
    Inscription : Juin 2015
    Messages : 21
    Par défaut
    Bonjour joe.levrai

    Citation Envoyé par joe.levrai Voir le message
    il manque une information capitale : quel effet néfaste cela engendre ?
    Oui effectivement !!!

    J'ai fait plusieurs essais de déclaration pour Stock :
    soit un Variant et alors "Stock" du traitement efface et remplace "Stock" des valeurs de "Colonne". Je n'ai donc que les valeurs d'avant "Event"
    soit un Single et là il me renvoi "incompatibilité de type" à la ligne du remplissage de Stock.

    Citation Envoyé par joe.levrai Voir le message
    - je déclare mon Stock mais je ne le type pas, je laisse VBA le faire
    J'ai testé avec celà et ca me renvoie "L'indice n'appartient pas à la sélection" à la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Stock() = Worksheets("RG").Range("D2:D" & Lignes).Value
    mais j'ai un peu de mal à voir de quel indice on parle...

    Je joind également mon code , je ne savais pas comment faire avant

    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
     
    Sub TAVD_recal()
        Dim Temp, i, Val As Integer
        Dim Stock() As Single
        ReDim Stock(Lignes - 1)
        Temp = UF_TAVD.TB_TAVD_Temp.Value 'Variable intervenant dans le traitement
        Val = UF_TAVD.TB_TAVD_Val.Value 'Variable intervenant dans le traitement
        Stock() = Worksheets("RG").Range("D2:D" & Lignes).Value
        For i = 2 To Lignes
            Stock(i - 2) = Temp + WorksheetFunction.Average(Range(Worksheets("RG").Cells(i, 4), Worksheets("RG").Cells(i + Val, 4))) - Worksheets("RG").Cells(i, 4).Value
            If Stock(i - 2) - Worksheets("RG").Cells(i, 4).Value <= 0 Then
                Exit For
            End If
        Next
        ActiveSheet.ChartObjects("Graphique 1").Activate
        ActiveChart.SeriesCollection(4).Values = Stock
     
    End Sub

  4. #4
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    C'est normal que les valeurs avant Event disparaissent, puisque tu les remplaces juste avant

    il vaut mieux travailler avec deux tableaux dans ce cas :

    ton tableau initial
    un tableau complémentaire dans lequel :

    - tu ajoutes au fur et à mesure tes valeurs de remplacement
    - quand tu arrives sur le Event (=on alimente plus le tableau), là tu met les valeurs initiales suivantes dans ton tableau complémentaire


    tu arrives donc avec :

    - ton tableau inital inchangé
    - ton tableau complémentaire contenant les valeurs modifiées et les valeurs initiales qui ne devaient pas être changées

  5. #5
    Membre averti
    Homme Profil pro
    Architecte systèmes embarqués
    Inscrit en
    Juin 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte systèmes embarqués

    Informations forums :
    Inscription : Juin 2015
    Messages : 21
    Par défaut
    Je vais tester tout ça avec 2 tableaux !

    PS: je ne savais pas à quoi correspondait application.transpose et je pense que cette commande va mettre très utile !

  6. #6
    Membre averti
    Homme Profil pro
    Architecte systèmes embarqués
    Inscrit en
    Juin 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte systèmes embarqués

    Informations forums :
    Inscription : Juin 2015
    Messages : 21
    Par défaut
    Je ne me suis pas servis de deux tableaux puisque Application.Transpose me permet d'aller chercher ce que j'aurai voulu stocker dans mon tableaud de valeurs initiales.

    J'ai ainsi rajouté ces quelques lignes en fin de procédure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    For j = i To Lignes
            Stock(j - 1) = Application.Transpose(Worksheets("RG").Cells(j, 4).Value)
    Next j
    Merci beaucoup d'avoir pris le temps de me répondre !!!

  7. #7
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Quand tu remplies un tableau d'un seul bloc avec en source une colonne, tu dois Transposer les données.

    Le tableau étant unidimensionnel, il attend des données linéaire et non pas en colonne

  8. #8
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Ou bien travailler avec un tableau à 2 dimensions sans le transposer

    Exemple amélioré

    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
    Sub TAVD_recal()
    Dim Temp As Single, Initial As Single
    Dim Pas As Integer
    Dim i As Long
    Dim Stock
     
    Temp = UF_TAVD.TB_TAVD_Temp.Value
    Pas = UF_TAVD.TB_TAVD_Val.Value
     
    Stock = Worksheets("RG").Range("D2:D" & Lignes).Value
    For i = 1 To Lignes - 1
        Initial = Stock(i, 1)
     
        Stock(i, 1) = Temp + Traitement(Stock, i, Pas)
     
        If Stock(i, 1) - Initial <= 0 Then Exit For
    Next i
     
    Worksheets("RG").ChartObjects("Graphique 1").Chart.SeriesCollection(4).Values = Stock
    End Sub
     
     
    Private Function Traitement(Tb, ByVal i As Long, ByVal V As Integer)
    Dim S As Double
    Dim j As Long
     
    If V > 0 Then
        For j = 0 To V
            S = S + Tb(i + j, 1)
        Next j
        Traitement = (S / (V + 1)) - Tb(i, 1)
    End If
    End Function

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

Discussions similaires

  1. Manipulation des tableaux
    Par driss80 dans le forum Fortran
    Réponses: 4
    Dernier message: 18/01/2008, 08h51
  2. manipulation des tableaux
    Par amine556 dans le forum Informix
    Réponses: 4
    Dernier message: 26/11/2007, 15h20
  3. Problème de manipulation de tableaux
    Par proff dans le forum Pascal
    Réponses: 8
    Dernier message: 01/04/2007, 10h07
  4. Manipulation de tableaux de tableaux
    Par vargasvan dans le forum Langage
    Réponses: 2
    Dernier message: 26/04/2006, 13h54
  5. [Tableaux] Manipulation de tableaux
    Par orus8 dans le forum Langage
    Réponses: 3
    Dernier message: 04/10/2005, 15h10

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