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 :

vba excel : Boucle for à optimiser


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2017
    Messages : 68
    Par défaut vba excel : Boucle for à optimiser
    Bonjour,

    J'ai ce code qui semble un peu long, et pousse Excel à afficher "Ne répond pas" pendant l'exécution de la macro. Est-ce que quelqu'un a une idée sur la façon dont on peut l'optimiser?

    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
    nombre_element_ligne_3 = .Cells(3, Columns.Count).End(xlToLeft).Column
     
                                somme = 0
                                For I = 4 To nombre_element_ligne_3
                                somme = somme + .Cells(3, I).Value
                                Next I
     
                                For I = 4 To nombre_element_ligne_3
     
     
                                        For j = 4 To 99
                                        .Cells(j, I) = .Cells(j, 1) * .Cells(3, I) / somme
                                        If .Cells(j, I) > .Cells(3, I) Then
                                        .Cells(j, I).Interior.Color = RGB(255, 0, 0)
                                        End If
     
                                        Next j
     
                                        For j = 104 To 199
                                        .Cells(j, I) = .Cells(j, 1) * .Cells(3, I) / somme
                                        If .Cells(j, I) > .Cells(3, I) Then
                                        .Cells(j, I).Interior.Color = RGB(255, 0, 0)
                                        End If
                                        Next j
     
                                        For j = 204 To 299
                                        .Cells(j, I) = .Cells(j, 1) * .Cells(3, I) / somme
                                        If .Cells(j, I) > .Cells(3, I) Then
                                        .Cells(j, I).Interior.Color = RGB(255, 0, 0)
                                        End If
                                        Next j
     
                                        For j = 304 To 399
                                        .Cells(j, I) = .Cells(j, 1) * .Cells(3, I) / somme
                                        If .Cells(j, I) > .Cells(3, I) Then
                                        .Cells(j, I).Interior.Color = RGB(255, 0, 0)
                                        End If
                                        Next j
     
                                Next I
    Cordialement

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 680
    Par défaut
    Bonjour,

    Juste pour info quel est la valeur de nombre_element_ligne_3 ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                                somme = 0
                                For I = 4 To nombre_element_ligne_3
                                somme = somme + .Cells(3, I).Value
                                Next I
    Pourquoi passer par une boucle ? tu peux utiliser worksheetfunction.sum()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If .Cells(j, I) > .Cells(3, I) Then
                                        .Cells(j, I).Interior.Color = RGB(255, 0, 0)
                                        End If
    Tu pourrais faire une MFC plutôt que forcer la couleur dans une boucle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     For I = 4 To nombre_element_ligne_3
                                        For j = 4 To 99
                                        .Cells(j, I) = .Cells(j, 1) * .Cells(3, I) / somme
    Tu peux essayer d'écrire ce calcul sous forme de formule excel dans la premiere cellule puis de faire un copier coller de la formule sur toute ta plage puis un autre copier coller des valeurs, ça permet d'éviter la lourdeur de la double boucle

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2017
    Messages : 68
    Par défaut
    1) Le nombre d'élément dans la ligne peut varier selon le type de fichier (cela vient d'un fichier externe). Pour l'instant (pour le fichier que j'ai choisi) il est égal à 67.
    2) Pour la somme, tu l'écriras comment? somme = worksheetfunction.sum(Range?)?
    3) Je ne connais pas de MFC
    4) Je ne peux pas le mettre sous forme de formule excel, puisque la plage est variable.

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 680
    Par défaut
    Citation Envoyé par Vbajon Voir le message
    1) Le nombre d'élément dans la ligne peut varier selon le type de fichier (cela vient d'un fichier externe). Pour l'instant (pour le fichier que j'ai choisi) il est égal à 67.
    2) Pour la somme, tu l'écriras comment? somme = worksheetfunction.sum(Range?)?
    3) Je ne connais pas de MFC
    4) Je ne peux pas le mettre sous forme de formule excel, puisque la plage est variable.
    2)worksheetfunction.sum(Range(cells(3,4),cells(3,nombre_element_ligne_3
    )))

    3)https://silkyroad.developpez.com/Exc...onditionnelle/

    4)Tu peux, il n'y a que dans la première cellule que tu met la formule peut importe la taille de ta plage, d'après ta double boucle en D4. Ensuite tu copies sur ta plage de taille variable.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    range("D4").formula =""
    range("D4").copy
    range(cells(4,4),cells(99,nombre_element_ligne_3)).pastespecial xlformulas
    'copie colle en valeur pour enlever les formules
    'recommence la même chose pour tes autres boucles
    idem pour tes autres boucles

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2017
    Messages : 68
    Par défaut
    Citation Envoyé par halaster08 Voir le message

    4)Tu peux, il n'y a que dans la première cellule que tu met la formule peut importe la taille de ta plage, d'après ta double boucle en D4. Ensuite tu copies sur ta plage de taille variable.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    range("D4").formula =""
    range("D4").copy
    range(cells(4,4),cells(99,nombre_element_ligne_3)).pastespecial xlformulas
    'copie colle en valeur pour enlever les formules
    'recommence la même chose pour tes autres boucles
    idem pour tes autres boucles
    Ton idée est très bonne. Mais je reste quand même buté à un obstacle : la formule sera "=A4*D3/SOMME(D3:BR3)" dans la cellule D4. Mais D3:BR3 est figé, il n'y a pas moyen de considérer le nombre_element_ligne_3 si le nombre d'éléments vénait à changer. Y a-t-il moyen de remédier à cela?

  6. #6
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 680
    Par défaut
    Citation Envoyé par Vbajon Voir le message
    Ton idée est très bonne. Mais je reste quand même buté à un obstacle : la formule sera "=A4*D3/SOMME(D3:BR3)" dans la cellule D4. Mais D3:BR3 est figé, il n'y a pas moyen de considérer le nombre_element_ligne_3 si le nombre d'éléments vénait à changer. Y a-t-il moyen de remédier à cela?
    Attention a ne pas oublier les dollar dans ta formule d'après ton code il me semble que c'est $A4*D$3

    Pas besoin d'utiliser SOMME(D3:BR3) puisque tu calcule en vba le résultat de la somme autant le réutiliser ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    somme =worksheetfunction.sum(Range(cells(3,4),cells(3,nombre_element_ligne_3)))
    range("D4").formula ="$A4*D$3/" & somme
    '...
    edit: Merci Pijaku pour l'amélioration non négligeable, je n'y avais pas pensé, j'ai tendance à copier en vba ce que je ferais en Excel.

  7. #7
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par halaster08 Voir le message
    4)Tu peux, il n'y a que dans la première cellule que tu met la formule peut importe la taille de ta plage, d'après ta double boucle en D4. Ensuite tu copies sur ta plage de taille variable.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    range("D4").formula =""
    range("D4").copy
    range(cells(4,4),cells(99,nombre_element_ligne_3)).pastespecial xlformulas
    Salut,

    Juste pour info...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub Demo()
       Range("D4").Formula = "=C4"
       Range("D4").Copy
       Range(Cells(4, 4), Cells(4, 10)).PasteSpecial xlFormulas
    End Sub
    Peut s'exprimer plus simplement ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub Demo2()
       Range(Cells(4, 4), Cells(4, 10)).Formula = "=C4"
    End Sub

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2016] vba excel boucle
    Par polysntc dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/04/2018, 10h24
  2. [XL-2010] VBA Excel / Boucle For et If multiples
    Par franckm38 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 30/03/2016, 10h42
  3. [VBA EXCEL] - Boucles et UserForm
    Par ancel17 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 20/10/2008, 18h35
  4. [vba excel] boucle et controle
    Par CIBOOX dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 23/07/2007, 09h13
  5. VBA EXCEL : boucle, recherche ligne
    Par sebi78 dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 03/04/2007, 13h02

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