Hiérarchisation des macros

Résolu/Fermé
padbollevrai Messages postés 51 Date d'inscription mercredi 1 avril 2009 Statut Membre Dernière intervention 18 mars 2015 - 7 mai 2014 à 12:49
padbollevrai Messages postés 51 Date d'inscription mercredi 1 avril 2009 Statut Membre Dernière intervention 18 mars 2015 - 7 mai 2014 à 16:50
Bonjour,

Voici ce que je dois réussir à faire.
J'ai un programme qui récupère les valeurs d'une feuille, les traite et les transpose dans une colonne d'une autre feuille.

C'est très bien, mais j'ai 12 colonnes à remplir de la sorte !

Basiquement, ce sont 6 colonnes visisées en 2 (valeur min et valeur Max).

MAIS les colonnes Min peuvent aussi être de type "Count", ou de type "Time", auxquels cas il n'y a pas de colonnes Max à coté.


Pour résumer: Les colonnes A, C, E, G, I, K peuvent être soit Min, soit Count, soit Time,
les colonnes B, D, F, G, J, L peuvent être soit Max, soit Rien.


Ma programmation doit donc s'adapter à chaque type de colonne, c'est pourquoi j'ai pensé à une macro Maitre qui commanderait des macros Esclaves en fonction du nom de chaque colonne, de la forme (Attention, c'est juste une esquisse) :


Sub MAIN_FILLING()

If A3 is "Count", then call Filling_Count_A, Else if A3 is "Time", then Call Filling_Time_A, Else Call Filling_Min_A

If B3 is "Max", then call Filling_Max_B, Else ""

If C3 is "Count", then call Filling_Count_C, Else if C3 is "Time", then Call Filling_Time_C, Else Call Filling_Min_C

If D3 is "Max", then call Filling_Max_D, Else ""

If E3 is "Count", then call Filling_Count_E, Else if E3 is "Time", then Call Filling_Time_E, Else Call Filling_Min_E

If F3 is "Max", then call Filling_Max_F, Else ""

If G3 is "Count", then call Filling_Count_G, Else if G3 is "Time", then Call Filling_Time_G, Else Call Filling_Min_G

If H3 is "Max", then call Filling_Max_H, Else ""

If I3 is "Count", then call Filling_Count_I, Else if I3 is "Time", then Call Filling_Time_I, Else Call Filling_Min_I

If J3 is "Max", then call Filling_Max_J, Else ""

If K3 is "Count", then call Filling_Count_K, Else if K3 is "Time", then Call Filling_Time_K, Else Call Filling_Min_K

If L3 is "Max", then call Filling_Max_L, Else ""


End Sub



Ca marcherait, mais ce serait un sacré bordel ! En effet, 24 programmes différents alors qu'il n'y a que trois tâches à effectuer...

Ce que je voudrais, c'est avoir un programme pour remplir les Count, un pour les Min, un pour les Max et un pour les Time, commandés par la macro maitresse, et qui s'adapteraient pour ecrire les informations dans les bonnes colonnes biensur.


Es-ce possible, et comment le fait-on ?

Merci !


A voir également:

4 réponses

pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 752
7 mai 2014 à 13:15
Bonjour,

Il te faut donc une fonction (ou une procédure) avec en paramètre, la colonne. Comme ceci :

Sub Main()
If [A3] = "count" Then Call Filling_Count(1)
If [A3] = "time" Then Call Filling_Time(1)
If [B3] = "count" Then Call Filling_Count(2)
If [B3] = "time" Then Call Filling_Time(2)
'etc...
End Sub

Sub Filling_Count(NumCol As Integer)
With columns(NumCol)
  'blabla
End With
End Sub

Sub Filling_Time(NumCol As Integer)
With columns(NumCol)
  'blabla
End With
End Sub


Tu peux même faire une boucle dans ton main avec un select case etc...

Genre :
For Col = 1 To 12
  Select Case Cells(3, Col)
    Case "count"
      Call Filling_Count(Col)

    Case "min"
      Call Filling_Min(Col)

    Case "max"
      Call Filling_Max(Col)

    Case "Time"
      Call Filling_Time(Col)

    Case Else
      MsgBox "Erreur Fatale"
  End Select
Next

0
padbollevrai Messages postés 51 Date d'inscription mercredi 1 avril 2009 Statut Membre Dernière intervention 18 mars 2015 1
7 mai 2014 à 14:24
Wow ! Excellent, merci beaucoup !

Maintenant, dans mes sous-macro, comment remplacer la lettre le la colonne par la variable "Col" ?

Exemple, si j'ai un Range("B" & K).Value, il suffit de mettre Range("Col" & K) ?

Merci
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 752
7 mai 2014 à 15:20
La syntaxe Cells est adaptée à cette situation :
Cells(Ligne, Colonne).Value

Range("B3") est égal à Cells(3, 2)
0
padbollevrai Messages postés 51 Date d'inscription mercredi 1 avril 2009 Statut Membre Dernière intervention 18 mars 2015 1
Modifié par padbollevrai le 7/05/2014 à 16:28
Merci beaucoup.

Dernière chose: Tu as mis

For Col = 1 To 12
  Select Case Cells(3, Col)
    Case "count"
      Call Filling_Count(Col)

    Case "min"
      Call Filling_Min(Col)

    Case "max"
      Call Filling_Max(Col)

    Case "Time"
      Call Filling_Time(Col)

    Case Else
      MsgBox "Erreur Fatale"
  End Select
Next


Or, à la place de "Erreur fatale" en cas de "case else", j'aimerais qu'il passe à la valeur suivante. J'ai donc mis un Next à la place de MsgBox "Erreur Fatale", mais cela fait un doublon de Next... Et il me fait une erreur à la compilation.

Suffit-il de ne rien mettre ou y a-t-il quelque chose de particulier ?

Autre souci: Dans une de mes sous-macro, une erreur de compilation stipule "Déclaration existante dans la portée en cours" sur "Dim Col as Integer".
Je ne déclare qu'une fois cette variable, je ne comprends pas cette erreur, d'autant que les autres sous-macros situées plus haut dans le code n'ont pas renvoyé cette erreur.


Merci
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 752
7 mai 2014 à 16:39
Tu ne mets rien dans le Case Else.

Déclaration existante dans la portée en cours
regarde bien,, tu dois avoir une variable Col Déclarée deux fois.
Remplace par Colonne....
0
padbollevrai Messages postés 51 Date d'inscription mercredi 1 avril 2009 Statut Membre Dernière intervention 18 mars 2015 1
Modifié par padbollevrai le 7/05/2014 à 17:40
J'ai réussi à m'en sortir, tout est Ok !

Je mettais en fait "Dim Col as Integer" dans le Main ET dans chaque macro.

Merci beaucoup !
0