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 :

Boucle et division avec 2 variables. [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Ingé
    Inscrit en
    Juillet 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingé
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2011
    Messages : 20
    Par défaut Boucle et division avec 2 variables.
    Petit problème pour certains de ce forum mais je bloque, assez facile à faire par formule excel mais le but ici est de le faire à l'aide d'une macro


    L’idée, on a une colonne H de X lignes, tant que ce n’est pas égal à vide,
    Si la cellule <> de 0 :

    =>On sauvegarde le nombre dans une variable VAR, cette variable sera la somme des nombres.
    =>On incrémente un compteur C.

    Si la cellule = 0 :
    =>On passe à la ligne suivante.

    Lorsque la cellule est vide, on fait VAR divisé par C et on inscrit ce résultat dans une cellule J3.

    Voici le code (qui ne tourne pas correctement biensûr)
    L'explication de ce que je veux faire parait super simple, et il y a surement plusieurs manières de faire mais je bloque après plusieurs tentatives
    Soyez indulgent de mon code

    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
     
    Sub biloute()
     
    Dim Val As Integer
    Dim Var As Integer
    Dim C As Integer
     
    Set ws1 = Worksheets("Stat")
    Set ws2 = Worksheets("Feuil2")
    Set Plage = ws2.Range("D2:D6500")
     
    Var = 0
     
    With Plage.Select				 
     I = 1                       				
    C = 1                      				
        Do While Cells(I, 4).Value <> ""                  
     If Cells(I, 4).Value = "0" 
    I = I + 1                           
            	Else: Cells(I, 4).Value = "<>0"
                	C = C + 1                           
                	Cells(I, 4).Value = Val                         
    Var = Application.Sum(Var + Val)    
                	I = I + 1                           
            	End If
        Loop
     
        ws1.Select          
        Range("J3").Select
        Range("J3").Value = Var / C      
     
    End With
    End Sub
    D'avance merci

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Perso, j'aime bien (voir ma signature) réfléchir d'abord en Excel. Le VB pose parfois des lourdeurs d'exécution, notamment à cause des boucles.

    En considérant ta plage commençant en H2 et se terminant en H7 (H8 étant vide), tu aurais
    =SOMMEPROD((H2:H7<>0)*H2:H7)/SOMMEPROD((H2:H7<>0)*1)
    pour obtenir la moyenne des cellules différentes de 0.

    Cette formule est traduite en VBA grâce à la fenêtre d'exécution (CTRL+G) dans l'éditeur VB. Tu obtiens
    =SUMPRODUCT((H2:H7<>0)*H2:H7)/SUMPRODUCT((H2:H7<>0)*1)
    Le problème consiste donc à trouver la valeur 7 en VBA, ce qui est réalisé grâce à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("h2").End(xlDown).Row
    Tu peux donc composer l'adresse puis remplacer H2:H7 par l'adresse construite, et utiliser la fonction EVALUATE en VBA, qui permet notamment d'évaluer le résultat d'une formule.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       Dim Moyenne As Variant
      Dim Adresse As String
     
      Adresse = "h2:h" & Range("h2").End(xlDown).Row
      Moyenne = Evaluate("=SUMPRODUCT((" & Adresse & "<>0)*" & Adresse & ")/SUMPRODUCT((" & Adresse & "<>0)*1)")
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Si tu tiens vraiment à réaliser cela avec une boucle, voici un processus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      Dim Valeur As Variant
      Dim Compteur As Long
      Dim Cellule As Range
      Dim Moyenne As Variant
     
      Set Cellule = Range("h2")
      Do While Not Cellule = ""
        If Cellule.Value <> 0 Then
          Valeur = Valeur + Cellule.Value
          Compteur = Compteur + 1
        End If
        Set Cellule = Cellule(2)
      Loop
      If Compteur <> 0 Then Moyenne = Valeur / Compteur
    Un problème que tu avais dans ton code se situait au niveau du test "<>0" à la ligne 20 de ton code...

    Tu pourrais aussi avoir ce test au sein de la boucle, mais le code serait moins "logique".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      Do While Not Cellule = ""
        Valeur = Valeur + Cellule.Value
        If Cellule.Value <> 0 Then Compteur = Compteur + 1
        Set Cellule = Cellule(2)
      Loop
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  4. #4
    Membre averti
    Homme Profil pro
    Ingé
    Inscrit en
    Juillet 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingé
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2011
    Messages : 20
    Par défaut
    Alors premièrement merci pour cette réponse, que je vais tester.
    Depuis j'ai repris tout à zéro avec une boucle for et ça marche plutôt bien, voici le code :

    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
     
    Sub Generer_graphique()
     
    Dim Val, Var, C, I As Integer
     
    Set ws1 = Worksheets("Stat")
     
    For I = 2 To 2000
        If Cells(I, 4).Value <> "0" And Cells(I, 4).Value <> "" Then
            C = C + 1
            Var = Cells(I, 4).Value + Var
        ElseIf Cells(I, 4).Value = "" Then
        Exit For
        End If
    Next
     
        ws1.Select
        Range("J3").Select
        Range("J3").Value = Var / C
     
    MsgBox "Graphique généré"
     
    End Sub

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

Discussions similaires

  1. Boucle For Next avec 2 variables
    Par neninio31 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 20/07/2019, 19h46
  2. boucle sur checkbox avec nom variable
    Par LaMite dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/05/2014, 18h01
  3. Boucle en VBA avec 2 variables dont une est le numéro de feuille
    Par micapilote dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/10/2011, 23h06
  4. Boucle for avec 2 variables
    Par radzar dans le forum PL/SQL
    Réponses: 8
    Dernier message: 15/05/2009, 12h07
  5. Faire une boucle avec des variables vides ?
    Par byloute dans le forum Linux
    Réponses: 5
    Dernier message: 23/02/2006, 09h33

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