Mise à jour de donnees

dridriboulot

XLDnaute Nouveau
Bonjour à tous!

Je suis en train de mettre à jour une base de données et je suis face à un problème!
Je joins un exemple en pièce jointe.

La base de donnée recense les soumissionnaires a un contrat. Chaque contrat est identifié par un numéro. Il y a donc plusieurs soumissionnaires par contrat.

Un contrat est donnée à une date t (colonne date début). Néanmoins, il peut être modifié et apparaître ensuite à une date t ultérieure.
Je voudrais dans le cas où le contrat est modifié, ne conserver que les lignes du contrat à la date la plus récente.

Je vous remercie pour aide :)

Adrien
 

Pièces jointes

  • majdonnees.xls
    27 KB · Affichages: 50

Paf

XLDnaute Barbatruc
Re : Mise à jour de donnees

Bonjour dridriboulot,

un essai macro:

Code:
Sub Macro()
 Dim i As Long, Tablo, WS As Worksheet, dico As Object
 Set dico = CreateObject("Scripting.Dictionary")
 Set WS = Worksheets("exemple") ' à adapter
 Tablo = WS.Range("A2:B" & WS.Range("A" & Rows.Count).End(xlUp).Row)

 For i = LBound(Tablo) To UBound(Tablo)
    If Tablo(i, 1) > dico(Tablo(i, 2)) Then
        dico(Tablo(i, 2)) = CDbl(Tablo(i, 1))
    End If
 Next
 'copie du résultat à partir de D1 à adapter
 WS.Range("D1").Resize(dico.Count, 2) = Application.Transpose(Array(dico.Items, dico.keys))
End Sub

A+

Edit: il faudra mettre la première colonne au format date, car les données sont converties pour éviter le passage des dates en format US
 

dridriboulot

XLDnaute Nouveau
Re : Mise à jour de donnees

Merci beaucoup Paf pour ta réponse, c'est top!

J'ai encore une petite question, j'ai rajouté une colonne avec le nom des entreprises. Je voudrais faire la même chose mais conserver le nom des entreprises après exécution de la macro.

Par exemple pour le numéro 599525, je voudrais avoir les 7 lignes les plus récentes et supprimer les 7 plus anciennes. J'ai essayé de modifier la macro, mais sans grande réussite car j'ai du mal à la lire, notamment le "dico = CreateObject("Scripting.Dictionary")" si tu peux m'expliquer !

Merci d'avance!
 

Pièces jointes

  • majdonnees (1).xls
    32 KB · Affichages: 35

Paf

XLDnaute Barbatruc
Re : Mise à jour de donnees

re,

si j'ai bien compris:

Code:
Sub Macro_bis()
 Dim i As Long, Tablo, WS As Worksheet, dico As Object
 Set dico = CreateObject("Scripting.Dictionary")
 Set WS = Worksheets("exemple") ' à adapter
 Tablo = WS.Range("A2:C" & WS.Range("A" & Rows.Count).End(xlUp).Row)

 'création d'un dictionnaire avec clé=numéro-entreprise et item date la plus récente
 For i = LBound(Tablo) To UBound(Tablo)
    If Tablo(i, 1) > dico(Tablo(i, 2) & "-" & Tablo(i, 3)) Then
        dico(Tablo(i, 2) & "-" & Tablo(i, 3)) = CDbl(Tablo(i, 1))
    End If
 Next
 'déconcaténation de la clé et remplissage d'un tableau :en 1 la date, en 2le N° et en 3 l'entreprise
 For Each clé In dico.keys
    x = x + 1
    Tablo(x, 1) = dico(clé)
    Tablo(x, 2) = Split(clé, "-")(0)
    Tablo(x, 3) = Split(clé, "-")(1)
 Next
 'copie du résultat à partir de D1 à adapter
 WS.Range("D1").Resize(dico.Count, 3) = Tablo
End Sub


Set dico = CreateObject("Scripting.Dictionary") crée un objet qui stocke des paires clé/élément de données avec des clés uniques

ainsi, dico("Truc")="Bidule" crée un 'tableau ' contenant la clé(key): Truc et l'élément lié (item) :Bidule
mais si je rajoute, après la précédente,l'instruction
dico("Truc")="Machin", le 'tableau' contiendra alors Truc en clé mais Machin en item;

pour plus de détails voir l'aide excel sur dictionary et particulièrement le site de J. BOISGONTIER:
Objet dictionary

A+
 

gosselien

XLDnaute Barbatruc
Re : Mise à jour de donnees

Bonjour à tous, Paf à qui je pose la question:

j'étais "presque" arrivé à la même chose mais je butais sur les dates et j'aimerais comprendre cette partie:

If Tablo(i, 1) > dico(Tablo(i, 2)) Then
dico(Tablo(i, 2)) = CDbl(Tablo(i, 1))

tablo(i,1) est une date et dico(tablo(i,2)) est un chiffre ou du texte si on veut d'où mon incompréhension ...

Merci
 

Paf

XLDnaute Barbatruc
Re : Mise à jour de donnees

Re, et bonjour gosselien,

avec dico(Tablo(i, 2)) = CDbl(Tablo(i, 1)) pour la clé Tablo(i, 2) on a l'item CDbl(Tablo(i, 1)) (soit la date en numérique) et effectivement If Tablo(i, 1) > dico(Tablo(i, 2)) Then c'est comparer une date à un numérique, mais, je pense que VBA 'travaille' les dates en numérique, ce qui ne pose donc pas de problème .

Pour plus de clarté, j'aurais pu écrire If CDbl(Tablo(i, 1)) > dico(Tablo(i, 2)) Then on visualiserait alors la comparaison de deux numériques.

A+
 

gosselien

XLDnaute Barbatruc
Re : Mise à jour de donnees

C'est mon neurone le soucis , t'inquiète :)

J'ai bcp de mal avec les dico mais un peu maso, je tente souvent de les utiliser et il faut piger avant tout ...et je rame à chaque fois malgré un nombre impressionnant d'exemples.

Encore une fois, je pensais avoir compris, mais c'est rapé...

Ici je pense que c'est le ",1" et le ",2" qui me perturbe :)
 

Paf

XLDnaute Barbatruc
Re : Mise à jour de donnees

re,

avec Tablo = WS.Range("A2:B" & WS.Range("A" & Rows.Count).End(xlUp).Row)

on crée un tableau qui aura pour dimensions les dimensions de la plage déterminée (le nombre de lignes en première dimension et le nombre de colonnes en deuxième dimension);soit, à partir du classeur du post 1, un tableau de 36 lignes sur deux colonnes (Date et Numéro):

Tablo(1,1) 'ramène' la valeur de coordonnées première ligne,première colonne; soit 01/06/2013
Tablo(1,2) 'ramène' la valeur de coordonnées première ligne,deuxième colonne; soit 345234
...
Tablo(12,1) 'ramène' la valeur de coordonnées douzième ligne,première colonne; soit 01/02/2013
Tablo(12,2) 'ramène' la valeur de coordonnées douzième ligne,deuxième colonne; soit 599525
...
etc

dico(Tablo(i, 2)) = CDbl(Tablo(i, 1))

on crée un couple clé-item dans le dico
clé= tablo(i,2)
on 'pointe' sur l'item correspondant à cette clé par :dico(clé) donc dico(Tablo(i, 2))
on donne une valeur à cet item :dico(Tablo(i, 2))= CDbl(Tablo(i, 1))

si on reprend l'exemple au dessus, pour i=12 , dans le dico on aura:

Code:
 Clé      Item
599525  01/02/2013

en espérant avoir été clair.

A+
 

Discussions similaires

Réponses
14
Affichages
590

Statistiques des forums

Discussions
312 492
Messages
2 088 895
Membres
103 982
dernier inscrit
krakencolas