Comment faire appel à un module pour limiter l'écriture de procédure avec variab

Résolu
thibaultanguy Messages postés 45 Date d'inscription jeudi 3 juillet 2008 Statut Membre Dernière intervention 16 novembre 2012 - 16 nov. 2012 à 11:48
 Fanfan20167 - 27 nov. 2012 à 17:32
Bonjour le Forum,
Je souhaiterais dans cette procédure faire appel à un module, car je dois exécuter ce code sur plusieurs lignes excel. J'ai essayé plusieurs façons, sans résultat (déclaration des variables en public etc...).
Auriez-vous une petite idée pour m'aider ?
Par avance merci.




Private Sub CommandButton1_Click()
Application.ScreenUpdating = False
Dim CompterDemieRH As Integer
Dim compterRH As Integer
Dim compterCA As Integer
Dim compterdemiCA As Integer
Dim comptersa As Integer
Dim compterdemisa As Integer
Dim Cellules As Range
Sheets("Liste").Select
Range("G7:NG7").Select
For Each Cellules In Selection
'RH
If Cellules.Value "RH" Then compterRH compterRH + 1

If Cellules.Value "1/2 RH" Then CompterDemieRH CompterDemieRH + 1

 'CA
If Cellules.Value "CA" Then compterCA compterCA + 1

If Cellules.Value "1/2 CA" Then compterdemiCA compterdemiCA + 1

  Next Cellules
[f7] = compterRH + CompterDemieRH / 2
[E7] = compterCA + compterdemiCA / 2
              
Application.ScreenUpdating = True
End Sub[code=vb]
/code
eric

5 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
16 nov. 2012 à 13:16
Bonjour,
Je ne vois rien dans ce code qui viendrait gêner, si toutes les lignes sont dans la feuille active !
Reste que cette phrase :
car je dois exécuter ce code sur plusieurs lignes excel

est peut-être mal rédigée et tu veux peut-être parler de feuilles différentes !
Essaye d'être clair sur ce point très précis !


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
16 nov. 2012 à 13:20
Salut

"sur plusieurs lignes"
Dans ton code, on ne voit pas de désignation de ligne particulière.
On ne sait donc pas se que tu voudrais rendre paramétrable.
Est-ce le Range("G7:NG7") ?

Exemple de paramétrage d'un Range (que ce soit un groupe de cellule ou une cellule unique, cela reste la même syntaxe) :
Dans la procédure qui appelle :
Dim oRange As Range
Set oRange = Sheets("Liste").Range("A1:B45")
Call maProcedure(oRange)


Et la procédure paramétrée (*) : (exemple)
Sub maProcedure(ByRef TheRange As Range)
    Dim myCell As Range
    For Each myCell In TheRange
        Debug.Print myCell.Value
    Next
End Sub
(*) Ajoute Public devant la déclaration de cette Sub si tu la places dans un module différent de la procédure appelante.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
3
Fanfan20167
16 nov. 2012 à 13:56
Bonjour,
Si j'ai bien décripté ta question, il te faut déclarer tes variables (si tu veux pouvoir les utiliser a partir de la feuille appelante) dans la partie declarations de ton Module1 et ecrire ta nouvelle procedure dans ce module que tu pourras appeler a partir de ta feuille ou se trouve ton bouton de commande. Tu devras faire une petite adaptation concernant le referencement de ta selection : nom de la feuille.
Par ailleurs, tu devrais utiliser Select Case a la place de tes If successifs.
Cdlt
3
thibaultanguy Messages postés 45 Date d'inscription jeudi 3 juillet 2008 Statut Membre Dernière intervention 16 novembre 2012
16 nov. 2012 à 15:14
Merci les amis d'avoir répondu à ma demande. Il va falloir que je "digère tout cela".
Effectivement, le Range("G7:NG7") est ma plage de recherche, ensuite le Range("G8:NG8") etc. jusqu'à G30 !!
Ce que je souhaite réaliser en vous présentant ce code, c'est de comptabiliser le nombre de fois ou se trouve par ligne les mentions CA et RH (congé & récup) et leur moitié 1/2 CA ; 1/2 RH.
Ensuite je comptabilise en donnant une valeur 1 à CA et RH et 0.5 à 1/2 CA et 1/2 RH.
Ensuite, je range le total de l'opération en [E7] pour CA et [F7] pour RH.
Le problème est que j'ai beaucoup de lignes à traiter !! de plus, je viens de m'apercevoir que le code fonctionne pour la première ligne seulement car les variables conservent leur valeur et les incrémentent tout au long du déroulement de la procédure.
Avec les fonctions Excel de ce type(=SI(C5="CA";1;0)), je suis parvenus au résultat, mais je voudrais aujourd'hui instruire cela avec du code et c'est bien là le HIC ......

Merci à tous
eric
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Fanfan20167
27 nov. 2012 à 17:32
Bonjour Eric,
Voici une ébauche de solution à ton problème :

Sub Comptage(ByVal Zone$)
    Dim C1 As Range, C2 As Range, Z As Range
    On Error Resume Next
    Set Z = Range(Zone)         'on teste la validité de la zone
    If Err.Number <> 0 Then
        MsgBox "La zone passée en paramètre est invalide", vbCritical, "ERREUR ZONE " & Zone
        Exit Sub
    End If
    On Error GoTo 0
    Set C1 = Z(1).Offset(0, -2)   '2 col avant la zone de recherche
    Set C2 = Z(1).Offset(0, -1)   '1 col avant
    C1.Value = WorksheetFunction.CountIf(Z, "CA") + WorksheetFunction.CountIf(Z, "1/2 CA") / 2
    C2.Value = WorksheetFunction.CountIf(Z, "RH") + WorksheetFunction.CountIf(Z, "1/2 RH") / 2
    Set C1 Nothing: Set C2 Nothing: Set Z = Nothing
End Sub


Cette procédure est à appeler par :
Comptage "G7:NG7"
Il ne te reste plus qu'à automatiser l'appel à cette procédure en fonction de tes lignes.
On peut éviter l'usage de C1 et C2 (compteurs pour CA et RH) par exemple :
Z(1).Offset(0,-2).value=WorksheetFunc ...
On peut imaginer ensuite toute sorte d'amélioration mais c'est déjà un début.
Espérant t'avoir aidé.
Cdlt.
0
Rejoignez-nous