[excel] formulation d'une variable
Résolu
MattDF
Messages postés
76
Date d'inscription
Statut
Membre
Dernière intervention
-
MattDF Messages postés 76 Date d'inscription Statut Membre Dernière intervention -
MattDF Messages postés 76 Date d'inscription Statut Membre Dernière intervention -
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 :
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 !
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:
- [excel] formulation d'une variable
- Liste déroulante excel - Guide
- Formule si et excel - Guide
- Déplacer une colonne excel - Guide
- Formule moyenne excel plusieurs colonnes - Guide
- Word et excel gratuit - Guide
52 réponses
tout compte fais c'est plus simple par là ... il faut remplacer comptePeriodeMoisDemi par
maintenant ça devrait le faire ... enfin j'espère.
;o)
polux
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
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 :
J'espère que ça t'éclaire un peu ...
Bon courage
;o)
Polux
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
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
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" ?
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" ?
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 :
voilà ... n'hésites pas à demander plus d'explication si je n'ai pas été assez clair
;o)
polux
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 :
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.
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.
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
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
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 ! ;-)
https://www.cjoint.com/?ddpF2ahCNU
Merci pour ton coup de main ! ;-)
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 ?
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 ?
heuuu une autre question ???
dans la colonne Q et T j'ai des valeurs sous format texte ? est-ce normal ?
dans la colonne Q et T j'ai des valeurs sous format texte ? est-ce normal ?
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.
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.
D'ici 10 minutes je vais devoir te laisser (je quitte le boulot)... mais on pourra reprendre demain si tu es dispo.
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.
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)
;o)
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
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
Donc tu as élaboré ce petit code :
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 ?
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 ?