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 :

Double boucle en VBA


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2014
    Messages : 7
    Par défaut Double boucle en VBA
    Bonjour,

    dans la macro "Check_Package_Argentine", je souhaite stocker dans une collection d'objets, les cashflows avec leur montant
    et leur numero de package, dont les trois dernières lettres finissent par AVA.
    la premiere partie fonctionne j'ai teste.
    Dans la 2eme partie, je souhaite ajouter les intérets des cashflows qui ont le meme packagenumber et les stocker
    dans une variable qui serait les interets du package.

    C'est la ou cela coince. avez vous des idees pour ecrire cela?

    Merci

    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
    Sub Check_Package_Argentine()
     
    Dim cf As CashFlow
    Dim sommeInterets, packageNumber As Double
    Dim i, j As Integer
    Set listeCF = New Collection
     
    sommeInterets = 0
    Application.ScreenUpdating = False
     
    'passage en mode de calcul manuel
    Application.Calculation = xlManual
     
    Sheets("7-Argentine-OPU").Activate
     
    For i = 1 To 50
     
            If Right(Cells(i, 9).Value, 3) = "AVA" Then
     
                Set cf = New CashFlow
                cf.packageNumber = Range("F" & i).Value
                cf.montant = Range("Y" & i).Value
                listeCF.Add cf
     
            End If
     
    Next i
     
    For i = 1 To listeCF.Count
     
        For j = i + 1 To listeCF.Count
     
        montant(i) = cf(i).montant
        packageNumber(i) = cf(i).packageNumber
        montant(j) = cf(j).montant
        packageNumber(j) = cf(j).packageNumber
     
        sommeInterets = 0
        If (packageNumber(i) = packageNumber(j) And cf(i).montant <> cf(j).montant) Then
        sommeInterets = sommeInterets + cf(i).montant + cf(j).montant
        MsgBox "les intérêts du package argentine " & packageNumber(i) & " sont de " & sommeInterets
        End If
     
        Next j
     
    Next i
     
    End Sub

  2. #2
    Invité
    Invité(e)
    Par défaut Bonjour,
    je comprends pas packageNumber est un double pas un tableau pas une collection.
    dans ta double boucle tu utilise cf(i)! pas ta liste?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 1 To listeCF.Count
        For j = i + 1 To listeCF.Count 
         packageNumber(i) = cf(i).packageNumber ' listeCF(i).packageNumber = listeCF(J).packageNumber
    qq chose dans ce genre?

  3. #3
    Membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2014
    Messages : 7
    Par défaut
    C'est bon je viens de corriger...par contre j'aimerais stocker les sommesinterets pour tous les packages.
    sommesinterets.package number est ce possible de faire cela?

    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
    Sub Check_Package_Argentine()
     
    Dim cf As CashFlow
    Dim sommeInterets, packageNumber As Double
    Dim i, j As Integer
    Set listeCF = New Collection
     
    sommeInterets = 0
    Application.ScreenUpdating = False
     
    'passage en mode de calcul manuel
    Application.Calculation = xlManual
     
    Sheets("7-Argentine-OPU").Activate
     
    For i = 1 To 50
     
            If Right(Cells(i, 9).Value, 3) = "AVA" Then
     
                Set cf = New CashFlow
                cf.packageNumber = Range("F" & i).Value
                cf.montant = Range("Y" & i).Value
                listeCF.Add cf
     
            End If
     
    Next i
     
    For i = 1 To listeCF.Count
     
        For j = i + 1 To listeCF.Count
     
        sommeInterets = 0
        If (listeCF(i).packageNumber = listeCF(j).packageNumber) Then
        sommeInterets = sommeInterets + listeCF(i).montant + listeCF(j).montant
        MsgBox "les intérêts du package argentine " & listeCF(i).packageNumber & " sont de " & sommeInterets
        End If
     
        Next j
     
    Next i
     
    End Sub
    Voici mon code finalisé et cela fonctionne bien!

    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
    Sub Check_Package_Argentine()
     
    Dim cf As CashFlow
    Dim sommeInterets, packageNumber As Double
    Dim i, j, k As Integer
    Set listeCF = New Collection
     
    sommeInterets = 0
    Application.ScreenUpdating = False
     
    'passage en mode de calcul manuel
    Application.Calculation = xlManual
     
    Sheets("7-Argentine-OPU").Activate
     
    For i = 1 To 50
     
            If Right(Cells(i, 9).Value, 3) = "AVA" Then
     
                Set cf = New CashFlow
                cf.packageNumber = Range("F" & i).Value
                cf.montant = Range("Y" & i).Value
                listeCF.Add cf
     
            End If
     
    Next i
     
    For i = 1 To listeCF.Count
     
        For j = i + 1 To listeCF.Count
     
        sommeInterets = 0
        If (listeCF(i).packageNumber = listeCF(j).packageNumber) Then
        sommeInterets = sommeInterets + listeCF(i).montant + listeCF(j).montant
        MsgBox "les intérêts du package argentine " & listeCF(i).packageNumber & " sont de " & sommeInterets
        End If
     
        k = 4
        While Sheets("1-OperationsDuJour").Range("I" & k).Value <> listeCF(i).packageNumber
            k = k + 1
        Wend
     
        If Sheets("1-OperationsDuJour").Range("I" & k).Value = listeCF(i).packageNumber Then
                If Abs((Sheets("1-OperationsDuJour").Range("U" & k).Value) + sommeInterets) < 10 Then
                MsgBox "l'opération argentine " & listeCF(i).packageNumber & " correspond bien aux opérations avances"
                Else
                MsgBox "il n'y a pas de correspondance entre l'avance argentine et le forward associé au numéro de package " & listeCF(i).packageNumber & ", vérifiez manuellement!"
                End If
        End If
     
        Next j
     
    Next i
     
    End Sub

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut une version plus optimisée
    Bonjour
    je te propose une version un peu plus optimisée bien que je n'ai pas testé je pense avoir restitué le travail souhaité

    supprime toutes tes lignes que j'ai mis en comentaire et teste le :

    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
    Sub Check_Package_Argentine()
        Dim tablo50
        'Dim cf As CashFlow
        Dim sommeInterets
        'dim packageNumber As Double
        Dim i, j As Integer
        'Set listeCF = New Collection
        sommeInterets = 0
        Application.ScreenUpdating = False
        'passage en mode de calcul manuel
        Application.Calculation = xlManual
        Sheets("7-Argentine-OPU").Activate
        ReDim tablo50(50, 2)    '50 lignes et 2 colonnes
        For i = 1 To 50
            If Right(Cells(i, 9).Value, 3) = "AVA" Then
                'Set cf = New CashFlow
                ' cf.packageNumber = Range("F" & i).Value
                tablo50(i, 0) = Range("F" & i).Value
                'cf.montant = Range("Y" & i).Value
                'listeCF.Add cf
                tablo50(i, 1) = Range("Y" & i).Value
            End If
        Next i
        For i = 1 To UBound(tablo50)
            For j = i + 1 To UBound(tablo50)
                    'montant(i) = cf(i).montant
                ' packageNumber(i) = cf(i).packageNumber
                'montant(j) = cf(j).montant
                'packageNumber(j) = cf(j).packageNumber
                sommeInterets = 0
                If tablo50(i, 0) = tablo50(i + 1, 0) And tablo50(i, 1) <> tablo50(i + 1, 1) Then
                    'If (packageNumber(i) = packageNumber(j) And cf(i).montant <> cf(j).montant) Then
                    'sommeInterets = sommeInterets + cf(i).montant + cf(j).montant
                    sommeInterets = sommeInterets + tablo50(i, 1) + tablo50(i + 1, 1)
                    'MsgBox "les intérêts du package argentine " & packageNumber(i) & " sont de " & sommeInterets
                    MsgBox "les intérêts du package argentine " & tablo50(i, 0) & " sont de " & sommeInterets
                End If
           Next j
        Next i
    End Sub
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  5. #5
    Membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2014
    Messages : 7
    Par défaut ma version finale à optimiser
    Je te joins ma version finale; dis moi ce que je peux optimiser au niveau du code.

    Merci

    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
    64
    Sub Check_Package_Argentine()
     
    Dim cf As CashFlow
    Dim sommeInterets, packageNumber, verif As Double
    Dim i, j, k As Integer
    Set listeCF = New Collection
     
    sommeInterets = 0
    verif = 0
    Application.ScreenUpdating = False
     
    'passage en mode de calcul manuel
    Application.Calculation = xlManual
     
    Sheets("7-Argentine-OPU").Activate
     
    i = 4
     
    While Cells(i, 9).Value <> ""
     
            If Right(Cells(i, 9).Value, 3) = "AVA" Then
     
                Set cf = New CashFlow
                cf.packageNumber = Range("F" & i).Value
                cf.montant = Range("Y" & i).Value
                listeCF.Add cf
     
            End If
     
            i = i + 1
     
    Wend
     
    For i = 1 To listeCF.Count
     
        For j = i + 1 To listeCF.Count
     
            If (listeCF(i).packageNumber = listeCF(j).packageNumber) Then
     
                sommeInterets = 0
                sommeInterets = sommeInterets + listeCF(i).montant + listeCF(j).montant
                MsgBox "les intérêts du package argentine " & listeCF(i).packageNumber & " sont de " & sommeInterets
     
                k = 4
                While Sheets("1-OperationsDuJour").Range("I" & k).Value <> listeCF(i).packageNumber
                    k = k + 1
                Wend
     
                If Sheets("1-OperationsDuJour").Range("I" & k).Value = listeCF(i).packageNumber Then
                    verif = (Sheets("1-OperationsDuJour").Range("U" & k).Value) + sommeInterets
                    If Abs(verif) < 10 Then
                    MsgBox "L'opération argentine du package " & listeCF(i).packageNumber & " correspond bien aux opérations avances, la somme du forward et des intérêts de l'opération est égale à " & verif & "!"
                    Else
                    MsgBox "Il n'y a pas de correspondance entre l'avance argentine et le forward associé au numéro de package " & listeCF(i).packageNumber & ", la somme du forward et des intérêts de l'opération est égale à " & verif & "!, vérifiez manuellement!"
                    End If
                End If
     
            End If
     
        Next j
     
    Next i
     
    End Sub

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    Bon
    je n'ai pas tout vérifié mais ca doit être un truc comme ca
    cela dit je n'ai pas ton sheets sous les yeux donc je ne peut pas aller plus loin
    bien que je sui presque certain que la méthode peut être encore plus optimisée vu le nombre potentiels de lignes


    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
    64
    65
    Sub Check_Package_Argentine()
        Dim tablo50
        Dim cf As CashFlow
        Dim sommeInterets, packageNumber, verif As Double
        Dim i, j, k As Integer
        Set listeCF = New Collection
     
        sommeInterets = 0
        verif = 0
        Application.ScreenUpdating = False
     
        'passage en mode de calcul manuel
        Application.Calculation = xlManual
     
        Sheets("7-Argentine-OPU").Activate
     
        i = 4
     
        While Cells(i, 9).Value <> ""    ' alors ici tu boucle tans qu'il y a queleque chose dans la cells i,9
            ' tu pourrais faire comme le permier determiner la plage ca aurait été plus rapide
         ReDim Preserve tablo50(0 To i, 0 To 2)
            If Right(Cells(i, 9).Value, 3) = "AVA" Then
                'Set cf = New CashFlow
                ' cf.packageNumber = Range("F" & i).Value
                tablo50(i, 0) = Range("F" & i).Value
                'cf.montant = Range("Y" & i).Value
                'listeCF.Add cf
                tablo50(i, 1) = Range("Y" & i).Value
            End If
     
            i = i + 1
     
        Wend
     
        For i = 1 To UBound(tablo50)
     
            For j = i + 1 To UBound(tablo50)
     
                If tablo50(i, 1) = tablo50(j, 1) Then
     
                    sommeInterets = 0
                    sommeInterets = sommeInterets + tablo50(i, 1) + tablo50(j, 1)
                    MsgBox "les intérêts du package argentine " & tablo50(i, 1) & " sont de " & sommeInterets
     
                    k = 4
                    While Sheets("1-OperationsDuJour").Range("I" & k).Value <> tablo50(i, 1)
                        k = k + 1
                    Wend
     
                    If Sheets("1-OperationsDuJour").Range("I" & k).Value = tablo50(i, 0) Then
                        verif = (Sheets("1-OperationsDuJour").Range("U" & k).Value) + sommeInterets
                        If Abs(verif) < 10 Then
                            MsgBox "L'opération argentine du package " & tablo50(i, 0) & " correspond bien aux opérations avances, la somme du forward et des intérêts de l'opération est égale à " & verif & "!"
                        Else
                            MsgBox "Il n'y a pas de correspondance entre l'avance argentine et le forward associé au numéro de package " & tablo50(i, 0) & ", la somme du forward et des intérêts de l'opération est égale à " & verif & "!, vérifiez manuellement!"
                        End If
                    End If
     
                End If
     
            Next j
     
        Next i
     
    End Sub
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  7. #7
    Membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2014
    Messages : 7
    Par défaut
    Bonjour,
    tablo50 tu le declares comme quoi?

    Par ailleurs pour redimensionner ton tableau, ne faudrait il pas
    remplacer ReDim Preserve tablo50(0 To i, 0 To 2) par
    ReDim Preserve tablo50(0 To i -3, 0 To 2), comme on commence par i = 4

    Je te remercie



    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
    64
    65
    Sub Check_Package_Argentine()
        Dim tablo50
        Dim cf As CashFlow
        Dim sommeInterets, packageNumber, verif As Double
        Dim i, j, k As Integer
        Set listeCF = New Collection
     
        sommeInterets = 0
        verif = 0
        Application.ScreenUpdating = False
     
        'passage en mode de calcul manuel
        Application.Calculation = xlManual
     
        Sheets("7-Argentine-OPU").Activate
     
        i = 4
     
        While Cells(i, 9).Value <> ""    ' alors ici tu boucle tans qu'il y a queleque chose dans la cells i,9
            ' tu pourrais faire comme le permier determiner la plage ca aurait été plus rapide
         ReDim Preserve tablo50(0 To i, 0 To 2)
            If Right(Cells(i, 9).Value, 3) = "AVA" Then
                'Set cf = New CashFlow
                ' cf.packageNumber = Range("F" & i).Value
                tablo50(i, 0) = Range("F" & i).Value
                'cf.montant = Range("Y" & i).Value
                'listeCF.Add cf
                tablo50(i, 1) = Range("Y" & i).Value
            End If
     
            i = i + 1
     
        Wend
     
        For i = 1 To UBound(tablo50)
     
            For j = i + 1 To UBound(tablo50)
     
                If tablo50(i, 1) = tablo50(j, 1) Then
     
                    sommeInterets = 0
                    sommeInterets = sommeInterets + tablo50(i, 1) + tablo50(j, 1)
                    MsgBox "les intérêts du package argentine " & tablo50(i, 1) & " sont de " & sommeInterets
     
                    k = 4
                    While Sheets("1-OperationsDuJour").Range("I" & k).Value <> tablo50(i, 1)
                        k = k + 1
                    Wend
     
                    If Sheets("1-OperationsDuJour").Range("I" & k).Value = tablo50(i, 0) Then
                        verif = (Sheets("1-OperationsDuJour").Range("U" & k).Value) + sommeInterets
                        If Abs(verif) < 10 Then
                            MsgBox "L'opération argentine du package " & tablo50(i, 0) & " correspond bien aux opérations avances, la somme du forward et des intérêts de l'opération est égale à " & verif & "!"
                        Else
                            MsgBox "Il n'y a pas de correspondance entre l'avance argentine et le forward associé au numéro de package " & tablo50(i, 0) & ", la somme du forward et des intérêts de l'opération est égale à " & verif & "!, vérifiez manuellement!"
                        End If
                    End If
     
                End If
     
            Next j
     
        Next i
     
    End Sub
    [/QUOTE]

Discussions similaires

  1. [XL-2007] Double boucle VBA
    Par pascal4782 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 07/06/2011, 10h00
  2. Boucle Combinaison VBA
    Par Surfeur dans le forum Macros et VBA Excel
    Réponses: 31
    Dernier message: 23/05/2008, 16h08
  3. [batch] double boucle for
    Par schlopa dans le forum Windows
    Réponses: 12
    Dernier message: 11/02/2008, 19h54
  4. Sortir d'une double boucle FOR-END
    Par Invité dans le forum MATLAB
    Réponses: 4
    Dernier message: 05/12/2007, 11h07
  5. double boucle
    Par benjisan dans le forum VBA Access
    Réponses: 2
    Dernier message: 03/10/2007, 17h07

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