Choisir, dans une ListBox, le nom de la feuille à activer

Bonsoir,

Je suis débutant en VBA, et tout nouveau sur ce forum. J'ai un problème sur lequel je butte depuis de nombreuses heures, et malgré mes recherches, je ne trouve pas la solution.
Je travaille sur un classeur qui comportera environ 80 feuilles. C'est un fichier qui permettra de stocker les résultats de tests de lecture d'élèves de CP et CE1. Par soucis d'esthétique, je fais en sorte que les feuilles ne soient pas visibles, et tout se fait par l'intermédiaire de UserForm, les feuilles me servant de bases de données.

Description de mon problème:

Une feuille contient la liste de tous les élèves. Une listbox permet de sélectionner un élève à partir de cette liste. Il s'agit ensuite d'activer la feuille dont le nom est le nom de l'élève sélectionné, afin d'y inscrire ses résultats par l'intermédiaire d'une UserForm.
Mais : dans toutes les procédures que j'ai consultées faisant référence au nom d'une feuille, celui-ci est entre guillemets. Cependant, il me faut utiliser une variable en tant que nom de feuille, ce que je ne parviens pas à faire.

Merci à toutes celles et/ou tous ceux qui pourront m'aider, soit en m'apportant la solution, soit en m'orientant vers une autre méthode.

Bonsoir,

Un petit fichier surtout anonymisé serait le bien venu
A+

Bonjour

Je propose de créer une nouvelle feuille pour y lister toutes les feuilles

Puis, on remplira la listbox en une ligne

Listbox1.List = Range(listsheets()).Value

Ou

Listbox1.list = Range(CreateIndexSheet)

A tester et à corriger au besoin

Function listsheets()
Dim i as integer

Activeworkbook.worksheets.Add
ActiveSheet.name = "index"
for i=1 to worksheets.Count
If Worksheets(i).name<> "index" then Worksheets("index").Range("A" & cstr(i)) = worksheets(i).name
Next

Listsheets = "index!A1:A" & cstr(worksheets.count -1)
End functionFunction CreateIndexSheet()
    Dim wSheet As Worksheet
    ActiveWorkbook.Sheets.Add(Before:=Worksheets(1)).Name = "index"
    Range("A1").Select
    Application.ScreenUpdating = False
    For Each wSheet In Worksheets
        ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", SubAddress:="'" & wSheet.Name & "'" & "!A1", TextToDisplay:=wSheet.Name
        ActiveCell.Offset(1, 0).Select
    Next
    Range("A1").EntireColumn.AutoFit
    Range("A1").EntireRow.Delete
    Application.ScreenUpdating = True
CreateIndexSheet = "index!A1:A" & Cstr(ActiveSheet.Sheets(ActiveSheets.rows.count,1).End(xlUp).Row)
End Function

Dans la feuille 'index' ajouter ceci

Private Sub Worksheet_Change(ByVal Target As Range)
    On Error Resume Next
    If Not (Application.Intersect(Range("A1"), Target) Is Nothing) Then _
        ThisWorkbook.Sheets(Target.Value).Activate
End Sub

On peut ainsi depuis la feuille Index atteindre n'importe quelle feuille du classeur

bonjour FredPit, salut scraper,

Juste une question, des actions comme Sheets.add, Select, etc, je pense que cela n'est pas permis. Une macro serait mieux. Mais, c'est possible que je me trompe.

Bonjour

Autre méthode, puisque le nom de la feuille est égale au nom de l'élève :

En supposant que le choix de l'élève se fasse sur un Formulaire VBA

On charge la listbox lors de l'affichage du formulaire

Private Sub UserForm_Initialize()
' Ouverture du formulaire :
' On charge la ListBox1 avec la liste des élèves
Dim Plage As Range
With Sheets("Feuil1") ' ** Changer par le nom de la feuille où sont stockés les noms d'élèves
    Set Plage = .Range("A1:A" & .Range("A65536").End(xlUp).Row) ' ** Colonne à modifier si besoin
    Me.ListBox1.List = Plage.Value
End With
Set Plage = Nothing
End Sub

Ensuite si Double click sur un item, on affiche la feuille

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
' Clic dans la liste

Dim a$, i As Integer

a$ = Me.ListBox1.Value ' Sélection

' On active la feuille (Nom de feuil = nom élève)
On Error Resume Next
With Worksheets(a$) ' Err si absente
    .Visible = True ' Affiche si masquée
    .Activate
End With
i = Err.Number
On Error GoTo 0

If i <> 0 Then
    MsgBox "La feuille " & a$ & " n'existe pas", vbCritical
Else
    MsgBox "La feuille " & a$ & " est affichée", vbOKOnly
    Unload Me ' Ferme
End If

End Sub

A mettre au point selon ta programmation

Bonne journée

Eric

Bonjour à tous.

Merci de cette réponse rapide. Pour le fichier joint, il est en cours de réalisation, et n est pas fonctionnel, car mon problème a "bloqué" son développement. Je vais m'intéresser à la solution proposée, ce qui me prendra sans doute du temps étant donné mon niveau en VBA. Je suis peut-être trop ambitieux eu égard à ce niveau.

Par contre, le fait de créer une feuille regroupant les noms de toutes les feuillesm'interroge, car elle existe déjà. Je vais préparer un fichier allégé, et le poster.

Encore merci !

Bonjour à tous,

Pour info, problème similaire traité récemment ici Attribuer une variable à un nom de feuille sélectionnée sur un Userform.

Bonjour,

Je mets en oeuvre la solution de Eric_angers. Pour l'instant, le "remplissage" de mes 3 listbox (1 par classe) contenant les noms-des-élèves=noms-de-feuilles fonctionne bien. Je vais ensuite m'atteler à la partie consistant à utiliser la feuille correspondant à l'élève choisi.

Merci de cette aide.

Re-bonjour Eric_angers

Hé bien ça marche ! La sélection de la feuille associée au nom est bien activée ! J'ai juste changé le double-clic sur un item par un simple clic, et la plage de cellules aux 30 maximum nécessaires (une classe comporte rarement plus de 30 élèves). La feuille sélectionnée étant active, il n'y a aucun problème à y inscrire les données.

Encore merci pour cette aide qui débloque mon projet !

Bonjour FredPit

Content que cela te convienne.

Pour la sélection des 30 1ères lignes, pas de souci si cela ne dépasse jamais ce nombre.

Par contre s'il y a dépassement (au cas où) les lignes ne seront pas prises en compte et si le nombre est inférieur, des lignes vides seront placées dans la ListBox.

La formule "Set Plage = .Range("A1:A" & .Range("A65536").End(xlUp).Row)" ne coûte rien, elle n'allonge pas le traitement. On est sûr que tout est pris en compte.

A toi de voir.

Bonne continuation

Eric

Bonjour Eric_angers

Je note ta remarque. Cependant, j'ai préféré limiter le nombre à 30, car j'utilise celui-ci pour afficher la liste des dossiers déjà créés dans 3 listbox - pour qu'elles "tiennent" à l'écran sans scrollbar - permettant à l'utilisateur de vérifier l'existence d'un dossier avant de tenter sa création. J'ajoute que le code que tu m'as fourni m'a permis de faire avancer considérablement mon projet. Ceci étant dit, mon niveau débutant en VBA me pousse sans doute à produire de l'usine à gaz...il y a sans doute moyen d'automatiser certaines fonctions, mais je ne maîtrise pas encore les subtilités du codage...

J'ai bien cliqué sur l'icône "résolution du problème"

Rechercher des sujets similaires à "choisir listbox nom feuille activer"