[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
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
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 ! ;-)
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
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
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
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 ...
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
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.
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.
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
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
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)
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à ??
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