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 :

Retraitement de données avec VBA codes


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 10
    Par défaut Retraitement de données avec VBA codes
    Bonjour à tous.

    Je me trouve confronté à un problème de retraitement de donnée et j'aimerai le résoudre avec un code VBA.

    Le problème est le suivant: J'ai des données concernant des actions avec des dates, leurs rendement et le nbre d'actions. Mes données concernant mes actions sont les unes sous les autres. Et j'aimerais pouvoir les avoir les unes à côtés des autres.

    Sur 4 colonnes (identifiant, date, rendement, nbre d'action), j'ai d'abord toutes les données concernant Microsoft (par exemple), puis toutes les données concernant yahoo, etc. Donc au lieu d'avoir ces données verticalement, je voudrais les avoir horizontalement (une sorte de transposée)

    Je sais que c'est pas hyper clair, alors c'est pour cela que j'ai joint un fichier pour illustrer mon problème. Qlq un aurait-il une idée sur le code VBA que je pourrais utiliser?

    Merci beaucoup
    Fichiers attachés Fichiers attachés

  2. #2
    Membre Expert Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Par défaut
    Ce que je verrai c'est utiliser un filtre selon le numéro sur la colonne puis la copie
    des cellules visibles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Thisworksheet.Cells.SpecialCells(xlCellTypeVisible).Copy

  3. #3
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut et Bienvenu a toi
    Voici comment je procéderais.

    Initialisation de 2 variables (long ou entier selon besoin) X = 0 Y = -1
    Une Boucle qui suis les case une a une en colonne A
    Si valeur dans caseA <> X Alors
    X = Valeur CaseA
    Y = Y + 1
    Fin Si
    caseA + les 3 cases suivantes copiées vers colonne n° 7 (colonne G) + (Y*4) à la suite des données deja existantes
    Boucle

    Voila c'est une boucle simple, a toi de réfléchir a sa mise en œuvre.
    Si tu as un problème n'hésites pas a proposer ton code.

    A++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  4. #4
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 10
    Par défaut
    Merci bcp pour votre aide à vous deux.

    J'ai donc réussi à implémenter ce que je voulais. Je donne le code au cas ou qlq un en aurait besoin

    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
    Sub Retraitement_données()
    '18th March 2009
     
    Cells(5, 7) = Cells(5, 1).Value
    Cells(5, 8) = Cells(5, 2).Value
    Cells(5, 9) = Cells(5, 3).Value
    Cells(5, 10) = Cells(5, 4).Value
    x = 0
    s = 0
    v = 0
    j = 0
    For i = 1 To 43
    If Cells(5 + i, 1) - Cells(4 + i, 1) = x Then
    Cells(5 + i - s, 7 + v) = Cells(5 + i, 1).Value
    Cells(5 + i - s, 8 + v) = Cells(5 + i, 2).Value
    Cells(5 + i - s, 9 + v) = Cells(5 + i, 3).Value
    Cells(5 + i - s, 10 + v) = Cells(5 + i, 4).Value
     
     
    ElseIf Cells(5 + i, 1) - Cells(4 + i, 1) <> x Then
    j = j + 4
    Cells(5, 7 + j) = Cells(5 + i, 1).Value
    Cells(5, 8 + j) = Cells(5 + i, 2).Value
    Cells(5, 9 + j) = Cells(5 + i, 3).Value
    Cells(5, 10 + j) = Cells(5 + i, 4).Value
     
    v = j
    s = i
     
    End If
     
    Next i
     
    End Sub

  5. #5
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut
    C'est une possibilité, en voici une autre

    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
    Sub FlipFlap()
    Dim TheCell As Range
    Dim X As Long, Y As Long
    Dim Entete As Range
     
    'J'avais oublié les entet de colonne
    Set Entete = Range("A4:D4")
    'Initialisation de 2 variables (long ou entier selon besoin) X = 0 Y = -1
    X = 0
    Y = -1
    'Une Boucle qui suis les cases une a une en colonne A
    For Each TheCell In Range("A5", Cells(Rows.Count, "A").End(xlUp))
    'Si valeur dans caseA <> X Alors
        If TheCell <> X Then 'On crée une nouvelle colonne de valeur
            X = TheCell 'X = Valeur CaseA
            Y = Y + 1 'Y = Y + 1
            Entete.Copy Cells(3, 7 + Y * 4)
        End If 'Fin Si
    'caseA + les 3 cases suivantes copiées vers colonne n° 7 (colonne G) + (Y*4) à la suite des données deja existantes
    TheCell.Resize(1, 4).Copy Cells(Rows.Count, 7 + Y * 4).End(xlUp).Offset(1, 0)
    Next 'Boucle
    End Sub
    J'avais oublié dans mon code littéral la gestion des entête de colonnes.
    Comme disait toujours mon prof d'electro, il y a autant de câblages possibles que d'élève dans la classe, c'était pas très vrai... mais par contre pour le code c'est une chose sur

    a++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  6. #6
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 10
    Par défaut
    Merci pour cette autre version de code.

    Comme t'as pu le constater, je débute en programmation . Mon code est moins simple que le tiens. Mais bon, l'important c'est qu'il fonctionne.

    je pense d'ailleurs que je vais utiliser ton code pour résoudre la deuxième partie de mon problème. il faut maintenant que je fasse correspondre les dates. Un petit fichier excel s'impose afin d'illustrer ma problèmatique.

    Je crée manuellement une colonne avec des dates allant de 1986 à 2007 par exemple. Il faudrait que mes données concernant mes actions soient alignées sur les dates correspondantes.

    J'espère que le fichier joint aidera à mieux comprendre la problématique
    Fichiers attachés Fichiers attachés

  7. #7
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 10
    Par défaut
    J'ai fait qlq tentatives. J'ai un semblant de réponse. Je voulais utiliser la fonction vlookup. Le résultat que j'ai obtenu pour l'instant se trouve dans le fichier joint

    Je veuc classer les rendements par action et par ordre chronologique. Mon seul prob, c'est que je n'arrive pas ensuite à avoir les résultats pour les autres actions.

    J'aimerai introduire For...To. Y a-t-il une erreur dans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Worksheets("Sheet2").Activate
    For j= 0 to 20 step 4
    For i = 0 to 50
    Cells(7+i, 7) = Application.WorksheetFunction.Vlookup(Cells(7, 7-i), Worksheets(1).Range(Cells(4,8+j),Cells(11,10+j))3, True)
     
    Next i
     
    Next j

    Car pour l'instant, seul cette manière fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Worksheets("Sheet2").Activate
     
    Cells(7, 7) = "=VLOOKUP(RC[-1],Sheet1!R4C8:R11C10,3,FALSE)"
    Cells(7, 7).Select
    Selection.AutoFill Destination:=Range("G7:G298")
    Et le problème avec cette manière, c'est que je n'arrive pas à introduire des i ou j
    Fichiers attachés Fichiers attachés

  8. #8
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut
    J'ai vu que tu avais essayé avec des formules, ce qui me semble adapté si tu rentre les valeur des dates manuellement.
    Si tu le souhaite, on peut améliorer les formules pour réaliser ce que tu souhaites sans passer par du code vba.
    Dis moi
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  9. #9
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 10
    Par défaut
    Alors volontiers si tu as une autre solution. Car le code que j'ai utilisé est assez lourd. Il ne faut pas oublier que le fichier excell est juste un échantillon de ce que j'ai réellement. J'ai facilement un million de données. Et si je pouvais éviter que les macros tournent toute la nuit sur mon ordi, ca m'arrangerai

    Donc si tu as une solution alternative, c'est volontiers que je t'écoute...

  10. #10
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut
    Formule a coller en G4
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    =SI(ESTERREUR(EQUIV(F4;DECALER($B$5;;;NBVAL($B:$B)-1);0));"Inconnu";CELLULE("contenu";INDIRECT(ADRESSE(4+EQUIV(F4;DECALER($B$5;;;NBVAL($B:$B)-1);0);3))))
    A++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  11. #11
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 10
    Par défaut
    merci pour cette proposition.

    J'ai vu que le fichier que j'avais joint manquait également de précision. Donc je joins le fichier suivant (le resultat à obtenir se trouve dans la "sheet2")

    Et voici le code que j'ai utilisé:

    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
     
     
    Sub DATA ()
    For g = 8 To 40 Step 4
    For i = 4 To 500
    a = Worksheets("sheet2").Cells(i, 2)
    b = Worksheets("sheet3").Cells(4, g)
    If a = b Then
    r = Worksheets("sheet2").Cells(i, 1)
    For t = 1 To 30
    For w = g To g + 3
    u = Worksheets("sheet3").Cells(3 + t, w - 1)
     
    Worksheets("sheet2").Cells(r + 2 + t, w - 1) = u
    Next w
    Next t
    End If
    Next i
    Next g
     
     
    End Sub


    Cependant, ce code m'a l'air assez lourd (la macro tourne assez longtemps). Donc si tu as une idée pour améliorer ça, je suis tout ouie :-)

    J'ai déjà essayer avec un fonction lookup dans VBA, mais j'avais tjs une erreur (1004 ne parvient pas à utiliser la fonction lookup).
    Fichiers attachés Fichiers attachés

  12. #12
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut
    Désolé je ne saisi pas ton problème.
    Tu souhaitais réorganiser ton tableau en plusieurs bloc en fonction de l'identifiant. Ce problème est il résolu?

    Tu me parles d'une liste de date écrite manuellement, je t'ai donné une formule, résout elle ton problème?

    Les boucles imbriqué que tu a codé servent a quoi exactement? si dans la sheet3 certaine cases sont saisies manuellement mets les en couleur bleu par exemple , celles qui doivent être récupérées ailleurs en orange et si certaine doivent être calculé met les en verts, fait une légende, car c'est assez confus pour moi désolé, je suis plusieurs post en meme temps et les codes et buts de chacun finissent par s'emmeler si les demandes successives ne sont pas clairement défini.

    A++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  13. #13
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 10
    Par défaut
    Excuse-moi, c'est vrai que c'est pas hyper clair.

    Alors j'ai essayé d'àméliorer mon fichier. La sheet importante est la sheet 2. J'y ai noté dessus ce que je cherche à faire. Ce qu'il y a sur la sheet 3 est ce que tu m'avais aidé à trouver au début de ce post.

    En gros, j'ai réussi à obtenir ce que je voulais. Je veux aligner mes données par rapport à un axe chronologique. Seulement, la boucle que j'ai faite (elle se trouve dans la deuxième partie de "retraitement des données2") est bcp trop lourde (en terme de temps pour faire tourner la macro). Ca risque de prendre bcp de temps quand j'aurai un million de données...

    Il doit exister une solution plus simple (genre un Vlookup). Cependant, quand j'essaie avec Vlookup, dès qu'une date n'a pas de correspondant dans l'"array" de recherche, la macro plante.

    Donc si tu as une solution, c'est avec avec plaisir que je vais l'examiner.
    Fichiers attachés Fichiers attachés

  14. #14
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut
    Alors c pas bien dure regardes

    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
    Sub Retraitement_données2()
     
    Dim TheCell As Range
    Dim X As Long, Y As Long
    Dim Entete As Range
     
    'Worksheets("Sheet3").Activate
    'J'avais oublié les entet de colonne
    Set Entete = Range("A4:D4")
    'Initialisation de 2 variables (long ou entier selon besoin) X = 0 Y = -1
    X = 0
    Y = -1
    'Une Boucle qui suis les cases une a une en colonne A
    For Each TheCell In Range("A5", Cells(Rows.Count, "A").End(xlUp))
    'Si valeur dans caseA <> X Alors
        If TheCell <> X Then 'On crée une nouvelle colonne de valeur
            X = TheCell 'X = Valeur CaseA
            Y = Y + 1 'Y = Y + 1
            Entete.Copy Cells(3, 7 + Y * 4)
        End If 'Fin Si
    'caseA + les 3 cases suivantes copiées vers colonne n° 7 (colonne G) + (Y*4) à la suite des données deja existantes
    'TheCell.Resize(1, 4).Copy Cells(Rows.Count, 7 + Y * 4).End(xlUp).Offset(1, 0)
    TheCell.Resize(1, 4).Copy Cells(TheCell.Row, 7 + Y * 4)
    Next 'Boucle
     
    End Sub
    Pour faire ce que tu souhaite il suffit juste de modifier la dernière ligne, ainsi au lieu d'aller empiler les ligne les une en dessous des autres, il suffit de les mettre sur la même ligne que thecell.

    A++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  15. #15
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 10
    Par défaut
    Merci, pour ta réponse.

    Alors, ca se rapproche de ce que je cherche à obtenir, mais c'est pas encore tout a fait ça. J'ai joins un fichier pour te montrer. J'espère que j'ai été assez clair dans les explications que j'ai noté dans ce fichier.

    Dans la sheet 1, c'est ce que j'ai obtenu avec ta nouvelle formule

    Dans la sheet 2, c'est ce que je veux obtenir. J'y ai détaillé ce que je cherchais.
    Fichiers attachés Fichiers attachés

  16. #16
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut
    On recommence, j'ai changer l'utilisation de sheet.activate est pas recommandé, elle ralenti le code pour rien, sauf si vraiment tu veux afficher le sheet en question.

    Cette fois a la fin du code pour placer la ligne, il suffit de regarder ou ce trouve la date en question dans la colonne F et de copier les infos sur la même ligne.

    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
    Sub Retraitement_données2()
     
    Dim TheCell As Range
    Dim X As Long, Y As Long
    Dim Entete As Range
    Dim TheSheet As Worksheet
    Dim FindedCell As Range
     
     
    Set TheSheet = Worksheets("Sheet2")
    'J'avais oublié les entet de colonne
    Set Entete = TheSheet.Range("A4:D4")
    'Initialisation de 2 variables (long ou entier selon besoin) X = 0 Y = -1
    X = 0
    Y = -1
    'Une Boucle qui suis les cases une a une en colonne A
    For Each TheCell In TheSheet.Range("A5", TheSheet.Cells(Rows.Count, "A").End(xlUp))
    'Si valeur dans caseA <> X Alors
        If TheCell <> X Then 'On crée une nouvelle colonne de valeur
            X = TheCell 'X = Valeur CaseA
            Y = Y + 1 'Y = Y + 1
            Entete.Copy TheSheet.Cells(3, 7 + Y * 4)
        End If 'Fin Si
        'caseA + les 3 cases suivantes copiées vers colonne n° 7 (colonne G) + (Y*4) à la suite des données deja existantes
        'Il faut juste rechercher la valeur dans la colonne F
        'et utiliser le row de cette cellule afin de l'utiliser dans la formule suivante
        Set FindedCell = TheSheet.Columns("F").Find(TheCell.Offset(0, 1))
     
        If Not FindedCell Is Nothing Then
            TheCell.Resize(1, 4).Copy TheSheet.Cells(FindedCell.Row, 7 + Y * 4)
            'On remet la couleur par defaut (le cas se presente si la date est rajouter lors d'un 2eme lancement dans la colonne F)
            TheCell.Offset(0, 1).Interior.ColorIndex = 45
     
        Else
            'La date est introuvable
            'On le signale en passant cette dateen rouge
            TheCell.Offset(0, 1).Interior.ColorIndex = 3
        End If
     
    Next 'Boucle
     
    End Sub
    Voila qui devrait satisfaire ton besoin.
    A++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  17. #17
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 10
    Par défaut
    Alors là, j'ai qu'une seule chose à dire, tu es magique

    Merci beaucoup, t'imagines pas à quelle point tu as réduit le temps pour que ma macro tourne!! Car après, j'avais fait des macros por faire des regressions et toutes sortes de calculs. Mais ce qui posait le plus de problème était le fait de pouvoir aligner mes données par rapport à un axe chronologique.

    Grace à ta macro, ma macro globale mets 5 minutes au lieu de 30!! T'as réussi à optimiser ma macro globale!!

    Encore une fois merci!

  18. #18
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut
    De rien.
    Oserais je demander a voir la macro global ?
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  19. #19
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 10
    Par défaut
    Pas de souci, je te donne volontiers la macro. Grace à toi, maintenant elle est maintenant nettement plus optimale. Avant, elle mettait plus de 30 minutes à tourner. Maintenant j'arrive à obtenir ce que je cherchais.

    Voilà le genre de calcul que je fais.

    Tout d'abord, après avoir classé les actions selon les dates, je choisis au bol une date (event). Pour la séléctionner, elle doit au moins avoir un historique de (-20;+10) autour de l'event. Ensuite, parmis toutes ces actions j'en sélectionne 6 au bol.

    Enfin, je vais faire des regressions avec ces 6 actions par rapport à des indices. ces indices sont fictifs pour le moment. Je cherche juste à faire tourner la macro pour l'instant....

    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
    182
    183
    184
    Sub Retraitement_données2()
     
    Dim TheCell As Range
    Dim X As Long, Y As Long
    Dim Entete As Range
    Dim TheSheet As Worksheet
    Dim FindedCell As Range
     
     
    Set TheSheet = Worksheets("Sheet1")
    'J'avais oublié les entet de colonne
    Set Entete = TheSheet.Range("B4:E4")
    'Initialisation de 2 variables (long ou entier selon besoin) X = 0 Y = -1
    X = 0
    Y = -1
    'Une Boucle qui suis les cases une a une en colonne A
    For Each TheCell In TheSheet.Range("B5", TheSheet.Cells(Rows.Count, "B").End(xlUp))
    'Si valeur dans caseA <> X Alors
        If TheCell <> X Then 'On crée une nouvelle colonne de valeur
            X = TheCell 'X = Valeur CaseA
            Y = Y + 1 'Y = Y + 1
            Entete.Copy TheSheet.Cells(3, 10 + Y * 4)
        End If 'Fin Si
        'caseA + les 3 cases suivantes copiées vers colonne n° 7 (colonne G) + (Y*4) à la suite des données deja existantes
        'Il faut juste rechercher la valeur dans la colonne F
        'et utiliser le row de cette cellule afin de l'utiliser dans la formule suivante
        Set FindedCell = TheSheet.Columns("I").Find(TheCell.Offset(0, 1))
     
        If Not FindedCell Is Nothing Then
            TheCell.Resize(1, 4).Copy TheSheet.Cells(FindedCell.row, 10 + Y * 4)
            'On remet la couleur par defaut (le cas se presente si la date est rajouter lors d'un 2eme lancement dans la colonne F)
            TheCell.Offset(0, 1).Interior.ColorIndex = 45
     
        Else
            'La date est introuvable
            'On le signale en passant cette dateen rouge
            TheCell.Offset(0, 1).Interior.ColorIndex = 3
        End If
     
    Next 'Boucle
     
    'For g = 8 To 100 Step 4
    'For i = 4 To 1000
    'A = Worksheets("sheet2").Cells(i, 2)
    'B = Worksheets("sheet1").Cells(4, g)
    'If A = B Then
    'r = Worksheets("sheet2").Cells(i, 1)
    'For t = 1 To 270
    'For w = g To g + 3
    'u = Worksheets("sheet1").Cells(3 + t, w - 1)
     
    'Worksheets("sheet2").Cells(r + 2 + t, w - 1) = u
    'Next w
    'Next t
    'End If
    'Next i
    'Next g
     
    Worksheets("sheet1").Activate 'RANDOM EVENT
     
    For i = 0 To 20
    Cells(5 + i, 6) = Int((295) * Rnd() + 0)
    Next i
     
     
    'STOCK SELECTION .This macro selects the stocks depending on the event date. It selects the stock only if there is an history of 20 months before the event date
    'In the random process of determining the events, we have to be sure that the lower bound will not be equal or less than the
    'number of months that we have to take into consideration before the event date.
    K = 0
    For j = 1 To 4 '10 is the number of sample that we want. We have one event per sample
    Sheets("Sheet1").Select
    Y = 5 + Cells(5 + j, 6).Value 'I add 3 because it is the number of row from where the dates start
    Z = 0
    For i = 0 To 36 '6 is the number of stocks that we have
    Worksheets("Sheet1").Activate
    If Cells(Y - 20, 10 + i) <> 0 And Cells(Y + 10, 10 + i) <> 0 Then '20 is the number of months that we want before the event date
    Z = Z + 1
    Range(Cells(Y - 20, 10 + i), Cells(Y + 20, 10 + i)).Select '16 is the column number from where we start looking at event date
    Selection.Copy
    Sheets("StockSelection").Select
    Cells(3 + K, Z).Select
    ActiveSheet.Paste
    Cells(2 + K, Z).Select
    Cells(2 + K, Z) = Z
    End If
    Next i
     
     
    'NOW WE ARE DRAWING NUMBERS UP TO 5 (it depends how many stock we'd like to have in our sample)
    For h = 0 To 5 '5 is the number of stocks in the sample
    Sheets("StockSelection").Select
    Cells(1 + K, 1 + h) = Int(Z * Rnd() + 1)
    Next h
     
    K = K + 44
    Next j
     
     
    'This part is randomly drawing stock whithin the ones that were previously selected
    For C = 0 To 175 Step 44
    For B = 1 To 6 '6 is the number of stocks that we have in our sample. This number should be h + 1
    Sheets("StockSelection").Select
    A = Cells(C + 1, B).Value
    Range(Cells(3 + C, A), Cells(43 + C, A)).Select
    Selection.Copy
    Sheets("RndSelection").Select
    Cells(1 + C, B).Select
    ActiveSheet.Paste
     
    Next B
     
    Next C
     
     
    'THIS IS THE REGRESSION PART. EVERYTHING GOES FROM SHEET "RNDSELECTION" TO SHEET "REGRESSION"
    Dim ligne As Integer
    Dim col As Integer
    Dim row As Integer
    Dim column As Integer
    Dim s As Double
    Dim p As Double
    Dim q As Double
     
    For g = 0 To 131 Step 44 '44 is the gap between 2 time series
    ligne = 18 + g '(nb ofcolumns)*(1+nb of factors)
    col = 41 ' nb of lines(number of lines of the time series)
     
    ReDim Reg(v, w) As Variant
    ReDim data(ligne, col) As Variant
     
    Sheets("RndSelection").Activate
     
    p = -2 + g
    q = 0
     
    Sheets("RndSelection").Activate
     
    For j = 1 To 6 '6 is the number of stocks that we have
     
    q = 0
    p = p + 3 '3 is the number of factors that we have + 1
     
    For i = 1 To 41 'This is the length of the time serie
     
    If Cells(i + g, j).Value <> "" And Cells(i + g, 52).Value <> "" And Cells(i + g, 53) <> "" Then '52 & 53 are the column numbers where the factors are
    s = p
    q = q + 1
    data(p, q) = Cells(i + g, j).Value
     
    s = s + 1
    data(s, q) = Cells(i + g, 52).Value
    s = s + 1
    data(s, q) = Cells(i + g, 53).Value
     
    End If
    Next i
    Next j
     
     
    Sheets("Regressions").Activate
     
    For i = g + 1 To ligne
       For j = 1 To col
     
      Cells(i, j).Value = data(i, j)
     
        Next j
     
    Next i
     
    For i = g + 1 To ligne Step 3 '3 is the number of factors that we have + 1
     
     
    Reg = WorksheetFunction.LinEst(Range(Cells(i, 1), Cells(i, 1).End(xlToRight)), Range(Cells(i + 1, 1), Cells(i + 2, 1).End(xlToRight)), , True)
     
    Cells(i, 45) = Reg(1, 1)  'gets the gamma for beta
    Cells(i, 46) = Reg(1, 2)  'gets the gamma for beta^2
    Cells(i, 47) = Reg(3, 1)  'gets the r^2
     
     
    Next i
     
    Next g
    End Sub
    J'ai mis qlq commentaires, mais je sais pas si tu vas comprendre ce que j'ai fait. Le fichier joint devrait te permettre d'avoir une meilleure compréhension de ce que je cherchais à faire.

    Encore une fois merci pour ton aide.
    Fichiers attachés Fichiers attachés

  20. #20
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut
    J'ai regardé vite fait ton code.
    Reprend le code que l'on a composé enssemble, a aucun moment je n'utilise .Activate .Select ... Il faut autant que possible, c'est a dire toujours sauf lorsque tu souhaites activé quelque chose pour que l'utilisateur y est accés directement, il faut donc quasiement toujours banir cette forulation dans du vba.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    sheets("Bonjour").Activate
    Range("A2").Activate
    ActiveCell.value = "Coucou"
    Deviens

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("Bonjour").Range("A2").Value = "Coucou"
    Bien plus digeste n'est ce pas. et surtout bien plus rapide a exécuter pour Excel.

    Si tu doit utiliser plusieurs fois sheets("Bonjour") dans ton code, toujours pour une question de lisibilité on fera
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    With sheets("Bonjour")
      .Range("A2") = "Coucou"
      .cells(rows.Count,"C").Offset(1,0) = "Vous ici ?"
      '....
    End With
    Si tu souhaites amélioré ta macro retraite ton code en respectant deja ces règles simples et reviens poster ton code afin de l'affiner un peu plus.

    A++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

Discussions similaires

  1. Connexion base de donnée avec un code C#
    Par yochima dans le forum C#
    Réponses: 12
    Dernier message: 20/05/2017, 19h12
  2. [ACC97] - Pilotage IE avec vba - code masqué dans fichier adx
    Par samuelsiffert dans le forum VBA Access
    Réponses: 0
    Dernier message: 23/07/2014, 20h20
  3. [AC-2003] gérer une base de données avec des codes barres
    Par franklin59 dans le forum Modélisation
    Réponses: 1
    Dernier message: 09/12/2009, 15h21
  4. extraction de données avec vba vers excel
    Par SandyF dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 07/08/2009, 15h37
  5. Réponses: 1
    Dernier message: 19/06/2007, 11h56

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