Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2019 VBA newbie

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

apocalypse

XLDnaute Nouveau
Bonjour,

J'essaie de mettre en place une gestion d'équipe pour le club auquel j'appartiens à travers un fichier excel.
N'étant pas un grand utilisateur d'Excel je découvre peu à peu ses fonctionnalités donc j'espère que vous serez indulgent avec moi 😉.

Je vous explique rapidement ce que j'ai fait et souhaite faire:
- la feuille Liste des joueurs contient les joueurs du club que je peux ajouter dans des équipes
- la feuille Gestion permet d'ajouter les joueurs dans des équipes, à travers cette feuille je veux aussi montrer à l'utilisateur si il peut ou non ajouter certains joueurs dans certaines équipes
- la feuille Param permet de mettre en place des paramètres (nombre de joueur par équipes, nombre de joueurs qui sont en dehors de l'UE par équipes...)
- la feuille Règles permet de mettre en place certaines règles qui permettent ou non d'ajouter des joueurs dans l'équipe

Actuellement dans la feuille Gestion j'ai "réussi" à mettre en place la règle "nombre de joueur par équipes" à travers des cellules qui passent au vert quand le nombre de joueurs dans l'équipe est correct.
Je dis réussi car comme vous pouvez le voir dans un autre post et dans la feuille que je partage j'ai bidouillé car la formule ne semble pas fonctionner dans la mise en forme des cellules sans passer par une cellule intermédiaire.

Maintenant je que je vous ai expliqué mon besoin voici mon problème : je pensais que je pourrais faire tous mes tests via des formules Excel mais force est de constater que cela s'avère plus compliqué qu'attendu, et je pense que je vais devoir faire un peu de VBA.

Autant pour les tests numérotés 1 et 5 cela me paraît simple sans passer par du VBA, autant pour les tests 2-3-4 cela me semble impossible ou alors très compliqué.
Pour le moment je m'attaque au test numéro 2 mais si vous avez des indications pour les autres tests je suis preneur.
Donc pour le test numéro 2 "Test du nombre de joueurs hors EU dans l'équipe" je voyais cela comme cela :
- récupérer la liste des licences des joueurs qui sont sélectionnés, puis vérifier si ces joueurs sont hors EU

Malheureusement mes compétences en VBA sont quasi nulles, comme vous pouvez le voir dans les macro j'ai essayé de faire une macro pour parcourir toutes les checkbox de la feuille active mais cela ne fonctionne pas : le code ne rentre jamais dans la boucle For...

VB:
Sub ListerCheckboxClicked()

    Dim obj As OLEObject
    Response = MsgBox("test", vbOK, "MsgBox Demonstration", "DEMO.HLP", 1000)
    
    For Each obj In ActiveSheet.OLEObjects
        Response = MsgBox(obj.Name + " " + obj.Index, vbOK, "MsgBox Demonstration", "DEMO.HLP", 1000)
        If TypeOf obj.Object Is msforms.CheckBox Then
            Response = MsgBox(obj.Name + " " + obj.Index, vbOK, "MsgBox Demonstration", "DEMO.HLP", 1000)
            obj.Object.Caption = "test"
        End If
    Next obj
    
End Sub

De plus si je dois faire du VBA pour un test autant tout tester en VBA, qu'en pensez-vous ?
 

Pièces jointes

Solution
Bonjour apocalypse, le forum,

En effet il faut corriger le 4ème test comme suit :
VB:
        '---4ème test sur le brûlage (cas d'un joueur ayant joué 2 fois dans une équipe supérieure)---
        Set plage1 = .Cells(-2, 4).Resize(, col - 3) 'ligne des équipes
        Set plage2 = .Cells(lig, 4).Resize(, col - 3)
        If Application.CountIf(plage2, rep) > 1 Then
            For i = 1 To plage2.Count
                If plage2(i) = rep Then ReDim Preserve a(n): a(n) = plage1(i): n = n + 1
            Next i
            i = Application.Small(a, 2) 'PETITE.VALEUR
            If equipe > i Then
                ac.Interior.Color = RGB(121, 15, 2) 'colore en rouge
                MsgBox joueur + " doit être au moins dans l'équipe " & i &...

Pour information je peux récupérer l'adresse de la checkbox comme ceci : obj.TopLeftCell.Offset(0).Address
 
Les fausses cases à cocher sont très simples, elles utilisent un seul caractère dans chaque cellule.

J'ai posé une question au post #21 merci d'y répondre.
Je n'ai pas compris le principe de faire des fausses case à cocher, j'ai fait le test et réussi à les utiliser et c'est top niveau esthétique. Mais du coup je n'ai pas d'objet sur lesquels naviguer de manière automatique et générique.

Je ne suis pas chez moi donc difficile de répondre pour le moment mais je suppose que ce sont les checkbox qui sont à cet espace: comme je le disais il y a 6 équipes qui jouent 7 journées de championnat.

Pour le moment je n'ai fait que pour 2 journées donc il y a J1 et J2, c'est pour cela que c'est doublé.
 
Naviguer ??? Il suffit de cliquer sur une cellule pour afficher ou effacer la coche !
Je parle de navigation d'objet dans le code VBA.
En utilisant les checkbox classique je peux boucler sur toutes les checkbox, récupérer la position de celles cochées et récupérer les informations des joueurs sélectionnés.

En utilisant votre méthode j'ai l'impression que je ne peux pas faire quelque chose de générique comme cela, je vais devoir utiliser les positions des cellules en dur dans le VBA pour récupérer les valeurs ce qui est assez restrictif.
 
Bonsoir à tous,
Petite inquisition avant d'aller au lit...

Il existe les champs nommés sous Excel, On définit un plage et on boucle dessus; Où est le problème ?
Le problème est que je découvre Excel et VBA donc je n'ai sans doute pas la bonne approche d'où mon post 🤣.

Mon souhait de base est d'effectuer des vérifications à travers quelques tests/règles sur la composition des équipes.

Par exemple quand je sélectionne un joueur dans l'équipe 2 pour la journée 1, mon code VBA check si le joueur peut être sélectionné et affiche dans une cellule le résultat (test si le nombre de joueurs dans l'équipe est ok, test si le nombre de joueurs dans l'équipe hors eu est ok, test si le joueur n'a pas déjà été sélectionné dans une autre équipe pour la même journée, test si le joueur n'a pas déjà joué 2 fois dans une équipe inférieure, test si le nombre de points du joueur lui permet d'être sélectionné)

Je voulais rendre effectuer ces vérifications le plus souple possible, c'est-à-dire ne pas figer la plage de données à par exemple L21 à L33 car le nombre de journées ou de joueurs peut évoluer et je ne veux pas avoir à faire évoluer le code VBA en fonction des data présentes.
Dis comme ça j'ai l'impression que c'est un faux problème car en VBA je dois sans doute pouvoir boucler sur le tableau et identifier la journée/équipe sur laquelle je fais la vérification 🤔.
À voir car je ne sais même pas si dans ma feuille "Gestion" j'ai bien un tableau propre et facilement gérable avec VBA.

Bref je suis ouvert à toute aide et proposition pour effectuer ces tests 😋.
 
Bonjour apocalypse, le forum,

Voyez le fichier joint et la macro de la feuille "Gestion" :
VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim rep$, ac As Range, lig&, licence&, points&, col%, equipe%, division$, r1 As Range, r2 As Range, i&, horsEU%
rep = "ü" 'caractère Wingdings pour la coche
Set ac = ActiveCell
With [Tableau8] 'tableau structuré, à adapter
    If Intersect(ac, .Columns(4).Resize(, .Columns.Count - 3)) Is Nothing Then Exit Sub
    lig = ac.Row - .Row + 1
    licence = .Cells(lig, 1)
    points = .Cells(lig, 3)
    col = ac.Column - .Column + 1
    equipe = .Cells(-2, col)
    division = .Cells(-1, col)
    If ac = "" Then
        '---1er test---
        Set r1 = [Tableau5] 'tableau structuré
        If Application.CountIf(.Columns(col), rep) = Application.VLookup(division, r1.Columns(1).Resize(, 2), 2, 0) _
            Then MsgBox "L'équipe " & equipe & " est complète...": GoTo 1
        '---2ème test---
        Set r2 = [Tableau1] 'tableau structuré
        If Application.VLookup(licence, r2.Columns(3).Resize(, 4), 4, 0) = rep Then
            For i = 1 To .Rows.Count
                If .Cells(i, col) = rep Then If Application.VLookup(.Cells(i, 1), r2.Columns(3).Resize(, 4), 4, 0) = rep Then horsEU = horsEU + 1
            Next i
            If horsEU = Application.VLookup(division, r1.Columns(1).Resize(, 3), 3, 0) Then MsgBox "Le maximum de joueurs hors EU est atteint...": GoTo 1
        End If
        '---3ème test---
        If Application.CountIf(Intersect(.Cells(-3, col).MergeArea.EntireColumn, ac.EntireRow), rep) _
            Then MsgBox "Ce jour se trouve déjà dans une autre équipe...": GoTo 1
        '---5ème test---
        If points < Application.VLookup(division, r1.Columns(1).Resize(, 4), 4, 0) Then MsgBox "Ce joueur n'a pas les points requis pour cette division...": GoTo 1
    End If
End With
ac = IIf(ac = "", "ü", "")
1 [B14].Select 'la colonne B est masquée
End Sub
Je ne sais pas comment écrire le code du 4ème test car je n'ai pas compris ce que vous voulez.

A+
 

Pièces jointes

Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
1
Affichages
243
Réponses
5
Affichages
1 K
Réponses
2
Affichages
589
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…