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 :

Optimiser le codage par les boucles


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 5
    Par défaut Optimiser le codage par les boucles
    Bonjour, étant débutant en VBA, j'ai un peu de mal à optimiser mon code.
    Je dois réaliser le calcul de plusieurs indicateurs, à différentes dates. Afin de ne pas avoir à réutiliser pour chaque indicateurs le même code, je cherche à transformer le code suivant en une ou plusieurs boucles :

    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
    66
    67
    68
    69
    70
    71
     
    T1 = "01/01/2015"
    T2 = "01/04/2015"
    T3 = "01/07/2015"
    T4 = "01/10/2015"
    Jan = "01/01/2016"
    Fev = "01/02/2016"
    Mar = "01/03/2016"
    Avr = "01/04/2016"
    Mai = "01/05/2016"
    Juin = "01/06/2016"
    Jui = "01/07/2016"
    Aou = "01/08/2016"
    Sep = "01/09/2016"
    Oct = "01/10/2016"
    Nov = "01/11/2016"
    Dec = "01/12/2016"
    nAn = "01/01/2017"
        If (Sheets("feuil1").Cells(2, 8) < T1) _
            Then Sheets("feuil2").Cells(8, 8) = numCA / denumC
     
        If (Sheets("feuil1").Cells(2, 8) >= T1 And Sheets("feuil1").Cells(2, 8) < T2) _
            Then Sheets("feuil2").Cells(8, 9) = numCA / denumC
     
        If (Sheets("feuil1").Cells(2, 8) >= T2 And Sheets("feuil1").Cells(2, 8) < T3) _
            Then Sheets("feuil2").Cells(8, 10) = numCA / denumC
     
        If (Sheets("feuil1").Cells(2, 8) >= T3 And Sheets("feuil1").Cells(2, 8) <= T4) _
            Then Sheets("feuil2").Cells(8, 11) = numCA / denumC
     
        If (Sheets("feuil1").Cells(2, 8) >= T4 And Sheets("feuil1").Cells(2, 8) < Jan) _
            Then Sheets("feuil2").Cells(8, 12) = numCA / denumC
     
        If (Sheets("feuil1").Cells(2, 8) >= Jan And Sheets("feuil1").Cells(2, 8) < Fev) _
            Then Sheets("feuil2").Cells(8, 13) = numCA / denumC
     
        If (Sheets("feuil1").Cells(2, 8) >= Fev And Sheets("feuil1").Cells(2, 8) < Mar) _
            Then Sheets("feuil2").Cells(8, 14) = numCA / denumC
     
        If (Sheets("feuil1").Cells(2, 8) >= Mar And Sheets("feuil1").Cells(2, 8) < Avr) _
            Then Sheets("feuil2").Cells(8, 15) = numCA / denumC
     
        If (Sheets("feuil1").Cells(2, 8) >= Avr And Sheets("feuil1").Cells(2, 8) < Mai) _
            Then Sheets("feuil2").Cells(8, 16) = numCA / denumC
     
        If (Sheets("feuil1").Cells(2, 8) >= Mai And Sheets("feuil1").Cells(2, 8) < Juin) _
            Then Sheets("feuil2").Cells(8, 17) = numCA / denumC
     
        If (Sheets("feuil1").Cells(2, 8) >= Juin And Sheets("feuil1").Cells(2, 8) < Jui) _
            Then Sheets("feuil2").Cells(8, 18) = numCA / denumC
     
        If (Sheets("feuil1").Cells(2, 8) >= Jui And Sheets("feuil1").Cells(2, 8) < Aou) _
            Then Sheets("feuil2").Cells(8, 19) = numCA / denumC
     
        If (Sheets("feuil1").Cells(2, 8) >= Aou And Sheets("feuil1").Cells(2, 8) < Sep) _
            Then Sheets("feuil2").Cells(8, 20) = numCA / denumC
     
        If (Sheets("feuil1").Cells(2, 8) >= Sep And Sheets("feuil1").Cells(2, 8) < Oct) _
            Then Sheets("feuil2").Cells(8, 21) = numCA / denumC
     
        If (Sheets("feuil1").Cells(2, 8) >= Oct And Sheets("feuil1").Cells(2, 8) < Nov) _
            Then Sheets("feuil2").Cells(8, 22) = numCA / denumC
     
        If (Sheets("feuil1").Cells(2, 8) >= Nov And Sheets("feuil1").Cells(2, 8) < Dec) _
            Then Sheets("feuil2").Cells(8, 23) = numCA / denumC
     
        If (Sheets("feuil1").Cells(2, 8) >= Dec And Sheets("feuil1").Cells(2, 8) < nAn) _
            Then Sheets("feuil2").Cells(8, 24) = numCA / denumC
     
        If Sheets("feuil1").Cells(2, 8) >= nAn _
            Then Sheets("feuil2").Cells(8, 25) = numCA / denumC
    J'espère que mes explication ne sont pas trop vague..
    Merci d'avance pour vos réponses !

  2. #2
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 72
    Par défaut
    Bonjour,

    J'ai deux solution à te proposer, la première est d'utiliser Elseif :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    If ..... then
           'action
    Elseif ..... then
           'action2
    Elseif ... then
    .
    .
    .
    Else
           'action si autres conditions non respectés
    End if
    Ton code sortira de la vérification dès qu'il trouvera une condition respectée, ce qui éviterait les AND de chaque ligne déjà.

    Sinon tu peux utiliser les Select Case mais j'ai cru lire de mémoire sur le net qu'il est un chouilla moins opti question temps d'exécution que les elseif mais cela fonctionne avec une structure assez similaire je te laisse chercher sur le net.

    Après pour le principe de boucle j'espère que c'était bien ça.
    Sinon pour bouclier sur les Cellules :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 1 to 42
           Cells(i,8) = 'action
    Next i
    Ceci permet de parcourir une colonne de la ligne 1 à 42.

    De plus je te conseille d'utiliser les With pour alléger ton code. Dans ton cas par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With Sheets("feuil1").Cells(2, 8)
           If .value < T1 then
    '... etc
    End With
    Voici donc un Code que je te propose:

    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 test()
        Dim T1 As Date, T2 As Date, T3 As Date, T4 As Date, Jan As Date, _
            Fev As Date, Mar As Date
            'je te laisse compléter
        Dim fract As Double
     
        T1 = DateSerial(2015, 1, 1)
        T2 = DateSerial(2015, 4, 1)
        T3 = DateSerial(2015, 7, 1)
        T4 = DateSerial(2015, 10, 1)
        Jan = DateSerial(2016, 1, 1)
        Fev = DateSerial(2016, 2, 1)
        Mar = DateSerial(2016, 3, 1)
        'DateSerial renvoie une variable de type Date
     
        fract = numCA / denumC
        Dim i As Long
        i = 0
     
        With Sheets("feuil2")
        For i = 2 To 42
            Select Case Sheets("feuil1").Cells(i, 8)
            Case Is < T1
                .Cells(i + 2, 8) = fract
            Case Is < T2
                .Cells(i + 2, 9) = fract
            Case Is < T3
                .Cells(i + 2, 10) = fract
            Case Is < T4
                .Cells(i + 2, 11) = fract
            Case Is < Jan
                .Cells(i + 2, 12) = fract
            Case Is < Fev
                .Cells(i + 2, 13) = fract
            Case Is < Mar
                .Cells(i + 2, 14) = fract
            End Select
        Next i
        End With
    End Sub
    Si je suis dans le faux ou que j'ai mal compris ta question, je m'en excuse d'avance, en espérant t'avoir aidé.
    Cela reste long mais c'est plus lisible. Après il y a peut-être solution, je laisse les autres te répondre.

    DeathZarakai.

  3. #3
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Sans en savoir plus, difficile d'apporter une aide sérieuse mais déjà au lieu d'utiliser des variables simples, il serait plus judicieux de se diriger vers des variables tableaux.
    Ainsi par exemple, au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    T1 = "01/01/2015"
    T2 = "01/04/2015"
    T3 = "01/07/2015"
    T4 = "01/10/2015"
    il serait plus simple d'écrire par exemple pour l'année 2016
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub CalculTrimestre()
     Dim t(1 To 4), Periode As Byte
     For Periode = 1 To 4
      t(Periode) = DateSerial(2016, ((Periode - 1) * 3) + 1, 1)
     Next
     MsgBox t(2) ' Donnera 1/4/2016
    End Sub
    On peut bien entendu placer l'année dans une variable et également sans doute ne pas passer par une variable tableau mais directement par l'écriture dans une cellule en utilisant la même formule

    A lire Utiliser les variables tableaux en VBA Excel
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 5
    Par défaut
    Merci pour vos réponses rapides, elles m'ont permi de résoudre quelques problèmes.
    J'aurais une autre interrogation à vous faire part : A partir d'une base de données de plusieurs années, je dois remplir un tableau de bord d'indicateurs mensuels. Comment faire pour remplir toutes les colonnes de mon tableau de bord, en respectant la contraintes de date ?
    Veuillez m'excuser pour mes informations pas très claires.. Je posterai dans la journée, en pièce-jointe, mes feuilles excel pour que cela soit davantage concret pour vous.
    Merci d'avance pour vos réponses précieuses.

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    J'aurais une autre interrogation à vous faire part : A partir d'une base de données de plusieurs années, je dois remplir un tableau de bord d'indicateurs mensuels.
    Il faudrait plus d'explications
    Comment faire pour remplir toutes les colonnes de mon tableau de bord, en respectant la contraintes de date ?
    Il y a tellement de manière de procéder qu'il faudrait mieux expliquer
    1. Les données en ta possession
    2. Comme celles-ci sont elles organisées
    3. Ce que tu attends comme résultat en matière d'analyse

    Je posterai dans la journée, en pièce-jointe, mes feuilles excel pour que cela soit davantage concret pour vous.
    C'est parfaitement inutile et pas toujours très appréciés. Une bonne explication écrite et documentée éventuellement par une image illustrant tes propos est largement suffisante pour obtenir une réponse.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Membre Expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 871
    Billets dans le blog
    1
    Par défaut
    Bonjour à tous,

    Je suis tout à fait d'accord avec "DeathZarakai" et "Philippe Tulliez" je vous salue au passage

    Citation Envoyé par toune4 Voir le message
    ... Comment faire pour remplir toutes les colonnes de mon tableau de bord, en respectant la contraintes de date ?
    ...
    Le mieux comme l'a dit Philippe c'est de passer par une variable de type tableau

    Mais comme le dit Philippe
    Une bonne explication écrite et documentée éventuellement par une image illustrant tes propos est largement suffisante pour obtenir une réponse.
    C'est tellement vrai que je

    A+

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 5
    Par défaut
    Bonsoir,
    Vraiment désolé pour mes explications foireuses..

    Ma base de donnée (stockée dans 1 feuille) contient des données sur 3 ans.
    Mon tableau de bord contient le calcul de 15 indicateurs à réaliser sur plusieurs périodes (voir les périodes dans le haut de la discussion).

    Chaque colonne du tableau de bord représente une période différentes.
    Chaque colonne de ma base de donnée représente des variables différentes, nécessaires aux calculs des indicateurs.

    Toutes les macros concernant le calcul des indicateurs marchent.
    Je cherche à me servir de ma variable date pour répartir les éléments de ma bases dans les colonnes correspondantes à la bonne période.

    J'espère avoir été plus clair, et vous remercie d'avance pour votre patience !

Discussions similaires

  1. Récupérer des valeurs d'un objet sans passer par les boucles
    Par soucou dans le forum Calcul scientifique
    Réponses: 4
    Dernier message: 02/03/2013, 16h05
  2. [MySQL] Optimisation du code sur les boucles
    Par izguit dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 07/08/2009, 15h05
  3. [Optimisation?] Déclaration de variable dans les boucles
    Par romaintaz dans le forum Langage
    Réponses: 5
    Dernier message: 11/08/2006, 16h08
  4. [SQL - procStock ] optimisation du code (éviter les boucles)
    Par luimême dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 06/10/2005, 17h22
  5. Débogage corrompu par les optimisations du compilateur
    Par petitcoucou31 dans le forum EDI
    Réponses: 6
    Dernier message: 17/12/2003, 00h30

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