Renvoyer des valeurs en fonction d'une date

Fermé
sgrigoryann Messages postés 7 Date d'inscription mercredi 28 août 2019 Statut Membre Dernière intervention 29 août 2019 - Modifié le 28 août 2019 à 14:36
sgrigoryann Messages postés 7 Date d'inscription mercredi 28 août 2019 Statut Membre Dernière intervention 29 août 2019 - 29 août 2019 à 08:55
Bojour a tous,

Je vous serais extremement reconnaissante si vous pouviez m'aider sur un code vba/macro.

J 'ai écrit un code qui me copie les valeurs de la ligne 14 de la feuille Excel appelée MSBI ETFs et me les renvoie dans la feuille excel Sheet2.


1) J'aimerais que ce code marche en fonction d'une cellule B1 contenant des valeurs qui changeront (par exemple une date). Car je m'explique : les valeurs de la ligne 14 que je veux dépendent d'une date car c'est une série temporelle.
J 'aimerais que lorsque je change la valeur de la cellule B1 (exemple 23.08.2019) du Worksheet("Sheet2") la macro me ramene les valeurs de la ligne 14 du worksheet("MSBI ETFs") pour la meme date.
1.2) De plus j'aimerais que les valeurs renvoyées soient transposées : ne pas être renvoyées sur la ligne 1 mais dans la colonne A. VBA me donne toujours le meme message d'erreur "Run-tim error 1004: paste method of worksheet class failed" quand je lance mon code.

Voici le code pour le renvoie que j'ai écrit :
Code :    Sub copy()
Worksheets("MSBI ETFs").Activate
Range("C14:Z14").Select
Selection.copy
Worksheets("Sheet2").Activate
ActiveSheet.Paste Destination:=Worksheets("Sheet2").Range("A1").PasteSpecial(Transpose:=True)
End Sub


Merci beaucoup de votre aide!

4 réponses

ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
28 août 2019 à 14:57
Bonjour Yann, bonjour le forum,

Il y a un problème dans ton énoncé. Tu veux les données en fonction d'une date, ok, mais puisque tu veux toujours la plage C14:Z14, je ne vois pas en quoi la modification de date va changer quelque chose. En me relisant je me rend compte que je suis aussi peu clair que toi... Je te propose de nous fournir un fichier exemple à l'aide d'un hébergeur e fichier type : https://www.cjoint.com.

Ce sera plus facile pour tout le monde...
1
sgrigoryann Messages postés 7 Date d'inscription mercredi 28 août 2019 Statut Membre Dernière intervention 29 août 2019
28 août 2019 à 15:28
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476 > sgrigoryann Messages postés 7 Date d'inscription mercredi 28 août 2019 Statut Membre Dernière intervention 29 août 2019
28 août 2019 à 15:40
le fichier n'inclut pas de code, et ne semble pas correspondre au code.
0
sgrigoryann Messages postés 7 Date d'inscription mercredi 28 août 2019 Statut Membre Dernière intervention 29 août 2019 > yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024
28 août 2019 à 15:41
Oui j'a juste fait un exemple car je ne peux pas envoyer le fichier en question c'est assez confidentiel :(
0
sgrigoryann Messages postés 7 Date d'inscription mercredi 28 août 2019 Statut Membre Dernière intervention 29 août 2019
28 août 2019 à 15:31
J'a besoin de faire ca parce que pour une date donnée je peux ne pas avoir un certain instrument dans mon portefeuille d'actifs par exemple. Je peux aussi très bien acheter et vendre un instrument financiers et c'est donc normal que pour une date donnée j'ai pas de montant investit pour un instrument (dans ce cas j'aimerais que vba me renvoie les instruments oè il y a un montant)
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
28 août 2019 à 16:21
Re,

Je te propose la macro événementielle Change ci-dessous à placer dans le composant de l'onglet Output. Chaque fois que tu changeras la date ça agira...
Private Sub Worksheet_Change(ByVal Target As Range) 'au changement dans l'onglet
Dim DC As Date 'déclare la variable DC (Date Cherchée)
Dim OP As Worksheet 'déclare la variable OP (Onglet Portfolio)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim DT As Date 'déclare la variable DT (Date Trouvée)

If Target.Address <> "$C$1" Then Exit Sub 'si le changement a lieu ailleurs qu'en C1, sort de la procédure
range("A3:A" & Application.Rows.Count).ClearContents 'efface d'éventuelles anciennes données
If Target.Value = "" Then Exit Sub 'si C1 est effacée, sort de la procédure
DC = DateSerial(Year(Target.Value), Month(Target.Value), Day(Target.Value)) 'définit la date cherchée DC
Set OP = Worksheets("Portfolio") 'définit l'onglet OP
TV = OP.Range("A12").CurrentRegion 'définit le tableau des valeurs TV
For I = 4 To UBound(TV, 1) 'boucle sur toutes les ligne I du tableau des valeurs (en partant de la 4ème)
    DT = DateSerial(Year(TV(I, 1)), Month(TV(I, 1)), Day(TV(I, 1))) 'définit la date trouvée DT (donnée en colonne 1 de la ligne de la boucle)
    If DT = DC Then 'condition : si les dates correspondent
        Range("A3").Resize(UBound(TV, 2),1).Value = application.transpose(Application.Index(TV, I)) 'renvoie dans A3 redimensionnée la ligne I du tableau des valeurs TV
        Exit Sub 'sort de la procédure
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle
End Sub


Le lien : https://www.cjoint.com/c/IHCouPrUldc
1
sgrigoryann Messages postés 7 Date d'inscription mercredi 28 août 2019 Statut Membre Dernière intervention 29 août 2019
28 août 2019 à 22:37
Salut ThauTheme, merci infiniement pour ton temps et le code! Le code est pratiquement ce que je cherche sauf que j'aimerais que le code renvoie les noms des ETFs se trouvant sur le ligne 14 à la place de leur montants chaque fois que il y a un montant existant pour la date entré dans la cellule C1. En gros j'aimerais que lorsque quand je rentre 01.01.2018 dans la cellule C1 au lieu de me donner 15000 6000 il me donne SPY EUN2.

Merci encore mille fois pour ton aide et ton temps!!
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
28 août 2019 à 23:18
Re,

Le code adapté :

Private Sub Worksheet_Change(ByVal Target As Range) 'au changement dans l'onglet
Dim DC As Date 'déclare la variable DC (Date Cherchée)
Dim OP As Worksheet 'déclare la variable OP (Onglet Portfolio)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Integer 'déclare la variable J (incrément)
Dim K As Integer 'déclare la variable K (incrément)
Dim DT As Date 'déclare la variable DT (Date Trouvée)
Dim TT() As Variant 'déclare la variable TT (Tableau des Tickers)

If Target.Address <> "$C$1" Then Exit Sub 'si le changement a lieu ailleurs qu'en C1, sort de la procédure
Range("A2:A" & Application.Rows.Count).ClearContents 'efface d'éventuelles anciennes données
If Target.Value = "" Then Exit Sub 'si C1 est effacée, sort de la procédure
DC = DateSerial(Year(Target.Value), Month(Target.Value), Day(Target.Value)) 'définit la date cherchée DC
Set OP = Worksheets("Portfolio") 'définit l'onglet OP
TV = OP.Range("A12").CurrentRegion 'définit le tableau des valeurs TV
K = 1 'initialise la variable K
For I = 4 To UBound(TV, 1) 'boucle 1 : sur toutes les ligne I du tableau des valeurs (en partant de la 4ème)
    'définit la date trouvée DT (donnée en colonne 1 de la ligne de la boucle)
    DT = DateSerial(Year(TV(I, 1)), Month(TV(I, 1)), Day(TV(I, 1)))
    If DT = DC Then 'condition 1 : si les dates correspondent
        For J = 1 To UBound(TV, 2) 'boucle 2 : sur toutes les colonnes J du tableau des valeurs TV
            If TV(I, J) <> "" Then 'condition 2 : si la donnée ligne I colonne J de TV n'est pas vide
                ReDim Preserve TT(1 To 1, 1 To K) 'redimensionne le tableau des tickers TT
                TT(1, K) = TV(2, J) 'récupère dans la ligne 1 colonne K de TT, la donnée en ligne 2 colonne J de TV
                K = K + 1 'incrémente K (ajoute une colonne au tableau des tickers TT)
            End If 'fin de la condition 2
        Next J 'prochaine colonne de la boucle 2
        Exit For 'sort de la boucle 1
    End If 'fin de la condition 1
Next I 'prochaine ligne de la boucle 1
'si K est supérieure à 1, renvoie dans la cellule A2 redimensionnée le tableau TT transposé
If K > 1 Then Range("A2").Resize(UBound(TT, 2), 1).Value = Application.Transpose(TT)
End Sub

1
sgrigoryann Messages postés 7 Date d'inscription mercredi 28 août 2019 Statut Membre Dernière intervention 29 août 2019
29 août 2019 à 08:55
Merci infiniement! ca marche du tonerre! je vais essayer de l'appliquer sur ma vrai feuille excel maintenant !!!
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
Modifié le 28 août 2019 à 15:39
bonjour, au lieu de
Range("C14:Z14").Select
Selection.copy
Worksheets("Sheet2").Activate
ActiveSheet.Paste Destination:=Worksheets("Sheet2").Range("A1").PasteSpecial(Transpose:=True)

tu peux peut-être faire
Range("C14:Z14").copy
Worksheets("Sheet2").Paste Destination := Worksheets("Sheet2").Range("A1").PasteSpecial(Transpose:=True)

il vaut mieux éviter de faire
select
et
activate
.
0
sgrigoryann Messages postés 7 Date d'inscription mercredi 28 août 2019 Statut Membre Dernière intervention 29 août 2019
28 août 2019 à 15:49
non toujours le meme message d'erreur :(
0