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

XL 2021 Besoin de conseils pour une sélection de multiples éléments

jeff1494

XLDnaute Occasionnel
Bonjour à toutes et tous;
J'ai fait un petit fichier qui me permet de mettre à jour au travers d'un formulaire des cellules contiguës dans une même colonne.
L'exemple est le suivant :

  • En colonne A un code représentant un N° d'ordre alpha numérique (par exemple Pers001, Pers002, ...).
  • En colonne B & C le prénom et le nom de la personne.
  • En colonne D la date de son arrivée.
  • En colonne E la date de son départ. C'est le contenu de cette colonne que je souhaite mettre à jour.
Ce que j'ai réalisé me permet de mettre à jour la date de départ de plusieurs personnes, pour autant qu'elles soient listées dans des lignes contigües.

Je voudrai pouvoir faire une sélection de manière complémentaire, dans une procédure séparée.

C'est à dire de pouvoir sélectionner plusieurs lignes dont la date de départ n'est pas renseignée, et qui ne sont pas contigües.
Par exemple la ligne 5 ainsi que la ligne 9, puis la ligne 12, et ainsi de suite.

Ma demande ne concerne pas le production d'un code VBA le faisant, car j'aime bien découvrir par moi même de nouvelles choses.
C'est plutôt d'avoir une (ou des) piste de recherche pour atteindre mon but, avec du VBA. J'essaie d'apprendre à mieux utiliser le VBA.

Par exemple j'ai vu quelque chose qui me plait bien (le contrôle "Listview"), mais je ne sais pas si il conviendrait à ce que je veux réaliser.
Je dois commencer à lire de la documentation sur ce contrôle.

Ce que j'ai imaginé sans même savoir si cela était possible, c'est d'avoir sur l'affichage du contrôle ''Listview", ou d'une manière similaire, la possibilité d'avoir une case à cocher pour chaque ligne dont la date de départ n'est pas renseignée. Et ainsi de sélectionner manuellement chaque ligne.

Encore une fois je ne sais pas si ce que pense est réalisable ou pas , et donc j'aimerais que vous puissiez me donner des voies de recherche.
Je joins mon fichier pour que celui ou celle qui aurait la gentillesse de me répondre puisse voir à quoi il ressemble.

Dans tous les cas je vous remercie par avance pour perdre de votre temps pour m'aider.
Je vous souhaite une bonne journée.
 

Pièces jointes

  • Date_personnes.xlsm
    25.6 KB · Affichages: 8

jeff1494

XLDnaute Occasionnel
Bonjour à vous deux, et merci pour vos réponses.

@vgendron : Concernant la disponibilité du contrôle ListView, je l'ai sur mon PC, et de toutes les façons ce petit développement n'a aucune vocation a être partagé.
C'est un petit besoin personnel, et je profite de ce besoin ponctuel pour essayer d'apprendre de nouvelles choses.
Je vais voir ce que vous me conseillez.
Bonne journée à vous.
 

jeff1494

XLDnaute Occasionnel
@jurassic pork :
Bonjour, et merci de m'avoir montrer les possibilités.
Je vois bien un formulaire, avec saisie de la date de départ, sélection des lignes désirées puis mise à jour des éléments sélectionnés.

Bon comme on dit Yfovoar et Y'a plusKa.
Je vais de ce pas chercher toute la doc possible sur les ListView.

bonne journée à toi.
A+
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour à tous ,

Si ce n'est pour s'entrainer (et ça je le comprends parfaitement ) je ne vois pas pourquoi sélectionner des lignes dans une listbox (avec le code à écrire) alors qu'on peut faire la même chose directement dans Excel sans code :
  • On sélectionne les cellules à la souris (avec la touche Ctrl appuyée pour sélection multiple)
  • Dans la barre de formule, on saisit la date de départ
  • On valide par les deux touches Ctrl+Entrée
  • Et hop! Toutes les cellules sélectionnées ont la même date de départ saisie
Pour suivre @vgendron, concernant les listview, évitez leur emploi qui n'est pas accessible à tout le monde. Préférez une listbox avec case à cocher (ça ne mange pas de pain).
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,

Pour voir ce qu'on peut faire, je me suis "amusé" :
  • Si on sélectionne une ou plusieurs cellules dans le tableau puis si on clique sur le bouton orange alors dans la listbox, les lignes correspondantes seront sélectionnées. Évidemment les lignes avec une date de départ seront retirées de la listbox. Si aucune ligne du tableau n'était sélectionnée alors bien sûr aucune ligne ne sera sélectionnée dans la listbox
  • Ensuite on sélectionne ou désélectionne les lignes de la listbox
  • On saisit la date (la vérification de la date se fait par une fonction personnalisée de mapomme)
  • Un clique sur le bouton du userform vient compléter les dates dans le tableau
Le code est protégé par un mot de passe pour que @jeff1494 ne soit pas tenté de le parcourir . Pour les autres un petit message privé et je donnerai le mot de passe.
 

Pièces jointes

  • jeff1494- Date_personnes- v1.xlsm
    34.7 KB · Affichages: 4

jeff1494

XLDnaute Occasionnel
Merci Mapomme ;
En effet ta solution fonctionne, mais comme tu le dis je souhaite progresser avec VBA et toutes les opportunités sont bonnes pour y arriver.
Dans tous les cas je te remercie pour ta réponse.
 

jeff1494

XLDnaute Occasionnel
Désolé @mapomme c'est une réponse que je n'avais pas envoyé.
Mais je regarde attentivement ton exemple.
C'est chouette car avec la proposition de @jurassic pork cela me fait 2 "devoirs de vacances" à faire.
Je vous remercie tous les deux pour vos propositions.
Je regarderai cela très vite et reviendrais vers vous.
A+ et encore merci.
 

jeff1494

XLDnaute Occasionnel
Bonjour à toutes et tous;
Bien j'ai commencé à avancer, et bien sûr je rencontre des soucis.
Cela n'est pas bloquant, mais juste énervant. J'aimerai résoudre cela avant de continuer mes recherches pour finaliser ce fichier.
Je charge presque correctement la ListBox.
En fait il me charge les lignes de détail, mais aussi les entêtes du tableau.
Or j'ai créé une ListBox pour contenir les entêtes du tableau, voir l'image.




J'ai bien essayé de regarder comment faire. J'ai modifier la valeur de départ de l'index de la boucle de chargement, mais alors j'ai un message d'erreur.
Avant d'aller plus loin j'aimerai bien résoudre ce problème, et donc je vous demande de l'aide pour le résoudre.

Les deux boutons ne font que de fermer le formulaire. Aucun autre code n'est développé pour l'instant.

Je vous joins le fichier Excel.
En vous remerciant par avance, cela me permettra de continuer à avancer et finaliser ce fichier par moi-même.

je vous souhaite une bonne journée à toutes et tous.
 

Pièces jointes

  • Date_personnes.xlsm
    32 KB · Affichages: 6

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @jeff1494 ,

Tout ceci est une d'indice...

Pour éviter la liste des titres dans la listbox, on commence la boucle de remplussage à 2 et pas à 1.

Un exemple de code :
VB:
Private Sub UserForm_Initialize()
Dim ws As Worksheet, i As Long, j As Long, LastRow As Long, ni As Long
 
  Set ws = Worksheets("Gestion")
   '   Mise en place des entêtes de colonnes
   ListBox1.ColumnCount = 5
   ListBox1.RowSource = "Gestion!A1:E1"
  
   LstBDates.Clear
   LstBDates.ColumnCount = 5
   LastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
   ' Remplissage ListBox
   For i = 2 To LastRow       ' depuis la ligne 2 (on saute la ligne des en-têtes)
      If ws.Cells(i, 1).Value <> vbNullString And ws.Cells(i, 5) = "" Then ' si le code n'est vide et si pas de date de départ
         LstBDates.AddItem ws.Cells(i, 1)    ' on ajoute la personne dans la liste
         ni = LstBDates.ListCount - 1        ' ni est le numéro de la ligne de List (le -1 car
                                             ' les indices de List commencent à 0 et non pas 1)
         ' on remplit les colonnes suivantes de List - indices 1 à 4
         ' l'indice de ligne de List est toujours ni
         ' la Valeur de la colonne j de Liste est la valeur de la feuille en ligne i et en colonne j+1
         For j = 1 To 4: LstBDates.List(ni, j) = ws.Cells(i, j + 1): Next
      End If
   Next i
End Sub
 

dysorthographie

XLDnaute Accro
Bonjour,
VB:
For i = 2 To LastRow
            If ws.Cells(i, 1).Value <> vbNullString Then LstBDates.AddItem ws.Cells(i, 1).Value
            If ws.Cells(i, 2).Value <> vbNullString Then LstBDates.List(LstBDates.ListCount - 1, 1) = ws.Cells(i, 2).Value
            If ws.Cells(i, 3).Value <> vbNullString Then LstBDates.List(LstBDates.ListCount - 1, 2) = ws.Cells(i, 3).Value
            If ws.Cells(i, 4).Value <> vbNullString Then LstBDates.List(LstBDates.ListCount - 1, 3) = ws.Cells(i, 4).Value
            If ws.Cells(i, 5).Value <> vbNullString Then LstBDates.List(LstBDates.ListCount - 1, 4) = ws.Cells(i, 5).Value
    Next i
 

jurassic pork

XLDnaute Occasionnel
Hello,
A noter qu'avec une Listview , les en-têtes de colonnes sont gérés (voir mon message #5)
VB:
Private Sub UserForm_Initialize()
'Set some of the properties for the ListView
With Me.ListView1
    .HideColumnHeaders = False
    .View = lvwReport
End With

'Declare the variables
Dim rngData As Range,rngCell As Range, LstItem As ListItem
Dim RowCount As Long, ColCount As Long, i As Long, j As Long

'Set the source range
Set rngData = Range("PersonnesT")
'Add the column header
For Each rngCell In rngData.Rows(1).Cells
    Me.ListView1.ColumnHeaders.Add Text:=rngCell.Value, Width:=50
Next rngCell
'Count the number of rows in the source range
RowCount = rngData.Rows.Count
'Count the number of columns in the source range
ColCount = rngData.Columns.Count
'Fill the ListView
For i = 2 To RowCount
    Set LstItem = Me.ListView1.ListItems.Add(Text:=rngData(i, 1).Text)
    For j = 2 To ColCount
        LstItem.ListSubItems.Add Text:=rngData(i, j).Text
    Next j
Next i
ListView1.ListItems(1).Selected = False
Set ListView1.SelectedItem = Nothing
End Sub
Ami calmant, J.P
 
Dernière édition:

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…