IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Problème algo dans une fonction


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de tamtam64
    Homme Profil pro
    stagiaire developpement vba
    Inscrit en
    Mai 2012
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : stagiaire developpement vba
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 456
    Billets dans le blog
    17
    Par défaut Problème algo dans une fonction
    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

  2. #2
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 121
    Par défaut
    Salut

    Souvent dans une structure IF, si en fin de bloque tu répètes la mêem chose, il suffit de sortir cette partie du code de ta structure.

    Ici comme ça je pense

    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
    '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
        End If
     
        '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
     
        'Asignation
        Set DicoData = MyDico
     
        'Dictionnaire
        Set MyDico = Nothing
     
    End Function
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

Discussions similaires

  1. Réponses: 3
    Dernier message: 22/07/2011, 19h42
  2. Problème algorithmique dans une fonction
    Par Nics33 dans le forum Général Java
    Réponses: 0
    Dernier message: 02/05/2011, 11h15
  3. Problème Requete dans une fonction ?
    Par Mr-Chikhi dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 13
    Dernier message: 29/04/2009, 16h48
  4. Problème ginput dans une fonction matlab
    Par matt67 dans le forum MATLAB
    Réponses: 12
    Dernier message: 05/06/2007, 15h24
  5. Réponses: 9
    Dernier message: 13/05/2005, 03h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo