Généraliser des formules

Bonjour

Grace à Bouben (un contributeur de ce forum), j'ai pu avancer dans un projet personnel.

Voir le fil dans

https://forum.excel-pratique.com/excel/listing-selectif-t69795.html

Je reprends la substance de mon dernier post.

Dans les feuilles CRS1 et CRS2. J'ai donc fait deux boutons :

*Un bouton qui affiche l'heure de départ

*Un bouton qui affiche les arrivées au fur et à mesure.

J'ai mis du code dans chacune des feuilles.

J'ai essayé d'inclure des tests mais il ne marchent pas bien (exemple, si le départ n'a pas été donné, on ne devrait pas pouvoir saisir d'arrivée)... En fait, je pense qu les macros ne marchent pas bien car les variables compteur et DépartDonné sont mal définies et présentent dans les deux feuilles.

De même, la fonction effaçage [présente dans un module] ne remets pas à zéro la variable compteur ... Il doit y avoir un problème de variable.

En fait, j'aimerais pouvoir basculer tout le contenu du code de la feuille CRS1 (et CRS2 ...) dans les modules, comme cela je pourrais copier autant de fois les feuilles CRS1 en CRSn

Mais je m'y perds dans les variables (compteur, Départ Donné) à faire passer en private ou autre. Qui peut m'aider ?

Merci de ton aide

Bonsoir,

J'essaie de regarder ça ce week-end !

Bouben

Bonjour,

Comme promis, de retour !

Bon, j'ai regardé. En fait, c'est un peu (beaucoup) plus compliqué que cela.

Toute est une question de portée des variables.

Le problème : si tu as une variable publique "toto" dans un module, que tu modifies cette variable depuis une feuille 1 et ensuite depuis une feuille 2, tu ne peux plus connaître la valeur que tu avais affectée depuis la feuille 1 (elle a été écrasée).

Chaque course doit donc avoir ses variables.

Bref, j'ai revu toute l'architecture.

- un objet "Course" contient toutes fonctions pour une course (Depart, Arrivee, EffacerResultat)

=> cet objet connaît l'onglet correspondant "moShCourse" (en privé), initialisé via la sub

'associe l'onglet à la course
Public Sub AssocierOnglet(poSh As Worksheet)
    Set moShCourse = poSh
End Sub

- toutes les courses sont regroupées dans une collection (publique)

Public gColCourses As Collection 

- la course est ajoutée dans la collection lorsqu'on arrive sur l'onglet

Private Sub Workbook_SheetActivate(ByVal Sh As Object)

Aperçu :

'instanciation d'un objet "Course" si pas encore existant
        Set oCourse = New clsCourse
        oCourse.AssocierOnglet ActiveSheet
        'ajout dans la liste des courses
        'clé : nom de l'onglet
        gColCourses.Add oCourse, ActiveSheet.Name

- Et toutes les actions associées aux boutons sont en public dans un module

Public Sub BoutonArrivee()
    gColCourses(ActiveSheet.Name).Arrivee
End Sub

Public Sub BoutonDepart()
    gColCourses(ActiveSheet.Name).Depart
End Sub

Public Sub BoutonRAZ()
    gColCourses(ActiveSheet.Name).EffacerResultats
End Sub

Pour ajouter un nouvel onglet avec une nouvelle course : il suffira de dupliquer une feuille existante.

Pour modifier, ajouter une fonctionnalité (vBA) : tout faire dans l'objet "clsCourse", qui connaît son onglet associé :

Private moShCourse As Worksheet 'onglet de la course

J'espère que les explications sont claires, sinon je peux détailler sur des points précis.

A analyser et à tester !

Bonne journée !

Bouben

En fait, je n'ai pas tout compris !!!! Les collections, cela ne me parle pas, mais ce n'est pas grave.

J'ai du mal aussi à rentrer dans ta nomenclature des noms, mais là aussi, ce n'est pas grave.

Merci pour le temps que tu as passé.

Petit bug néanmoins.

J'ouvre le fichier, je copie l'onglet CRS1 en CRS1 (2) .. C'est ok

Mais si je le renomme en CRS3, et que je lance le départ sans changer d'onglet, cela bug (Erreur 5)..

Si je change d'onglet et je reviens sur CRS3, c'est ok ...

Ce n'est pas dramatique ...

Merci encore ...

Bonsoir,

Pour le bug, effectivement, lorsque un nouvel onglet vient d'être créé, cela ne marchera pas.

Mais fonctionnera à la prochaine ouverture, ou lors du changement d'onglet.

Pour la nomenclature, ci-joint un petit doc commencé il y a quelques temps, qui peut aider à me comprendre

Bonne soirée

Bouben

Bonjour

Je viens de faire mon cross et tout à marché nickel ... Merci pour ton aide.

Je me suis aperçu qu'il me manquait un test. En effet, si je rentre dans une course un dossards 2 fois, je ne le sais pas ..

Je suis donc en train de chercher à développer cela, à savoir un test qui compare le contenu de la cellule active avec les cellules précédente dans la colonne.

Dans la feuille CRS1, j'ai donc écrit le code suivant, mais cela ne marche pas.

>>>>>>>>>>>>>>>>>>>>>>>>

'Cet événement se déclenche à chaque modification du contenu d'une cellule de cette feuille

Private Sub WorkSheet_Change(ByVal Target As Range)

Dim Cellule_de_Travail As Range

Dim lig As Long

Dim lig_test As Long

Dim col As Long

Set Cellule_de_Travail = Target

If Target.Count > 1 Then Exit Sub 'Si plus d'une cellule est sélectionnée, on sort

If Not Intersect(Target, Range("C3:C133")) Is Nothing Then

lig = Target.Row 'Stocke le numéro de ligne correspondante

col = Target.Column 'Stocke le numéro de colonne correspondante

lig_test = lig - 1 'calcul ligne - 1 pour arreter le test

For i = 3 To lig_test

If Cellule_de_Travail.Value = Cells(i, col).Value Then ' 'Si la valeur de la cellule de travail est déjà présente dans la plage précédente

Cellule_de_Travail.Interior.ColorIndex = 3 'le fond de la cellule devient rouge

Else

Cellule_de_Travail.Interior.ColorIndex = 27 'le fond de la cellule devient jaune (c'est la couleur de base)

End If

Next

End If

End Sub

>>>>>>>>>>>>>>>>>>>>>>>>>>>

Peux tu m'aider ?

Merci

Bonsoir,

Ci-joint une proposition de code, à tester.

Les modifications sont indiquées "'V0.7" / "V0.7-fin"

=> ajout d'une procédure dans ThisWorkBook :

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

=> ajout d'une procédure dans modMain :

Public Sub VerifDossardUnique(poSh As Worksheet, poCellSaisie As Range)

A reporter dans ta version, et modifier les couleurs (à priori la couleur de base dans ta version est jaune, la mienne était grise) ;

Ces 2 couleurs sont définies en constantes dans le code, à modifier si besoin :

    Const L_COUL_GRIS As Long = 14935011
    Const L_COUL_ROUGE As Long = 255

A ta dispo si besoin !

Bonne soirée

Bouben

Bonsoir

Merci pour tout. Je vais voir cela ...

Pourrais tu me dire ce qui cloche avec le code que j'ai développé ? J'aime bien comprendre ...

Merci

Bonjour,

ceci peut être

(mais bouben répondra surement )

Private Sub Worksheet_Change(ByVal Target As Range)

Dim lig As Long

Dim lig_test As Long

Dim col As Long

Set Cellule_de_Travail = Target

If Target.Count > 1 Then Exit Sub 'Si plus d'une cellule est sélectionnée, on sort

If Not Intersect(Target, Range("C3:C133")) Is Nothing Then

lig = Target.Row 'Stocke le numéro de ligne correspondante

col = Target.Column 'Stocke le numéro de colonne correspondante

lig_test = lig - 1 'calcul ligne - 1 pour arreter le test

For i = 3 To lig_test

If Cellule_de_Travail.Value = Cells(i, col).Value Then ' 'Si la valeur de la cellule de travail est déjà présente dans la plage précédente

Cells(i, col).Interior.ColorIndex = 3: Cellule_de_Travail.Interior.ColorIndex = 3 'le fond de la cellule devient rouge

End If

Next

End If

End Sub

Bonsoir à tous ,

patrick1957 a écrit :

ceci peut être

(mais bouben répondra surement )

En fait, j'avais la flemme de chercher l'erreur, sans fichier en PJ. Dans ce cas, c'est plus rapide de recoder ...

Bon, vue la pression j'ai dû mettre le nez dans ce code ...

Ca doit être ça, je crois bien

Allez, bonne nuit ...

Bouben

Hello

En fait, il se passe un truc bizarre :

Si je prends le fichier Cross... projet v0.6 (QUI EST DANS UN POST PRECEDENT) et que je copie le code suivant :

>>>>>>>>>>>>>>>>>>>>

Private Sub Worksheet_Change(ByVal Target As Range)

Dim lig As Long

Dim lig_test As Long

Dim col As Long

Set Cellule_de_Travail = Target

If Target.Count > 1 Then Exit Sub 'Si plus d'une cellule est sélectionnée, on sort

If Not Intersect(Target, Range("C3:C133")) Is Nothing Then

lig = Target.Row 'Stocke le numéro de ligne correspondante

col = Target.Column 'Stocke le numéro de colonne correspondante

lig_test = lig - 1 'calcul ligne - 1 pour arreter le test

For i = 3 To lig_test

If Cellule_de_Travail.Value = Cells(i, col).Value Then ' 'Si la valeur de la cellule de travail est déjà présente dans la plage précédente

Cellule_de_Travail.Interior.ColorIndex = 3: Exit Sub 'le fond de la cellule devient rouge

Else: Cellule_de_Travail.Interior.ColorIndex = 27 'le fond de la cellule devient jaune (couleur de base)

End If

Next

End If

End Sub

>>>>>>>>>>>>>>>>

Cela marche... La cellule en doublon devient rouge et sinon, elle reste jaune ...

Et si dans une cellule Rouge, je tape un nombre qui n'est pas doublon, elle redevient jaune (ce qui est normal).

Je prends le meme code, je le copie dans mon vrai fichier, et il me dit qu'il y a une erreur 1004 sur la ligne

>>>

Else: Cellule_de_Travail.Interior.ColorIndex = 27 'le fond de la cellule devient jaune (couleur de base)

>>> Et il met en jaune à partir des deux points ...

Une idée ... pour que je comprenne (je ne peux pas mettre mon fichier réel) mais il n'y a pas d'autres code sur la page CRS1.

En fait, je suis content d'avoir développer un truc qui marche dans un fichier, mais pourquoi pas dans l'autre ?

Merci

Bonsoir,

Je n'ai pas winrar ... Possible de le passer en .zip ?

Bouben

pardon, j'ai remplacé le fichier..

En fait, le fichier que j'ai mis en ligne, c'est là ou ça marche ...

C'est quand je copie le meme code dans mon fichier que cela bug ...

Avec le nouveau fichier, je n'ai pas de problème ...

Tout marche bien

Donc c'est réparé

bouben a écrit :

Avec le nouveau fichier, je n'ai pas de problème ...

Tout marche bien

Donc c'est réparé

Non, en fait tu ne comprends pas. Effectivement tout marche bien dans ce fichier ... Mais si je recopie le code dans mon VRAI fichier, cela ne marche plus ...

En fait, compressé, mon fichier fait 900 ko ... donc je ne peux pas le mettre en pièce jointe.

Bonsoir,

J'ai reproduit la même erreur : en protégeant la feuille. Vraiment une idée par hasard.

Piste possible ?

Sinon, honnêtement, je ne vois pas ...

Alors espérons que ce soit ça !

Bonne soirée

Bouben

PS : mon précédent post était de l'humour

Désolé, je n'ai pas compris que c'était de l'humour.

Effectivement, cela vient de la protection de la feuille. j'y ai pensé il y a qq minutes mais je n'ai pas eu le temps de faire le test que tu avais déjà répondu.

Dans ma feuille, la colonne dossard n'est pas verrouillée, la colonne des temps (arrivée) non plus, ni la distance, ni l'heure de départ..

Mais tout le reste oui .

Bizarre... J'ai du mal a comprendre pourquoi ...

Merci pour tout ..

Bonsoir,

Par défaut, lors d'une protection, plein de choses sont verrouillées sur la feuille (même si la cellule est dé-déverrouillée)

Pour que ça fonctionne, il faudrait cocher la case "Format de cellule".

cf copie écran en PJ

Enfin, à tester

Bonne soirée

Bouben

protection

Ca marche ...

Merci

Rechercher des sujets similaires à "generaliser formules"