[excel] formulation d'une variable

Résolu
MattDF Messages postés 76 Statut Membre -  
MattDF Messages postés 76 Statut Membre -
Bonjour à tous,

Je commence à pouvoir bidouiller sur la macro Excel, mais les variables me posent encore problème. C'est pourquoi je souhaiterai avoir votre avis pour le cas suivant :

J'ai une formule, intégrée à une macro plus grande, que je dois répéter 25 fois, chaque fois pour une valeur différente (de 1 à 25). Voici la formule macro :

'La c'est pour comptabiliser les périodes de 1 mois
Range("Q" & Range("Q65536").End(xlUp).Row + 1).Select
Range("Q2", ActiveCell.Offset(-3, 0)).Select
For Each Cell In Selection
If Cell.Value = 1 And IsEmpty(Cell.Offset(0, 1)) And IsEmpty(Cell.Offset(0, 3)) And IsEmpty(Cell.Offset(0, 4)) Then
total1m = total1m + 1
End If
Next
Range("T" & Range("T65536").End(xlUp).Row + 1).Select
Range("T2", ActiveCell.Offset(-1, 0)).Select
For Each Cell In Selection
If Cell.Value = 1 And IsEmpty(Cell.Offset(0, 1)) Then
total1m = total1m + 1
End If
Next
If total1m > 0 Then
Totalt = Totalt + 1
End If


Il me faut répéter la formule en changeant uniquement les chiffres que j'ai mis en gras (il apparait 7 fois dans ce petit bout de macro), mais j'aimerais ne pas avoir à recopier cette formule 25 fois, d'où le besoin de connaître un peu mieux les variables. Si vous pouviez m'éclairer là dessus, je vous en serait très reconnaissant et vous m'aideriez à progresser en macro. N'hésitez pas à me mettre des explications en chemin, ca ne peut que m'aider à comprendre ce que je fais.

Merci d'avance !
Configuration: Windows XP
Firefox 2.0.0.12

52 réponses

  • 1
  • 2
  • 3
Résumé de la discussion

Le problème central est de répéter une macro Excel 25 fois avec des valeurs différentes (1 à 25) sans recopier manuellement le code, afin de calculer des totaux mensuels. Des solutions consistent à extraire les chiffres dans des paramètres d’une procédure (par exemple ByVal j, A, B, C, D) et à appeler cette fonction 25 fois, évitant ainsi la duplication du code. D'autres préconisent d'utiliser des tableaux pour stocker les totaux (par exemple tabTotalm et tabTotalmd) et de récupérer les résultats par index lors de l'étape suivante. En pratique, on peut passer par des modules dédiés et des boucles contrôlées pour initialiser et stocker les valeurs, ce qui permet d’éviter les séquences répétitives et d’améliorer la lisibilité du code.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. Polux31 Messages postés 7219 Statut Membre 1 204
     
    tout compte fais c'est plus simple par là ... il faut remplacer comptePeriodeMoisDemi par

    Public Sub comptePeriodeMoisDemi(ByVal j As Double, ByVal A As String, ByVal B As String, ByVal C As String, ByVal D As String)
    Dim total As Integer
    
    Sheets(1).Select
    
    total = 0
    
        Range(A & Range(A & "65536").End(xlUp).Row + 1).Select
        Range(B, ActiveCell.Offset(-3, 0)).Select
        For Each Cell In Selection
            If Cell.Value = j - 0.5 And Cell.Offset(0, 1).Value = 2 And IsEmpty(Cell.Offset(0, 3)) And IsEmpty(Cell.Offset(0, 4)) Then
                total = total + 1
            End If
        Next
        
        Range(C & Range(C & "65536").End(xlUp).Row + 1).Select
        Range(D, ActiveCell.Offset(-1, 0)).Select
        For Each Cell In Selection
            If Cell.Value = j - 0.5 And Cell.Offset(0, 1).Value = 2 Then
                total = total + 1
            End If
        Next
        
        tabtotalmd(CInt(j - 0.5)) = total       'stockage dans le tabTotalmd à l'index j - 0.5 (l'index est un entier) -- Cint transforme la valeur en entier
    
        If total > 0 Then
            totalt = totalt + 1
            totalts = totalts + 1
        End If
    
    End Sub
    
    


    maintenant ça devrait le faire ... enfin j'espère.

    ;o)

    polux
    1
  2. Polux31 Messages postés 7219 Statut Membre 1 204
     
    bonjour,

    Il suffit de mettre un paramètre en entrée dans la macro.

    Sub Macro1(byval i As Integer)
    ...

    Ensuite tu remplaces dans la macro toutes les valeurs en gras (ici 1) par i. Il va quand même falloir que tu appelles 25 fois cette procédure (macro).

    Tu peux le faire dans une boucle :
    Dim i As Integer
    
         For i = 1 to 25
              Call Macro1(i)
         Next i
    
    


    J'espère que ça t'éclaire un peu ...

    Bon courage

    ;o)

    Polux
    0
  3. MattDF Messages postés 76 Statut Membre 67
     
    Un petit peu mais pas beaucoup : je me doute que placer i devant cell.value peut me permettre de ne pas mettre de chiffre, mais quid de total1m si je veux remplacer 1 par i ? sinon la simplification ne sera que symbolique dans la mesure où je serais obligé de reprendre cette petite macro pour chacun des 25 chiffres. je serais obligé de faire un truc genre

    For i = 1
    ....
    
    For i = 2
    ...
    
    For i = 3
    ...


    Ca ne me fera pas vraiment gagner de la place (sans compter qu'après il faut que je m'occupe de faire la même chose aux mois et demi, soit une opération renouvelée 50 fois.... imagine la taille de la macro !)

    De même, n'y a t'il pas moyen d'exécuter ce bout de macro 25 fois sans passer par une autre macro ?

    Pour finir, quelle est la propriété de "integer" ?
    0
  4. Polux31 Messages postés 7219 Statut Membre 1 204
     
    bon, c'est pas gagné ... lol ... je plaisante ...

    Alors Integer est simplement le type de variable et indique que la variable stockée est un entier;
    Petit rappel sur les types de variable le plus souvent utilisée en VB :

    Integer : stockage de nombre entier
    Double : stockage de nombre décimaux
    Long : stockage de nombre dans une plage de -2 147 483 648 à 2 147 483 647
    String : stockage de chaîne de caractères

    Ensuite, une boucle For ... Next, évite de répéter x fois la même opération. Dans le cas présent, avec trois lignes de code on va effectuer 25 fois la même opération. la première fois avec i = 1, la deuxième fois avec i = 2 etc jusqu'à que i atteigne la valeur de 25. Quand i aura la valeur de 25, on sort de la boucle.

    En ce qui concerne total1m ... il semble que cette variable sert uniquement de compteur ... quel est l'importance du 1 dans cette variable ? je n'en vois pas dans le code présent ... visiblement elle sert à vérifier que certaines cellules contiennent une information et si c'est le cas alors Totalt = Totalt + 1

    On peut effectivement placer la boucle For ... Next dans la macro. dans ce cas il faut faire :

    Sub Macro()
    Dim i As Interger
    
    For i = 0 to 25
    'La c'est pour comptabiliser les périodes de 1 mois
    Range("Q" & Range("Q65536").End(xlUp).Row + 1).Select
    Range("Q2", ActiveCell.Offset(-3, 0)).Select
    For Each Cell In Selection
    If Cell.Value = i And IsEmpty(Cell.Offset(0, 1)) And IsEmpty(Cell.Offset(0, 3)) And IsEmpty(Cell.Offset(0, 4)) Then
    total1m = total1m + 1
    End If
    Next
    Range("T" & Range("T65536").End(xlUp).Row + 1).Select
    Range("T2", ActiveCell.Offset(-1, 0)).Select
    For Each Cell In Selection
    If Cell.Value = i And IsEmpty(Cell.Offset(0, 1)) Then
    total1m = total1m + 1
    End If
    Next
    If total1m > 0 Then
    Totalt = Totalt + 1
    End If
    Next i
    


    voilà ... n'hésites pas à demander plus d'explication si je n'ai pas été assez clair

    ;o)

    polux
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. MattDF Messages postés 76 Statut Membre 67
     
    D'abord, merci de prendre du temps pour te pencher sur mon problème, c'est très aimable. :-)
    merci également pour les éclaircissements sur les variables. Comme je le disais, j'ai des lacunes en la matière et j'ai donc besoin de savoir vers quoi je vais afin de ne plus solliciter les gens pour résoudre X fois le même problème. :-)

    Donc il semblerait que je doive un peu plus expliquer les besoins de la macro. Effectivement, comme tu l'as deviné, la variable total1m a une importance. Je lui ai donné ce nom car elle totalise le nombre de fois ou elle trouve le chiffre 1 dans les cases concernées, chiffres qui correspondent à des durées en mois...d'où le m à la fin (en l'occurrence : total1m pour des durées d'1 mois, total2m pour 2 mois, etc...). Ces totaux seront ensuite repris pour être affichés un peu plus tard, toujours par la macro.

    Totalt sert à comptabiliser le nombre de lignes qui devront être affichées. En effet, si par exemple Excel ne trouve pas une seule case avec le chiffre 4 (pour des durées de 4 mois), je ne veux pas qu'il m'affiche une ligne pour me dire qu'il y a 0 personnes pour la durée de 4 mois, c'est pas intéressant et ca alourdit la feuille que je dois envoyer au client.

    Pour l'instant, la macro ne pourrait pas convenir en changeant juste les chiffres recherchés par des i car elle comptabiliserait toutes les durées de 1 à 25 mois pour des durées d'1 mois (total1m) lorsque l'affichage des lignes aura lieu. En effet, plus tard sur la macro, je demande ceci :

    'affichage éventuel pour une durée de 1 mois
    If total1m > 0 Then
    ActiveCell.Value = total1m 'le fameux résultat comptabilisant toutes les durées d'un mois
    ActiveCell.Offset(0, 2).Select
    ActiveCell.Value = 1 'pour 1 mois
    ActiveCell.Offset(0, 1).Select
    ActiveCell.Value = "month" 'au singulier car il n'y a qu'un mois, ce sera au pluriel quand on passera à des durées supérieures
    ActiveCell.Offset(0, 1).Select
    ActiveCell.FormulaR1C1 = "=Tarif" '"Tarif" est le nom donné à une case qui contient le... tarif
        Selection.Copy
        Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=False
        Application.CutCopyMode = False 'et ca c'est pour avoir le chiffre dans la case et non la formule.
    ActiveCell.Offset(1, -4).Select 'pour sélectionner la prochaine case active pour la durée suivante
    End If


    et ca je le demande aussi 25 fois (plus 25 autre fois pour les durées de mois et demi, donc 50 fois au total), pour toutes les durées calculées... Excel rend son tablier car la macro est trop longue... d'où mon besoin de raccourcir la macro.
    0
  7. Polux31 Messages postés 7219 Statut Membre 1 204
     
    ok je comprends mieux ...

    Je pense qu'il faut simplier ... en principe une macro est utile pour automatiser une tâche.
    Ici, une seule macro effectue plusieurs taches ... :-( ...

    Il faut donc faire plusieurs macros :-) ... ça va rendre les choses plus claires ...
    Rien n'empêche de le faire, une macro pouvant faire appel à une autre macro et ainsi de suite ...

    Je vois déjà 2 macros bien distinctes :

    'La c'est pour comptabiliser les périodes de 1 mois
    'affichage éventuel pour une durée de 1 mois

    Il en faut une 3 ème pour piloter le tout. On voit aussi qu'il y a une variable commune : la durée (périodes),
    c'est une variable qu'il faut passer en paramètre aux macros ...

    C'est difficile d'expliquer ça sur le forum. Si tu veux passe ton fichier ici https://www.cjoint.com/ et colle le lien dans ton prochain post. Supprimes les infos confidentielles ou fais un copier/coller de la macro dans le bloc-notes et mets le fichier sur ci-joint.com.

    ;o)

    polux
    0
  8. MattDF Messages postés 76 Statut Membre 67
     
    Voilà le fichier, compressé pour prendre moins de place. Tout est expliqué dans le fichier "explication", n'hésite pas à me demander des précisions si besoin est.

    https://www.cjoint.com/?ddpF2ahCNU

    Merci pour ton coup de main ! ;-)
    0
  9. Polux31 Messages postés 7219 Statut Membre 1 204
     
    merci je jete un oeil et je te fais signe

    ;o)

    polux
    0
  10. MattDF Messages postés 76 Statut Membre 67
     
    Je suis impatient d'avoir ton avis sur la question ! ^^
    0
  11. Polux31 Messages postés 7219 Statut Membre 1 204
     
    un question ?

    le code s'effectue bloc par bloc ... donc les variables totalt et totalts sont cumulés de bloc en bloc ??? c'est à dire que lorsque l'on est dans le bloc du 25ème mois, dans totalt et totalts il y a le cumul depuis le bloc de la 1ère semaine..

    Ai-je bien tout compris ?
    0
  12. Polux31 Messages postés 7219 Statut Membre 1 204
     
    pour l'instant j'essaie de voir comment optimiser l'étape 1 ...
    0
  13. Polux31 Messages postés 7219 Statut Membre 1 204
     
    heuuu une autre question ???

    dans la colonne Q et T j'ai des valeurs sous format texte ? est-ce normal ?
    0
  14. MattDF Messages postés 76 Statut Membre 67
     
    Tout à fait, quand on reçoit le fichier, il arrive comme ça. C'est une des choses qu'il faut justement changer quand on le reçoit, et maintenant je le fais via la macro.

    Pour Totalt et Totalts, tu as vu juste. Encore que j'avais prévu Totalts pour une chose et que finalement j'ai réussi à faire sans.... il est destiné à disparaître.
    0
  15. MattDF Messages postés 76 Statut Membre 67
     
    D'ici 10 minutes je vais devoir te laisser (je quitte le boulot)... mais on pourra reprendre demain si tu es dispo.
    0
  16. MattDF Messages postés 76 Statut Membre 67
     
    Pour info, tu peux t'étonner du fait que je demande à Excel d'effacer des cases vides. C'est qu'elles ne le sont pas vraiment, et elles viennent fausser mon calcul des cases grises dans la première feuille.
    0
  17. Polux31 Messages postés 7219 Statut Membre 1 204
     
    oui j'ai pigé pour le formatage des cellules par le code ... je suis surpris que tu n'es pas prévu un bouton pour lancer la macro ... lol

    ;o)
    0
  18. MattDF Messages postés 76 Statut Membre 67
     
    Ca sera pour la fin, quand tout le reste sera fonctionnel ! ;-)
    0
  19. Polux31 Messages postés 7219 Statut Membre 1 204
     
    bonjour,

    J'ai un peu bidouillé ton zinzin ... tu vas vite comprendre comment ça fonctionne, c'est assez simple.

    voilà le lien pour le récup: https://www.cjoint.com/?deiWg2H5AZ

    A toi de continuer à optimiser le reste du code ... tu peux faire la même chose pour la 2ème macro.

    N'hesite pas à me demander des précisions ou explications.

    bon courage

    ;o)

    Polux
    0
  20. MattDF Messages postés 76 Statut Membre 67
     
    Merci ! Je vais jeter un œil là dessus sans tarder ! ^^
    0
  21. MattDF Messages postés 76 Statut Membre 67
     
    Donc tu as élaboré ce petit code :
    Sub comptePeriode()
    Dim i As Double
    
        For i = 1 To 3
            Call ModComptabilise.comptePeriodeSemaine(i, "R", "R2", "U", "U2")
        Next i
        
        For i = 1 To 25
            Call ModComptabilise.comptePeriodeMois(i, "Q", "Q2", "T", "T2")
        Next i
        
        For i = 1.5 To 24.5
            Call ModComptabilise.comptePeriodeMoisDemi(i, "Q", "Q2", "T", "T2")
        Next i
    
    
    End Sub


    Je vois que de cette façon tu comptes les périodes pour les valeurs différentes de "i". Peux tu m'éclairer sur certains points :

    - Est ce que les "i" sont comptés en fonction des critères que j'avais posé ? (absence de contenu dans certaines colonnes)
    - Comment exploiter les "i" dans la deuxième étape ?
    0
  • 1
  • 2
  • 3