Bonjour,

Je souhaiterais algorithmiquement faire quelque chose ( que j'ai réussi mais je pense qu'il y a mieux).
En gros je crais un dictionnaire qui parcours une feuille et qui recupere pas mal d'éléments, pour pouvoir en disposer à plusieurs reprise dans mon projet
Seulement j'ai mis un parametre optionel de type boolean qui si il est vrai alors il va juste récuperer les titres des éléments qui nous interesse ( c'est pour éviter de tout prendre si on en a pas besoin)

j'ai donc mis une condition if limit .... else.... mais répeter le code , je trouve ca nul et je me disais peut etre qu'il y aurait une autre solution a savoir que la seule diference c'est
Code : Sélectionner tout - Visualiser dans une fenêtre à part
If Not MyRangeName.Find(MyRange.Value) Is Nothing Then
seul difference entre les deux bloques.
voici le code a titre d'exemple
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
    'Fonction qui récupére les données bonne date et bon périmetre
Private Function DicoData(ByVal xlsheet As Worksheet, Optional limit As Boolean) As Dictionary
 
        'Variables
    Dim MyRange As Range, AllRange As Range
    Dim MyDico As New Dictionary
    Dim MyKey As String, MyObject As DataPnL
    Dim MyDateVaR As Date, MyDateSVaR As Date
    Dim MyRangeName As Range
 
        'Affichage
    Application.ScreenUpdating = False
 
 
 
            'Determiner le range à parcourir
    Set AllRange = xlsheet.Range(xlsheet.Range("C10"), xlsheet.Range("C10").End(xlDown))
 
        'Limite pour le check histo
    If limit Then
 
            'Liste de Perimetres de test
        With ThisWorkbook.Worksheets("HistoPnL")
            Set MyRangeName = .Range(.Range("DateHisto"), .Range("DateHisto").End(xlToRight)).Offset(-1)
        End With
 
            'Parcours de la feuille
        For Each MyRange In AllRange
                'Clef
 
            If Not MyRangeName.Find(MyRange.Value) Is Nothing Then
                MyKey = MyRange.Value & "_" & MyRange.Offset(, -1).Value
                If Not MyDico.Exists(MyKey) Then
                    Set MyObject = New DataPnL
                    MyObject.Daily = MyRange.Offset(, 5).Value * MyRange.Offset(, 4).Value / 1000000
                    MyObject.MtD = MyRange.Offset(, 6).Value * MyRange.Offset(, 4).Value / 1000000
                    MyObject.YtD = MyRange.Offset(, 7).Value * MyRange.Offset(, 4).Value / 1000000
                    MyDico.Add MyKey, MyObject
                    Debug.Print MyKey
                End If
            End If
        Next MyRange
    Else:
        For Each MyRange In AllRange
                'Clef
            MyKey = MyRange.Value & "_" & MyRange.Offset(, -1).Value
            If Not MyDico.Exists(MyKey) Then
                Set MyObject = New DataPnL
                MyObject.Daily = MyRange.Offset(, 5).Value * MyRange.Offset(, 4).Value / 1000000
                MyObject.MtD = MyRange.Offset(, 6).Value * MyRange.Offset(, 4).Value / 1000000
                MyObject.YtD = MyRange.Offset(, 7).Value * MyRange.Offset(, 4).Value / 1000000
                MyDico.Add MyKey, MyObject
                Debug.Print MyKey
            End If
        Next MyRange
    End If
        'Asignation
    Set DicoData = MyDico
 
        'Dictionnaire
    Set MyDico = Nothing
 
End Function