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 à l'essai
    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
    Points : 13
    Points
    13
    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
    Responsable
    Office & Excel


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 905
    Points
    55 905
    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)")

  3. #3
    Responsable
    Office & Excel


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 905
    Points
    55 905
    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

  4. #4
    Membre à l'essai
    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
    Points : 13
    Points
    13
    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