VBA - Mise à jour données portefeuille

je suis d'accord avec toi Klin89, je laisse le soin à matmar77 de décider la meilleure façon de sécuriser,

  • soit supprimer mouvements
  • soit mettre un indicateur pour bloquer
  • soit (le mieux) une date de dernier mouvement enregistré sur chaque ligne afin de ne pas cumuler

En effet ! Je n'y avais pas pensé...

Et effectivement steelson, une date de dernier mouvement enregistré sur chaque ligne afin de ne pas cumuler serait Idéale mais je ne sais pas comment m'y prendre ! Sinon je mettrais un indicateur plutôt que de supprimer.

ok je le fais demain, mais ensuite faut-il le tester par rapport à la date du jour et donc ne faire qu'un seul rapprochement max par jour je suppose ...

Essaie ceci, mais cela commence à devenir complexe !

14book-v2.xlsm (23.19 Ko)

Effectivement, cela commence à devenir complexe (gestion des dates etc). Le résultat est tout de même parfait. J'essaierais de mon côté de mettre un indicateur pour bloquer, pour comparer les 2 versions. Merci beaucoup !

Re à tous,

Un autre cheminement, j'ai employé la méthode Remove du dictionnaire.

Je n"ai pas géré le dernier point.

A tester sur une copie de ton fichier

Option Explicit
Sub update()
    Dim a, e, w, i As Long, dico As Object
    Set dico = CreateObject("Scripting.Dictionary")
    dico.CompareMode = 1
    a = Sheets("Mouvements").Range("a1").CurrentRegion.Value
    For i = 2 To UBound(a, 1)
        If Not dico.exists(a(i, 3)) Then
            dico(a(i, 3)) = VBA.Array(a(i, 3), a(i, 4), a(i, 5), a(i, 6), a(i, 7))
        Else
            w = dico(a(i, 3))
            w(3) = w(3) + a(i, 6): w(4) = w(4) + a(i, 7)
            dico(a(i, 3)) = w
        End If
    Next
    For Each e In Array("Actions", "OPCVM")
        a = Sheets(e).Range("a8").CurrentRegion.Value
        For i = 1 To UBound(a, 1)
            If dico.exists(a(i, 1)) Then
                a(i, 4) = a(i, 4) + dico(a(i, 1))(3)
                a(i, 5) = a(i, 5) + dico(a(i, 1))(4)
                dico.Remove a(i, 1)
            End If
        Next
        Sheets(e).Range("a8").Resize(UBound(a, 1), UBound(a, 2)).Value = a
        If dico.Count Then
            For i = 0 To dico.Count - 1
                If dico.items()(i)(1) Like e & "*" Then
                    Sheets(e).Range("a" & Rows.Count).End(xlUp)(2) _
                            .Resize(1, UBound(dico.items()(i), 1) + 1).Value = dico.items()(i)
                End If
            Next
        End If
    Next
    Set dico = Nothing
End Sub

klin89

Merci Klin, des choses très intéressantes en effet dans ta macro : notamment un dico en array. Cela peut améliorer en effet la "lisibilité" de la macro.

Re!

Je voulais savoir si il était possible de "ne pas mettre à jour" (ne rien faire) les lignes pour lesquels où la 'Quantité' de l'onglet 'Mouvements' est nulle?

Je suppose qu'il ne s'agit que d'un If mais avec la manipulation des 'dico' etc , je ne sais pas trop où le mettre...

merci,

Voici

12book-v3.xlsm (23.79 Ko)
Rechercher des sujets similaires à "vba mise jour donnees portefeuille"