VBA - Mise à jour données portefeuille

Bonjour à tous,

Voilà, je possède un fichier avec un onglet ‘Mouvements’ (source) qui récapitule toutes les nouvelles opérations boursières d’une journée (achat, vente de valeurs), avec les détails. Par ailleurs, je possède un onglet par type d’instrument (‘actions’, ‘OPCVM’).

J’aimerais au travers d’une macro alimenter automatiquement les onglets ‘Actions’ et ‘OPCVM’ :

- Lorsque il y a une opération sur une valeur dans ‘Mouvements’ qui n’est pas dans l’onglet correspondant Actions ou OPCVM, alors ajouter une ligne de l’opération dans l’onglet spécifique à la suite avec les détails (code valeur, type, libellé, qté, montant).

- Lorsque les valeurs existent déjà en onglet ‘Actions’ ou ‘OPCVM’, j’aimerais que seulement les quantités et que le Montant investi se mette à jour (une somme en gros avec les nouvelles opérations).

J’espère avoir été assez clair ; Le fichier a pour objectif d’être mis à jour tous les jours avec des nouveaux ‘Mouvements’.

38book-1.xlsm (11.44 Ko)

Merci beaucoup si vous avez une solution !

Bonjour,

un TCD suffit avec un segment pour choisir

9book-1.xlsx (16.31 Ko)

Bonjour Steelson,

Même si le résultat est le même j'aurais souhaité une solution VBA! (je sais que ce n'est pas le plus simple aussi)

Merci!

une solution simple ...

Private Sub worksheet_activate()
    ActiveSheet.PivotTables(1).PivotCache.Refresh
End Sub
5book-1.xlsm (20.97 Ko)

on peut toujours faire plus complexe ! mais pourquoi ?

Bonjour Steelson,

Merci pour cette solution, mais je tiens à distinguer les onglets et à garder exactement la même forme du fichier initial. C'est pour quoi une solution une VBA se montre la plus appropriée. La forme doit être maintenue car je réalise plusieurs travaux par la suite sur le même fichier.

Encore merci!

ok, j'ai compris ta contrainte, je vais reprendre ...

dois-je cumuler s'il y a déjà un code valeur identique présent ?

Bonjour à tous,

- Lorsque les valeurs existent déjà en onglet ‘Actions’ ou ‘OPCVM’, j’aimerais que seulement les quantités et que le Montant investi se mette à jour (une somme en gros avec les nouvelles opérations).

vu, j'ajoute cette fonctionnalité

un même code valeur peut avoir 2 libellés différents ?

Sub MAJ()
Dim result(), dico As Object
Set dico = CreateObject("Scripting.Dictionary")

tbl = Sheets("Mouvements").Range("A1").CurrentRegion.Value

With Sheets("Actions")
    .Range("A8").CurrentRegion.ClearContents
    k = 1
    ReDim result(1 To UBound(tbl, 2) - 2, 1 To k)
    For i = LBound(tbl) + 1 To UBound(tbl)
        If tbl(i, 4) Like .Name & "*" Then
            If dico.Exists(tbl(i, 3)) Then
                For j = 6 To 7
                    result(j - 2, dico(tbl(i, 3))) = result(j - 2, dico(tbl(i, 3))) + tbl(i, j)
                Next
            Else
                dico(tbl(i, 3)) = k
                For j = 3 To 7
                    result(j - 2, k) = tbl(i, j)
                Next
                k = k + 1
            End If

            ReDim Preserve result(1 To UBound(tbl, 2) - 2, 1 To k)
        End If
    Next
    .Range("A8").Resize(UBound(result, 2), UBound(result)) = Application.Transpose(result)
End With
dico.RemoveAll

With Sheets("OPCVM")
    .Range("A8").CurrentRegion.ClearContents
    k = 1
    ReDim result(1 To UBound(tbl, 2) - 2, 1 To k)
    For i = LBound(tbl) + 1 To UBound(tbl)
        If tbl(i, 4) Like .Name & "*" Then
            If dico.Exists(tbl(i, 3)) Then
                For j = 6 To 7
                    result(j - 2, dico(tbl(i, 3))) = result(j - 2, dico(tbl(i, 3))) + tbl(i, j)
                Next
            Else
                dico(tbl(i, 3)) = k
                For j = 3 To 7
                    result(j - 2, k) = tbl(i, j)
                Next
                k = k + 1
            End If

            ReDim Preserve result(1 To UBound(tbl, 2) - 2, 1 To k)
        End If
    Next
    .Range("A8").Resize(UBound(result, 2), UBound(result)) = Application.Transpose(result)
End With

End Sub
17book-1-1.xlsm (22.00 Ko)

Re,

C'est exactement le rendu que je souhaitais!

Cependant, pour répondre à ta 1ere question: "dois-je cumuler s'il y a déjà un code valeur identique présent ?", la réponse est oui justement. Car à chaque nouvelle journée, il y aura des nouveaux mouvements qui viendront remplacés les actuels et donc il faudra que les quantités et les montants se mettent à jour dans chaque onglet.

"un même code valeur peut avoir 2 libellés différents ?" --> Non, désolé j'avais juste fait des copier coller pour mon exemple. Mais pas besoin de 'tester' cette problématique.

Pourrais-tu également m'indiquer en commentaire à quoi correspond les différents chiffres que tu utilises (2, 4, 7, 1, etc...)? C'est pour que je comprennes mieux !

Merci énormément,

  • 7 = il y a 7 colonnes dans tes données .... j'aurais plutôt dû mettre Ubound(tbl,2) qui donne la deuxième dimension du tableau de données tbl
  • 4 = 4ème colonne du tableau qui comporte le type
  • 3 = 3ème colonne du tableau qui comporte le code valeur
  • 2 = je fais moins 2 sur le n° de colonne des données stockées dans tbl car le résultat n'a pas les 2 premières colonnes

je reconnais que c'est une véritable gymnastique de l'esprit

astuce : le tableau résultat appelé result est inversé par rapport au tableau de données tbl : parce que l'on ne peut redimensionner que le second indice si on veut préserver les données déjà stockées ... donc en final je lui fait faire une pirouette par transpose

Merci je comprends mieux! Merci beaucoup en tout cas, cela résout ma problématique!

Le seul problème est que lorsque je supprime tous les mouvements dans l'onglet Mouvements, et que j'insère une nouvelle ligne de mouvements, la somme ne s'effectue pas avec ce qu'il y a déjà d'existant dans les autres onglets... je ne veux pas tout supprimer tout comme tu le fais avec les ".Range("A8").CurrentRegion.ClearContents" mais tout simplement ajuster les quantités et montants des lignes existantes en fonctions des nouveaux mouvements.

Dernier point, est-il possible de supprimer totalement la ligne lorsque dans les onglets 'Actions' ou 'OPCVM' la quantité atteint '0' ?

Le seul problème est que lorsque je supprime tous les mouvements dans l'onglet Mouvements, et que j'insère une nouvelle ligne de mouvements, la somme ne s'effectue pas avec ce qu'il y a déjà d'existant dans les autres onglets... je ne veux pas tout supprimer tout comme tu le fais avec les ".Range("A8").CurrentRegion.ClearContents" mais tout simplement ajuster les quantités et montants des lignes existantes en fonctions des nouveaux mouvements.

Dernier point, est-il possible de supprimer totalement la ligne lorsque dans les onglets 'Actions' ou 'OPCVM' la quantité atteint '0' ?

un chose à la fois,

  • pour le premier point, supprime la ligne .Range("A8").CurrentRegion.ClearContents elle est présente 2 fois, me dire si ok pour toi

Hello,

Non justement, j'ai bien supprimer ces lignes mais il a l'air de 'remplacer' sans garder le résultat existant...

ok, il faut donc que j'initialise result avec les données déjà existantes

je te fais cela d'ici demain matin

Pas de soucis, merci énormément...

Bonjour,

attention à ne pas l faire tourner 2 fois de suite ... cela va multiplier les valeurs !

Sub MAJ()
Data = Sheets("Mouvements").Range("A1").CurrentRegion.Value
categ "Actions", Data
categ "OPCVM", Data
End Sub

Sub categ(cat As String, tbl As Variant)
Dim result(), dico As Object, prov
Set dico = CreateObject("Scripting.Dictionary")
With Sheets(cat)
    k = 1
    ReDim result(1 To UBound(tbl, 2) - 2, 1 To k)

    ' récupération des données présentes si existantes
    If .Cells(Rows.Count, 1).End(xlUp).Row >= 8 Then
        prov = .Range("A8").CurrentRegion.Value
        For i = LBound(prov) To UBound(prov)
        dico(prov(i, 1)) = k
            For j = 1 To UBound(prov, 2)
                result(j, k) = prov(i, j)
            Next
            k = k + 1
            ReDim Preserve result(1 To UBound(tbl, 2) - 2, 1 To k)
        Next
    End If

    ' traitement nouvlles données
    For i = LBound(tbl) + 1 To UBound(tbl)
        If tbl(i, 4) Like .Name & "*" Then
            ' cas où le code valur existe déjà
            If dico.Exists(tbl(i, 3)) Then
                For j = 6 To UBound(tbl, 2)
                    result(j - 2, dico(tbl(i, 3))) = result(j - 2, dico(tbl(i, 3))) + tbl(i, j)
                Next
            ' cas où le code valeur est nouveau
            Else
                dico(tbl(i, 3)) = k
                For j = 3 To UBound(tbl, 2)
                    result(j - 2, k) = tbl(i, j)
                Next
                k = k + 1
                ReDim Preserve result(1 To UBound(tbl, 2) - 2, 1 To k)
            End If
        End If
    Next

    ' écritur des résultats
    .Range("A8").Resize(UBound(result, 2), UBound(result)) = Application.Transpose(result)
End With
End Sub
19book-1-1.xlsm (22.45 Ko)

Bonjour à tous,

Mais que deviennent les données de la feuille "Mouvements" après l'exécution de la macro ?

Tu dis :

à chaque nouvelle journée, il y aura des nouveaux mouvements qui viendront remplacés les actuels

Donc, on peut supprimer ces données et éviter ainsi un 2ème click qui s'avérerait catastrophique en l'occurrence !

klin89

Rechercher des sujets similaires à "vba mise jour donnees portefeuille"