[excel] formulation d'une variable

Résolu/Fermé
MattDF Messages postés 76 Date d'inscription vendredi 14 décembre 2007 Statut Membre Dernière intervention 5 août 2009 - 3 mars 2008 à 09:29
MattDF Messages postés 76 Date d'inscription vendredi 14 décembre 2007 Statut Membre Dernière intervention 5 août 2009 - 6 mars 2008 à 08:51
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 !
A voir également:

52 réponses

Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
4 mars 2008 à 17:05
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
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
3 mars 2008 à 09:50
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
MattDF Messages postés 76 Date d'inscription vendredi 14 décembre 2007 Statut Membre Dernière intervention 5 août 2009 67
3 mars 2008 à 11:07
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
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
3 mars 2008 à 12:49
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
MattDF Messages postés 76 Date d'inscription vendredi 14 décembre 2007 Statut Membre Dernière intervention 5 août 2009 67
3 mars 2008 à 14:09
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
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
3 mars 2008 à 14:41
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
MattDF Messages postés 76 Date d'inscription vendredi 14 décembre 2007 Statut Membre Dernière intervention 5 août 2009 67
3 mars 2008 à 15:32
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
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
3 mars 2008 à 15:42
merci je jete un oeil et je te fais signe

;o)

polux
0
MattDF Messages postés 76 Date d'inscription vendredi 14 décembre 2007 Statut Membre Dernière intervention 5 août 2009 67
3 mars 2008 à 16:11
Je suis impatient d'avoir ton avis sur la question ! ^^
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
3 mars 2008 à 16:11
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
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
3 mars 2008 à 16:13
pour l'instant j'essaie de voir comment optimiser l'étape 1 ...
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
3 mars 2008 à 16:29
heuuu une autre question ???

dans la colonne Q et T j'ai des valeurs sous format texte ? est-ce normal ?
0
MattDF Messages postés 76 Date d'inscription vendredi 14 décembre 2007 Statut Membre Dernière intervention 5 août 2009 67
3 mars 2008 à 16:34
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
MattDF Messages postés 76 Date d'inscription vendredi 14 décembre 2007 Statut Membre Dernière intervention 5 août 2009 67
3 mars 2008 à 16:41
D'ici 10 minutes je vais devoir te laisser (je quitte le boulot)... mais on pourra reprendre demain si tu es dispo.
0
MattDF Messages postés 76 Date d'inscription vendredi 14 décembre 2007 Statut Membre Dernière intervention 5 août 2009 67
3 mars 2008 à 17:02
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
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
3 mars 2008 à 17:10
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
MattDF Messages postés 76 Date d'inscription vendredi 14 décembre 2007 Statut Membre Dernière intervention 5 août 2009 67
3 mars 2008 à 19:05
Ca sera pour la fin, quand tout le reste sera fonctionnel ! ;-)
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
4 mars 2008 à 08:53
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
MattDF Messages postés 76 Date d'inscription vendredi 14 décembre 2007 Statut Membre Dernière intervention 5 août 2009 67
4 mars 2008 à 09:29
Merci ! Je vais jeter un œil là dessus sans tarder ! ^^
0
MattDF Messages postés 76 Date d'inscription vendredi 14 décembre 2007 Statut Membre Dernière intervention 5 août 2009 67
4 mars 2008 à 09:46
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