Utiliser une clé primaire dans VBA pour donner une instruction
Bonjour,
J'ai une base de données contenant les valeurs de revente de différentes actions, ces dernières étant différenciées par leur code ISIN. J'aimerais ne conserver que la ligne ayant la date la plus récente par code ISIN (donc que l'ISIN soit une clé pour donner l'instruction).
J'ai dans un onglet "Feuil1" tous mes ISIN. Dans mon onglet "Base source", j'ai toutes les valeurs historiques (l'ISIN apparaît donc plusieurs fois).
Je vous joins un fichier simplifié pour que vous ayez l'idée :
Voilà le code que j'ai commencé à écrire, mais je ne sais pas comment remplir l'intérieur de la boucle For Each (pour lui dire de copier la ligne contenant la date la plus récente par code ISIN et la coller dans l'onglet "Base 2").
Sub BDD()
'ISIN prend toutes les valeurs de la colonne A :
ISIN = Sheets("Feuil1").Cells(i, 1).Value
'Nombre de lignes non vides de la colonne A (car peut évoluer) :
nbLig = Application.WorksheetFunction.CountA(Feuil1.Range("$A:$A"))
For i = 2 To nbLig
For Each ISIN In Sheets("Base source")
Next ISIN
Next i
End SubJ'ai trié la base par ordre alphabétique d'ISIN puis par date récente, et j'aimerais ne prendre que la première ligne rencontrée par code ISIN. Est-ce faisable ?
Merci beaucoup par avance pour vos réponses
Bonjour Alinoush et
Une petite présentation ICI serait la bienvenue
Si vous ne l'avez pas encore fait, je vous invite à lire la charte du forum [A LIRE AVANT DE POSTER]
qui vous aidera dans vos demandes et réponses sur ce forum.
Concernant votre demande, vous souhaitez supprimer toutes les autre lignes du même ISIN,
ou juste retourner la dernière valeur connue ?
Merci de votre participation
Cordialement
bonjour,
Sub BDD()
Dim Vide()
'ISIN prend toutes les valeurs de la colonne A :
Set dict = CreateObject("scripting.dictionary") 'dictionary comme cahier de brouillon
dict.CompareMode = vbTextCompare 'ne pas sensible aux majuscules et minuscules
isin = Sheets("Base Source").Cells(1, 1).CurrentRegion.Resize(, 6).Value2 'value2 !!! (il y a des dates et des currency !!!!
For i = 2 To UBound(isin) 'boucle de la 2ieme ligne vers derniere ligne
If Not dict.exists(isin(i, 2)) Then 'est ce isin déjà dans le dictionary
dict(isin(i, 2)) = Application.Index(isin, i, 0) 'non = ajouter toute la ligne
Else
it = dict(isin(i, 2)) 'la ligne precedente de cet isin
If it(2) < isin(i, 3) Then dict(isin(i, 2)) = Application.Index(isin, i, 0) 'si la date precedente est inférieur, prenez cette ligne
End If
Next
i = dict.Count 'nombre de isin different
If i = 1 Then 'bug s'il n'y a qu'un record dans la dictionary
ReDim Vide(1 To UBound(isin, 2))
dict.Add dict.Count, Vide
End If
lignes = Evaluate("ROW(1:" & i & ")") 'array ordre croissant 1,2,3, ...,i
colonnes = Evaluate("{2,1,3,4,5,6}") 'ordre des colonnes PASTE
With Sheets("feuil1").Range("A1").Resize(i, UBound(isin, 2))
.Value = Application.Index(dict.items, lignes, colonnes) 'ajouter le contenu des items du dictionary
.Sort .Range("A1"), Header:=xlNo 'sort on isin
End With
End Sub