[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
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
A voir également:
- [excel] formulation d'une variable
- Liste déroulante excel - Guide
- Formule excel pour additionner plusieurs cellules - Guide
- Formule excel si et - Guide
- Formule excel moyenne - Guide
- Déplacer une colonne excel - Guide
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 à 10:30
4 mars 2008 à 10:30
Salut,
Les "i" ne servent que d'index, si tu ouvres le module ModComptabilise, tu vas voir que le code n'est qu'un copier/coller du code que tu as dans le module 6. Je l'ai juste modifié avec les paramètres que je passe. Ca évite d'écrire 25 fois la même procédure. Je reprends donc les mêmes critères, qui sont différents pour la semaine, le mois ou le mois 1/2.
Dans la première boucle For ...Next, je comptabilise pour i = 1 ce que tu as dans total1s. Pour i = 2 ce que tu as dans dans total2s etc ...
Dans la 2ème boucle For ... Next, je comptabilise pour i = 1 ce que tu as dans total1m. Pour i = 2 ce que tu as dans total2m etc ...
Dans la 3ème boucle For ... Next, je comptabilise pour i = 1.5 ce que tu as dans total1md. Pour i = 2.5 ce que tu as dans total2md etc ...
J'espère que tu as remarqué comment découper un code pour le rendre plus clair et comment on peut passer d'une procédure à une autre. Il est préférable de faire plusieurs porcédures ou fonctions (macros), pour une meilleure lisibilité et surtout une facilité dans la maintenance du code.
Pour l'étape2, je n'ai pas vraiment regardé, j'ai juste vu que tu pouvais encore optimiser le code en utilisant la même technique ... Je vais le regarder et je te fais signe ...
;o)
polux
Les "i" ne servent que d'index, si tu ouvres le module ModComptabilise, tu vas voir que le code n'est qu'un copier/coller du code que tu as dans le module 6. Je l'ai juste modifié avec les paramètres que je passe. Ca évite d'écrire 25 fois la même procédure. Je reprends donc les mêmes critères, qui sont différents pour la semaine, le mois ou le mois 1/2.
Dans la première boucle For ...Next, je comptabilise pour i = 1 ce que tu as dans total1s. Pour i = 2 ce que tu as dans dans total2s etc ...
Dans la 2ème boucle For ... Next, je comptabilise pour i = 1 ce que tu as dans total1m. Pour i = 2 ce que tu as dans total2m etc ...
Dans la 3ème boucle For ... Next, je comptabilise pour i = 1.5 ce que tu as dans total1md. Pour i = 2.5 ce que tu as dans total2md etc ...
J'espère que tu as remarqué comment découper un code pour le rendre plus clair et comment on peut passer d'une procédure à une autre. Il est préférable de faire plusieurs porcédures ou fonctions (macros), pour une meilleure lisibilité et surtout une facilité dans la maintenance du code.
Pour l'étape2, je n'ai pas vraiment regardé, j'ai juste vu que tu pouvais encore optimiser le code en utilisant la même technique ... Je vais le regarder et je te fais signe ...
;o)
polux
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 à 10:38
4 mars 2008 à 10:38
OK je te laisse jeter un œil car les résultats de l'un affectent directement les données de l'autre. J'attends avec impatience tes remarques ! ^^
J'aurais d'autres question après. Merci encore ! ;-)
J'aurais d'autres question après. Merci encore ! ;-)
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 à 11:18
4 mars 2008 à 11:18
ok, je viens de voir ... et je n'avais pas vu cet aspect là ... :os
Mais il y a une solution ... :o)
Dans l'étape1, on va passer par un tableau pour stocker les valeurs de total1s, totals2 etc ... idem pour total1m, total2m etc ... idem pour total1md, total2md etc ...
Dans l'étape2, on ira récupérer les valeurs dans les tableaux pour les mettre là où ça va bien ... :o)
Je suppose que tout ça ne te parles pas beaucoup ... j'explique donc :
un tableau, kézako ? c'est une variable améliorée pour faire court ... on peut y stocker des valeurs
à la suite l'une de l'autre, en leur donnant un index pour pouvoir ensuite les récupérer.
Par exemple, j'ai un tableau qui contient des noms de ville
Dans le module ModComptabilise je vais créer 3 tableaux, tabTotals, tabTotalm et tabTotalmd.
J'affecterai la valeur de total de chaque boucle dans le tableau correspondant avec l'index qui va bien.
La structure des boucles étant la même pour l'étape2, il sera facile de récupérer la valeur avec
l'index qui va bien également ... enfin, j'ai pas encore essayé mais ça devrait le faire comme ça ... :o)
Ca fait un peu professeur ça ... :o( ...lol
;o)
polux
Mais il y a une solution ... :o)
Dans l'étape1, on va passer par un tableau pour stocker les valeurs de total1s, totals2 etc ... idem pour total1m, total2m etc ... idem pour total1md, total2md etc ...
Dans l'étape2, on ira récupérer les valeurs dans les tableaux pour les mettre là où ça va bien ... :o)
Je suppose que tout ça ne te parles pas beaucoup ... j'explique donc :
un tableau, kézako ? c'est une variable améliorée pour faire court ... on peut y stocker des valeurs
à la suite l'une de l'autre, en leur donnant un index pour pouvoir ensuite les récupérer.
Par exemple, j'ai un tableau qui contient des noms de ville
Dim i As Intéger 'je déclare un index de boucle Dim tabVille(3) As String 'je déclare un tableau qui contiendra des chaines de caractères (string) 'avec 4 index (le premier index étant 0) tabVille(0) = "Paris" 'j'affecte la valeur "Paris" à l'index 0 de mon tableau tabVille tabVille(1) = "Sedan" 'j'affecte la valeur "Sedan" à l'index 1 de mon tableau tabVille tabVille(2) = "Caen" 'j'affecte la valeur "Caen" à l'index 2 de mon tableau tabVille tabVille(3) = "Rouen" 'j'affecte la valeur "Rouen" à l'index 3 de mon tableau tabVille For i = 0 to 3 'Début de la boucle For pour lire tous les index du tableau tabVille MsgBox tabVille(i) 'Affiche la valeur contenue dans le tableau tabVille à l'index i Next i ' fin de la boucle For
Dans le module ModComptabilise je vais créer 3 tableaux, tabTotals, tabTotalm et tabTotalmd.
J'affecterai la valeur de total de chaque boucle dans le tableau correspondant avec l'index qui va bien.
La structure des boucles étant la même pour l'étape2, il sera facile de récupérer la valeur avec
l'index qui va bien également ... enfin, j'ai pas encore essayé mais ça devrait le faire comme ça ... :o)
Ca fait un peu professeur ça ... :o( ...lol
;o)
polux
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 à 11:51
4 mars 2008 à 11:51
Ok... je vois ce que tu veux dire ! Je te laisse procéder, le principe à l'air de coller aux besoins de ma macro. Je m'excuse de ne pas connaître toutes ces subtilités, mais je ne me suis mis à la macro qu'au début de février et en autodidacte... donc il me manque pas mal de bases ! :-)
En tout cas merci "professeur" ! ;-)
En tout cas merci "professeur" ! ;-)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 à 11:55
4 mars 2008 à 11:55
arrrrfffffffffff ... non ... surtout pas "professeur" .........
Pour avoir des bases : https://www.developpez.com/ et https://office.developpez.com/cours/
Je me colle à l'étape2 cet aprem.
;o)
polux
Pour avoir des bases : https://www.developpez.com/ et https://office.developpez.com/cours/
Je me colle à l'étape2 cet aprem.
;o)
polux
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 à 13:10
4 mars 2008 à 13:10
Oups ... j'ai trouvé des erreurs dans le fichier que je t'ai envoyé ... :os ... je les ai corrigées dans celui que je vais t'envoyer dès que j'ai fini avec l'étape2 ...
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 à 13:38
4 mars 2008 à 13:38
De quoi s'agissait-il ??
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 à 13:42
4 mars 2008 à 13:42
une erreur dans la déclaration des variables ... voilà le nouveau fichier : https://www.cjoint.com/?denP1YlD6s
Si tu vois quelque chose qui cloche fais moi signe
;o)
Polux
Si tu vois quelque chose qui cloche fais moi signe
;o)
Polux
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 à 13:54
4 mars 2008 à 13:54
Je te remercie BEAUCOUP pour tout ce temps passé sur cette macro ! ^^
Je jette un œil tout de suite.
Je jette un œil tout de suite.
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 à 14:02
4 mars 2008 à 14:02
de rien c'est un plaisir ...
J'attends tes commentaires et éventuelles questions ...
;o)
polux
J'attends tes commentaires et éventuelles questions ...
;o)
polux
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 à 14:05
4 mars 2008 à 14:05
Il y a quelque chose qui coince ici :
Comme tu le constate : la cellule "pax" est systématiquement sélectionnée, ce qui pose un problème : les données ne s'affichent pas les unes en dessous des autres mais changent systématiquement la première ligne... laissant les autres lignes vierges.
Public Sub configSemaine(ByVal i As Integer) Sheets(2).Select Range("pax").Select 'affichage éventuel pour une durée hebdomadaire If ModComptabilise.tabTotals(i) > 0 Then ActiveCell.Value = ModComptabilise.tabTotals(i) ActiveCell.Offset(0, 2).Select ActiveCell.Value = i ActiveCell.Offset(0, 1).Select If i = 1 Then ActiveCell.Value = "week" Else ActiveCell.Value = "weeks" End If ActiveCell.Offset(0, 1).Select ActiveCell.FormulaR1C1 = "=Tarif/4" Selection.Copy Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Application.CutCopyMode = False ActiveCell.Offset(1, -4).Select End If End Sub Public Sub configMois(ByVal i As Integer) Sheets(2).Select Range("pax").Select 'affichage éventuel pour une durée mensuelle If ModComptabilise.tabTotalm(i) > 0 Then ActiveCell.Value = ModComptabilise.tabTotalm(i) ActiveCell.Offset(0, 2).Select ActiveCell.Value = i ActiveCell.Offset(0, 1).Select If i = 1 Then ActiveCell.Value = "month" Else ActiveCell.Value = "months" End If ActiveCell.Offset(0, 1).Select ActiveCell.FormulaR1C1 = "=Tarif" Selection.Copy Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Application.CutCopyMode = False ActiveCell.Offset(1, -4).Select End If End Sub Public Sub configMoisDemi(ByVal i As Double) Sheets(2).Select Range("pax").Select 'affichage éventuel pour une durée d'un mois 1/2 If ModComptabilise.tabtotalmd(CInt(j - 1)) > 0 Then ActiveCell.Value = ModComptabilise.tabtotalmd(CInt(j - 1)) ActiveCell.Offset(0, 2).Select ActiveCell.Value = i ActiveCell.Offset(0, 1).Select ActiveCell.Value = "months" ActiveCell.Offset(0, 1).Select ActiveCell.FormulaR1C1 = "=Tarif" Selection.Copy Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Application.CutCopyMode = False ActiveCell.Offset(1, -4).Select End If End Sub
Comme tu le constate : la cellule "pax" est systématiquement sélectionnée, ce qui pose un problème : les données ne s'affichent pas les unes en dessous des autres mais changent systématiquement la première ligne... laissant les autres lignes vierges.
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 à 14:10
4 mars 2008 à 14:10
En fait, je pense qu'il faudrait sélectionner "pax" hors de ces petites macro, et faire en sorte, à l'issu de chaque exécution, de sélectionner la cellule de la colonne A sous la ligne si celle-ci a subi des changements.
[edit] j'ai l'impression d'être un peu brouillon dans mes idées... tu arrives à me suivre ? :-)
Ce que je veux dire c'est que sélectionner "pax" au début rend inopérant et inutile la fonction :
[edit] j'ai l'impression d'être un peu brouillon dans mes idées... tu arrives à me suivre ? :-)
Ce que je veux dire c'est que sélectionner "pax" au début rend inopérant et inutile la fonction :
ActiveCell.Offset(1, -4).Select
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 à 14:17
4 mars 2008 à 14:17
désolé je me suis trompé de fichier ... je suis à l'ouest là ... voilà le lien : https://www.cjoint.com/?deooTNmFDj
Exactement ... tu as bien vu ... ... tu deviens une vraie pro ... :o)
;o)
polux
Exactement ... tu as bien vu ... ... tu deviens une vraie pro ... :o)
;o)
polux
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 à 14:26
4 mars 2008 à 14:26
Trop gentil !! ^^
Tout marche bien, sauf les durées en mois et demi. Celles là ne s'affichent pas (je confesse que je n'ai pas encore regardé la macro pour voir la cause)
Tout marche bien, sauf les durées en mois et demi. Celles là ne s'affichent pas (je confesse que je n'ai pas encore regardé la macro pour voir la cause)
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 à 14:37
4 mars 2008 à 14:37
ah ... j'ai pas trouvé pourquoi ... :-s
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 à 14:59
4 mars 2008 à 14:59
Il semble que la valeur pour les mois et demi soit stocké en "j", or tu lui demande d'afficher "i"
Pourtant si j'en juge d'après cette macro, "i" ne semble pas sollicité (en tout cas pas pour les mois et demi).
Ca pourrait pas venir de là ??
Public Sub configMoisDemi(ByVal i As Double) Sheets(2).Select 'Range("pax").Select 'affichage éventuel pour une durée d'un mois 1/2 If ModComptabilise.tabtotalmd(CInt(j - 0.5)) > 0 Then ActiveCell.Value = ModComptabilise.tabtotalmd(CInt(j - 0.5)) ActiveCell.Offset(0, 2).Select ActiveCell.Value = i ActiveCell.Offset(0, 1).Select ActiveCell.Value = "months" ActiveCell.Offset(0, 1).Select ActiveCell.FormulaR1C1 = "=Tarif" Selection.Copy Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Application.CutCopyMode = False ActiveCell.Offset(1, -4).Select End If End Sub
Pourtant si j'en juge d'après cette macro, "i" ne semble pas sollicité (en tout cas pas pour les mois et demi).
Public Sub configureFeuille2() Dim i As Integer Dim j As Double 'sélection de la première case pour commencer à remplir les lignes Range("pax").Select For i = 1 To 3 Call ModConfigFeuil2.configSemaine(i) Next i For i = 1 To 25 Call ModConfigFeuil2.configMois(i) Next i For j = 1.5 To 24.5 Call ModConfigFeuil2.configMoisDemi(j) Next j activeFormule 'Appel la procédure activeFormule End Sub
Ca pourrait pas venir de là ??
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 à 16:06
4 mars 2008 à 16:06
Bon... après avoir testé... ca ne vient pas de là.
Je sèche un peu là...
Je sèche un peu là...
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 à 16:11
4 mars 2008 à 16:11
bravo ... c'est presque ça ... :o)) ...
Tu as raison pour la première partie, la procédure reçoit "i" comme paramètre ... et l'erreur se situe ici :
Il faut remplacer "j" par "i", ça donne :
Pour la deuxième partie, effectivement je passe la valeur de "j" en paramètre, mais la procèdure qui
réceptionne cette valeur peut prendre un nom quelconque comme variable de réception de
la valeur de "j" ... j'aurai pu écrire ceci :
Le résultat est le même ...
Bravo encore de l'avoir débeugué ... le métier rentre .. :o)
J'espère que tu y vois un peu plus clair sur les variables et la façon de les utiliser.
N'hésite pas si tu as d'autres questions
Bon courage
;o)
polux
Tu as raison pour la première partie, la procédure reçoit "i" comme paramètre ... et l'erreur se situe ici :
If ModComptabilise.tabtotalmd(CInt(j - 0.5)) > 0 Then ActiveCell.Value = ModComptabilise.tabtotalmd(CInt(j - 0.5))
Il faut remplacer "j" par "i", ça donne :
If ModComptabilise.tabtotalmd(CInt(i - 0.5)) > 0 Then ActiveCell.Value = ModComptabilise.tabtotalmd(CInt(i - 0.5))
Pour la deuxième partie, effectivement je passe la valeur de "j" en paramètre, mais la procèdure qui
réceptionne cette valeur peut prendre un nom quelconque comme variable de réception de
la valeur de "j" ... j'aurai pu écrire ceci :
Public Sub configMoisDemi(ByVal toto As Double) Sheets(2).Select 'Range("pax").Select 'affichage éventuel pour une durée d'un mois 1/2 If ModComptabilise.tabtotalmd(CInt(toto- 0.5)) > 0 Then ActiveCell.Value = ModComptabilise.tabtotalmd(CInt(toto- 0.5)) ActiveCell.Offset(0, 2).Select ActiveCell.Value = toto ActiveCell.Offset(0, 1).Select ActiveCell.Value = "months" ...
Le résultat est le même ...
Bravo encore de l'avoir débeugué ... le métier rentre .. :o)
J'espère que tu y vois un peu plus clair sur les variables et la façon de les utiliser.
N'hésite pas si tu as d'autres questions
Bon courage
;o)
polux
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 à 16:14
4 mars 2008 à 16:14
Ca commence à rentrer ! :-)
Bon... je teste ca tout de suite et je te dis si ca marche.
Bon... je teste ca tout de suite et je te dis si ca marche.
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 à 16:25
4 mars 2008 à 16:25
Ca marche pas chez moi... :'-(
Même après la correction, il persiste à ne pas vouloir m'afficher les périodes de mois et demi !!
Tu peux m'envoyer ton fichier corrigé stp ??
Même après la correction, il persiste à ne pas vouloir m'afficher les périodes de mois et demi !!
Tu peux m'envoyer ton fichier corrigé stp ??