Recherche et tri complexe sur les noms des feuilles. [Résolu]

zuli3n

XLDnaute Occasionnel
Bonjour le Forum,

J'ai une fois de plus besoin de vous, et j'espère vous expliquer correctement mon problème, j'avoue ce n'est pas évidant ... :rolleyes:

Je voudrais pouvoir, via un UserForm puis deux ComboBox, faire une recherche des noms de feuilles qui se trouvent dans mon classeur et y accéder.

Chaque feuilles à comme format de nom "Niveau X Séance Y" (X correspond au numéro des niveaux et Y correspond au numéro des séances.)

J'aimerais pouvoir lister dans la ComboBox1 "Niveau X" des feuilles, et dans la ComboBox2 "Séance X" des feuilles, sans avoir de doublons dans les ComboBox.

Dans l'exemple que je vous joins, j'ai pu via un bout de code faire 60% :)
Mais je n'arrive pas couper, comme je désir, le nom des feuilles et faire le trie puis l'affichage ....

Dans mon fichier d'exemple, mes feuilles qui servent de test sont cachées, mais via la ComboBox une fois sélectionnées le code VBA les rend accessibles. :p

Pourriez-vous s'il vous plait m'aider à faire ce tri dans mes deux ComboBox.

UserForm:
Code:
Private Sub UserForm_Initialize()
Dim i As Integer
For i = 2 To Sheets.Count
ComboBox1.AddItem Sheets(i).Name
Next
End Sub

Private Sub ComboBox1_Click()
Dim Sh As Worksheet
On Error Resume Next
Set Sh = Sheets(ComboBox1.Value)
If Err Then MsgBox "Feuille introuvable", 48: ComboBox1.DropDown: Exit Sub 'en cas d'entrée manuelle incorrecte
On Error GoTo 0
Sh.Visible = True 'en cas de feuille masquée
Sh.Activate
'--------------suite du code de validation
End Sub

Private Sub CommandButton1_Click()
Unload UserForm1
End Sub

Private Sub CommandButton2_Click()
Unload UserForm1
End Sub

En vous remerciant,
Cordialement.
 

Pièces jointes

  • zuli3n.xls
    94.5 KB · Affichages: 72
Dernière édition:

zuli3n

XLDnaute Occasionnel
Re : Recherche et tri complexe sur les noms des feuilles.

Re Hasco,

Ce n'est pas plutôt -> Remplacer 4 par 5 ??
Code:
With .SortFields
                .Clear
                .Add Key:=plg.Columns(2), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
                .Add Key:=plg.Columns(3), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
                .Add Key:=plg.Columns(5), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
            End With

Effectivement ça fonctionne correctement, merci, j'avoue j'étais passé à coté et c'est pas faute d'avoir regardé.

Merci à toi,
Cordialement.
 

zuli3n

XLDnaute Occasionnel
Re : Recherche et tri complexe sur les noms des feuilles.

Re,

Vu tout ce que tu dois avoir en tête car tu aide bcp membres de XDL, il est normale que tu te rappel pas à la lettre des codes que tu crées :)

En tout cas ça fonctionne vraiment bien et c'est plus rapide, cette nouvelle méthode, mais aussi plus complexe à comprendre :p
J'analyse encore le code ^^

Merci Hasco,
Cordialement.
 
G

Guest

Guest
Re : Recherche et tri complexe sur les noms des feuilles.

Re,

Le principe de base est simple
On part pas exemple de "Niveau 1ter Séance 200"

t=Split(Sh.name," ") donne :
T(0) ="Niveau"
T(1)= "1ter" '---->traitement spécial pour séparer le numérique et l'alphabétique.
T(2)="Séance"
T(3)="200"

On met donc ça dans des colonnes séparées de la feuille cachée (on pourrait se passer de la colonne 'Niveau' et la colonne "Séance" pour plus de clarté, je les ai laissées)

et on demande à excel de trier tout ça comme il sait bien le faire.

A+
 

zuli3n

XLDnaute Occasionnel
Re : Recherche et tri complexe sur les noms des feuilles.

Re Hasco,

J'ai eu une idée et je voulais savoir si cela est possible à faire avec la nouvelle méthode mise en place, qui est j'avoue plus claire mais pas plus simple à mon niveau :)

Je voudrais pouvoir utiliser une CheckBox dans l'UserForm qui servira une fois coché et le niveau choisi, cibler toutes les séances du niveau dans une variable ou autre, afin de pouvoir utiliser l'outil photo de Excel et me copier toutes les séances dans ma feuille principale via une boucle, genre :

Code:
Worksheets("Suivi").Range("A1").Select
Worksheets("Niveau 1b Séance 1").Range("A1:F14").CopyPicture
ActiveCell.Offset(3, 0).Activate
Worksheets("Suivi").Paste
Range("A1").Select

A ton avis Hasco est-ce possible?

Merci,
Cordialement.
 

Pièces jointes

  • zuli3n.checkbox.xlsm
    68.9 KB · Affichages: 32
G

Guest

Guest
Re : Recherche et tri complexe sur les noms des feuilles.

Re,

Oui bien-sûr mais je connais un peu ton projet, et il me semble que cela va vite tourner à l'usine à Gaz. On dirait que tu avances un peu "au pif" sans vraiment avoir arrêter des besoins précis.

Pour ma part, ce projet je le gèrerais sous access ou si tu n'as pas access, sous forme de tableaux reliés entre eux par des identifiants construits à partir des niveaux et séances. Une feuille pour les NiveauxSéance, et renseignements généraux sur la séance, une feuille pour les ex0 reliés aux NiveauxSéance par identifiants Etc....

Une fois les données construites en lignes le reste n'est plus qu'une question de présentation.

D'un côté gérer la création/modification/suppression des données et d'un autre la recherche et leur présentation sous diverses formes.


A+
 
Dernière modification par un modérateur:

zuli3n

XLDnaute Occasionnel
Re : Recherche et tri complexe sur les noms des feuilles.

Re,

Je savais ce que je voulais faire mais il est vrai que j'ai un peu "foiré" le coté possibilité pour les niveaux et séances :)

C'est le "Final" pour mon projet, la dernière chose à faire, car il peut être utile d'avoir toutes les séances d'un niveau sur la même feuille.

Je n'ai pas de licence pour Access et je t'avoue Access est encore plus "Usine à gaz" et inconnu pour moi :)
J'ai choisi Excel car je l'ai de dispo via ma licence de ma boite, et surtout ça me donne l'occasion d'apprendre car c'est super utilise de connaitre ce logiciel autre qu'en lecture de fichier ... Et j'avoue j'ai pu découvrir le VBA et ca me plait vraiment :)

J'ai construis mon fichier avec les besoins de la méthode Lafay et via ma "petite" imagination. Je trouve aussi que ça fait usine à gaz mais le résultat me convient :p

Tu me dis que c'est faisable, je vais donc me lancer dans cette idée et pas perdre mon temps sur une chose qui est infaisable ...
La semaine va être dur, je ne sais pas par ou commencer :p

Merci à toi Hasco, je te tiens au courant,
Cordialement.
 
Dernière édition:

zuli3n

XLDnaute Occasionnel
Re : Recherche et tri complexe sur les noms des feuilles.

Bonsoir Hasco, le Forum,

J'essaie de trouver des pistes pour l'idée du rajout de la CheckBox.

J'ai remarqué que le ComboBox2 rempli son Item avec tous les séances du niveau choisi via :
Code:
ComboBox2.AddItem plg.Cells(idx, 2)
   idx = idx + 1
Loop While plg.Cells(idx, 1) = Niveau
De quelle façon je peux me servir de l'Item de la ComboBox2 (qui répertorie toutes les séances du niveau choisi) pour lancer une boucle sur toutes ces séances pour utiliser l'outil photo ?

++
Cordialement.
 
G

Guest

Guest
Re : Recherche et tri complexe sur les noms des feuilles.

Bonjour,

De mémoire, pour reconstituer les noms de feuille d'un niveau (avec toutes les séances):

Code:
Dim i as integer
Dim Niveau as string, NomFeuille as string
Niveau =Combobox1.Value
For i=0 to Combobox2.listCount
      NomFeuille = Niveau & " " & Combobox2.list(i)
next i

Dans fichier joint

Propriétés Combobox2
Columncount=2 'nombre de colonne
BoundColumn=1 'colonne qui contiendra la valeur (Nom complet de la feuille) (son index pour une boucle sera 0)
ColumnWidth = 0 pt; 'Première colonne cachée

Autre moyen avec deux colonnes dans combobox2 dont la première est cachée (Columnwidth=0) et qui contient le nom de la feuille reconstitué. A chaque fois que tu auras besoin du nom complet de la feuille tu pourras faire NomFeuille=Combobox.Value ou dans une boucle NomFeuille=ComboBox2.List(i, 0) ou simplement ComboBox2.List(i)

La boucle plus haut devient dans la nouvelle formule:

Code:
Dim NomFeuille as string

For i=0 to Combobox2.listCount
NomFeuille =Combobox2.list(i)
next i
.
A+
 
Dernière modification par un modérateur:

zuli3n

XLDnaute Occasionnel
Re : Recherche et tri complexe sur les noms des feuilles.

Bonjour Hasco, le Forum,

Je viens tout juste d'arrivé dans ma chambre d'hôtel (cette semaine je suis en déplacement) sur Toulouse, je n'ai pas encore regardé, mais je vois que tu es encore en ligne et j'en profites pour te remercier.
Je prépare ma journée de demain et après j'ai toutes ma soirée pour regarder cela, je te remercie, j'ai hâte de voir cela.

Merci ++
Cordialement.
 

zuli3n

XLDnaute Occasionnel
Re : Recherche et tri complexe sur les noms des feuilles.

Bonsoir Hasco,

Je ne comprends pas la boucle que tu me propose, j'ai regardé les modifications que tu apporte dans ton fichier joint, et durant mes essais et analyses, j'ai l'impression que je me suis mal expliqué... ou que je suis complètement dans le vent :)

En fait je voulais savoir comment je peux récupérer toutes les séances du niveau choisi dans ComboxBox1, en ayant la checkbox1 de coché (checkbox1 désactive la ComboBox2).
Je crois comprendre que dans ta dernière réponse sur le fil, tu me propose une boucle pour avoir le nom complet de la feuille.

Je fatigue, je vais relire pour la 20ème fois ton dernier message en étant bien reposé, demain soir.

Je joins un fichier d'exemple avec des commentaires dans CommandButton1_Click, afin que tu me dise si on s'est compris.
(Je n'ai pas intégré tes modifications dans celui la)

Merci de ta patience Hasco.

++
Cordialement.
 

Pièces jointes

  • zuli3n_CheckBox2.xlsm
    65.4 KB · Affichages: 32
G

Guest

Guest
Re : Recherche et tri complexe sur les noms des feuilles.

Bonjour,

Je t'ai montré comment boucler de plusieurs façon sur les combobox ou la source des données, a toi de faire tes essais et d'apprendre. Je ne vais pas tout te mâcher, d'autant plus que dans feuille NiveauxSéances, il y a deux colonnes avec les noms de niveau et les noms de séance.

A+

A+
 

zuli3n

XLDnaute Occasionnel
Re : Recherche et tri complexe sur les noms des feuilles.

Bonjour Hasco,

Pas de souci, je vais y arrivé, c'est juste que hier j'étais dans le gaz et je captais rien, puis j'avais un doute si tu avais bien compris mon idée. Je regarde cela, je te tiens au jus.

++
Cordialement
 
Dernière édition:

zuli3n

XLDnaute Occasionnel
Re : Recherche et tri complexe sur les noms des feuilles.

Bonsoir Hasco, le Forum,

Je recherche des infos pour pouvoir mettre en place ma boucle avec le CheckBox.
Tu m'as donné les propriétés du ComboBox2 à mettre en place, dois-je utiliser : ComboBox2.RowSource ??
Je me pose aussi une question, surement bête, je suppose que je dois mettre tout ça dans la partie :
CommandButton1_Click() via un : If CheckBox1.Value = True ?? (en analysant via le pas-à-pas je pense que c'est la meilleur place...)

Dur dur ton devoir :)

++
Cordialement.
 
G

Guest

Guest
Re : Recherche et tri complexe sur les noms des feuilles.

Re,

Puisqu'il faut tout faire, mais c'est la dernière fois. Ce qui a changé:

1- combobox2.CLear : il ne faut pas nettoyer la combobox2 quand checkbox = true. Comme ça elle contiendra le nom des séances du niveau sans que l'utilisateur puisse en sélectionner une.

2- les conditions pour que le bouton soit 'enabled'

3- la boucle dans CommandButton1_Click

Code:
Private Sub CheckBox1_Change()
    If CheckBox1.Value = True Then
        ComboBox2.Enabled = False
        CommandButton1.Enabled = True
    End If
    If CheckBox1.Value = False Then
        ComboBox2.Enabled = True
        CommandButton1.Enabled = False
    End If
End SubPrivate Sub ComboBox1_Change()
    CommandButton1.Enabled = ComboBox1.ListIndex > -1 And (ComboBox2.ListIndex > -1) * Not CheckBox1
End Sub
Private Sub ComboBox2_Change()
'Autorise le bouton ok uniquemment si les 2 combobox ont une sélection
    CommandButton1.Enabled = ComboBox1.ListIndex > -1 And (ComboBox2.ListIndex > -1) * Not CheckBox1
End Sub

CommandButton1_Click, je n'ai fait que la boucle à toi de faire le reste pour les pictures sur chaque feuille
Code:
Private Sub CommandButton1_Click()
    Dim Sh As Worksheet
    If CheckBox1.Value = True Then
        Dim Niveau As String
        Dim i As Integer
        Niveau = ComboBox1.Value
        For i = 0 To ComboBox2.ListCount - 1
          Set Sh = Sheets(Niveau & " " & ComboBox2.List(i))
        'Travail sur la feuille x
        Next
    Else
        'Parcourt les feuilles, cachent celles dont le nom de correspond pas aux combobox et affiche celle qui correspond
        For Each Sh In ThisWorkbook.Worksheets
            If Sh.Name Like "Niveau*" Then
                Sh.Visible = Sh.Name = Trim(ComboBox1.Value) & " " & Trim(ComboBox2.Value)
                If Sh.Visible Then Sh.Activate
            End If
        Next
    End If
    Unload UserForm1
End Sub

Si tu as du mal avec les Pictures, crées un nouveau fil. J'ai largement répondu à la question initiale, hors de question que petit à petit tu me fasses faire ton application. Adresses-toi à un professionnel pour avoir une appli clef en main.

A+
 
Dernière modification par un modérateur:

Discussions similaires

Réponses
6
Affichages
246

Statistiques des forums

Discussions
312 216
Messages
2 086 348
Membres
103 194
dernier inscrit
rtison