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

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
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 à 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" ! ;-)
0

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
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
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 à 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 ...
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 à 13:38
De quoi s'agissait-il ??
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 à 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
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 à 13:54
Je te remercie BEAUCOUP pour tout ce temps passé sur cette macro ! ^^

Je jette un œil tout de suite.
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 à 14:02
de rien c'est un plaisir ...

J'attends tes commentaires et éventuelles questions ...

;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 à 14:05
Il y a quelque chose qui coince ici :

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.
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 à 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 :
ActiveCell.Offset(1, -4).Select
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 à 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
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 à 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)
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 à 14:37
ah ... j'ai pas trouvé pourquoi ... :-s
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 à 14:59
Il semble que la valeur pour les mois et demi soit stocké en "j", or tu lui demande d'afficher "i"

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à ??
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 à 16:06
Bon... après avoir testé... ca ne vient pas de là.

Je sèche un peu là...
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 à 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 :
    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
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 à 16:14
Ca commence à rentrer ! :-)

Bon... je teste ca tout de suite et je te dis si ca marche.
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 à 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 ??
0