[365] Macro ouvrir une feuille créée par une autre macro

Signaler
-
 Josvin -
Bonjour,

Bonjour à tous,

J'aimerais savoir s'il est possible de créer une macro permettant d'ouvrir une feuille qui n'est pas encore créée (car créée par le biais d'une autre macro).

Je m'explique :
Dans ma base de données, pour chaque personne (une par ligne), j'aimerais qu'il soit possible (en cliquant sur un bouton de commande) de créer une feuille (qui sera un formulaire à remplir, donc avec un format prédéfini), et qu'en cliquant sur un autre bouton, on puisse accéder à ce formulaire pour le consulter et/ou le compléter.
En effet, si je me contente d'un seul bouton, soit il générera un nouveau formulaire à chaque clic (et on ne pourra donc plus le consulter), soit je serai obligé de créer tous les formulaires en avance (sachant que toute personne n'aura pas obligatoirement un formulaire, et aussi que c'est relativement fastidieux...).

Je vous joins mon tableau avec les boutons tels que je les aimerais, sans les macros. Et avec un formulaire déja créé au format spécifique pour exemple.

https://www.cjoint.com/c/JJni4WosHFg

Merci d'avance pour votre aide :)

Josvin

Configuration: Windows / Chrome 85.0.4183.121

5 réponses

Messages postés
6973
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
16 octobre 2020
558
Bonjour,

voici une méthode beaucoup plus simple qu'une multitude de bouton!

https://www.cjoint.com/c/JJnjRsYRWZQ

Wow ! Magnifique !

Je suis curieux de savoir comment tu as fait ce prodige ? Histoire que je puisse le reproduire sur mon fichier original ^^

Merci encore !
...et puisque je tiens malgré tout à mes boutons, est-il possible d'implémenter cette macro sur mes boutons plutôt qu'au double clic ?

Merci !
Messages postés
6973
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
16 octobre 2020
558 > Josvin
C'est beaucoup plus compliqué. Il faut une macro pour chaque bouton, rechercher la ligne pour relié ce bouton au nom et à la date.
Si tu as une colonne de 50 noms tu vois le travail!
Là c'est simple tu cliques sur la ligne et tu as toutes tes infos.

Je ne peux pas faire plus

@+ Le Pivert
Hum... oui, en effet. Je m'incline dans ce cas, restons sur le double clic :-)

Du coup, comment puis-je faire pour l'implémenter à mon fichier (qui contient beaucoup plus de données, forcément) ? Car là où je savais créer des macros par le simple onglet "enregistrer une macro", je maitrise beaucoup moins l'écriture manuelle en VBA...
Messages postés
6973
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
16 octobre 2020
558
Voici le code avec les commentaires. Il suffit d'être attentif:

Option Explicit
'déclaration des variables
Dim Ws As Worksheet
Dim nom As String 'nom du client
Dim ligne As Long
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Not Intersect(Target, Range("E6:E12")) Is Nothing Then ' adapter la plage
On Error Resume Next
ligne = Target.Row 'ligne cliquée
nom = Range("A" & ligne).Value 'nom du client
creer ' crée le Formulaire au nom du client
End If
If Not Intersect(Target, Range("F6:F12")) Is Nothing Then ' adapter la plage
On Error Resume Next
If Target.Value = "" Then Exit Sub
ligne = Target.Row 'ligne cliquée
nom = Range("A" & ligne).Value 'nom du client
 Sheets(nom).Activate 'active la feuille au nom du client
End If
End Sub
Private Sub creer()
'Boucle sur les feuilles du classeur.
    For Each Ws In ThisWorkbook.Worksheets
     If Ws.Name = nom Then 'même nom
     MsgBox "Une feuille existe dèjà à ce nom!", vbExclamation, "Ajout feuille"
Exit Sub
     End If
    Next Ws
'copie feuille modèle
    Sheets("Formulaire").Copy After:=Sheets(Sheets.Count) 'ajoute en dernier
  'renommer la feuille modèle(formulaire) avec le nouveau nom
  Sheets(Sheets.Count).Name = nom
 Sheets(nom).Range("C4").Value = nom 'mettre le nom du client dans le formulaire
 Sheets(nom).Range("F3").Value = Sheets("FLOWA").Range("D" & ligne).Value 'mettre la date dans le formulaire
 Sheets("FLOWA").Range("F" & ligne).Value = nom 'mettre le nom du client pour ouvrir sa feuille
End Sub
Sub supprimer() 'supprime toutes les feuilles sauf "FLOWA" et "Formulaire"
'Boucle sur les feuilles du classeur.
    For Each Ws In ThisWorkbook.Worksheets
     If Ws.Name <> "FLOWA" And Ws.Name <> "Formulaire" Then
  Application.DisplayAlerts = False 'evite message d'alerte
  Ws.Delete
     Application.DisplayAlerts = True
     End If
    Next Ws
End Sub




Bon courage, n'hésite pas si tu rencontres un problème

@+ Le Pivert
Merci beaucoup pour les éclaircissements.
En étant attentif, j'arrive à peu près à comprendre. Si je comprends bien, il me suffira d'implémenter cette macro à chacune de mes feuilles (en faisant un copier coller pour chaque feuille), en adaptant simplement les plages de données, c'est bien ça ?

Je vais tenter et je reviendrai vers toi si jamais je coince quelque part :-)
Messages postés
6973
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
16 octobre 2020
558 > Josvin
Donc toutes les donnée sont sur la même feuille. Tu as 3 formulaires, il faut donc répéter le code avec les nouvelles données dans Worksheet_BeforeDoubleClick. Comme je l'ai fait pour ouvrir une nouvelle feuille :

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'1er formulaire
If Not Intersect(Target, Range("E6:E12")) Is Nothing Then ' adapter la plage
On Error Resume Next
ligne = Target.Row 'ligne cliquée
nom = Range("A" & ligne).Value 'nom du client
creer ' crée le Formulaire au nom du client
End If
'2eme formulaire
If Not Intersect(Target, Range("L6:L12")) Is Nothing Then ' adapter la plage
On Error Resume Next
ligne = Target.Row 'ligne cliquée
nom = Range("J" & ligne).Value 'nom du client adapter la cellule
creer ' crée le Formulaire au nom du client
End If
'etc... pour ouvrir pareil


ou

Je dois donc reproduire le même schéma pour chacun de mes départements (et avec 3 formulaires différents pour chaque personne au lieu d'un... ^^)

je ne comprends toujours pas, si tu as 3 feuilles avec des données il faut te mettre sur chacune des feuilles et faire Alt F11 pour accéder au module de la feuille et là tu colles le code en adaptant les données
Messages postés
6973
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
16 octobre 2020
558 >
Messages postés
6973
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
16 octobre 2020

un exemple avec 2 feuilles sur ce que j'ai compris:

https://www.cjoint.com/c/JJnpDZHrNGQ

@+
>
Messages postés
6973
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
16 octobre 2020

Merci de nouveau pour ton aide.
Je n'ai effectivement peut-être pas été très clair, toutes mes excuses.
J'ai bien plusieurs feuilles, mais aussi 3 formulaires différents par feuille.
Reproduire la macro sur chacune des feuilles n'est pas le problème, comme tu le dis, il suffit de me mettre sur chacune des feuilles et faire Alt F11 pour accéder au module de la feuille, et coller le code en adaptant les données.

Le problème vient surtout du fait d'imbriquer les 3 formulaires dans le code. Je te mets un exemple (avec une seule feuille) qui sera certainement plus parlant, et beaucoup plus proche de la réalité de mon problème :

https://www.cjoint.com/c/JJnpRKnGdX6
Messages postés
6973
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
16 octobre 2020
558 > Josvin
Je comprends mieux. Il faut donc utiliser des variables pour les Formulaires et pour les dates. Si tu veux ajouter d'autres données il te faudra mettre d'autres variables.
Voici le code pour 2 formulaires. Je te laisse faire le 3ème pour te familiariser avec vba

Option Explicit
'déclaration des variables
Dim Ws As Worksheet
Dim nom As String 'nom du client
Dim ligne As Long 'numero de ligne
Dim form As String 'formulaire
Dim madate As Date 'date
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'1er formulaire creer
If Not Intersect(Target, Range("E6:E12")) Is Nothing Then ' adapter la plage
On Error Resume Next
ligne = Target.Row 'ligne cliquée
nom = Range("A" & ligne).Value & "_1er" 'nom du client
form = "Formulaire 1"
madate = Sheets("FLOWA").Range("D" & ligne).Value 'mettre la date dans le formulaire
creer ' crée le Formulaire au nom du client
Sheets("FLOWA").Range("F" & ligne).Value = nom 'mettre le nom du client pour ouvrir sa feuille
End If

'2éme formulaire creer
If Not Intersect(Target, Range("I6:I12")) Is Nothing Then ' adapter la plage
On Error Resume Next
ligne = Target.Row 'ligne cliquée
nom = Range("A" & ligne).Value & "_2ème" 'nom du client
form = "Formulaire 2"
madate = Sheets("FLOWA").Range("H" & ligne).Value 'mettre la date dans le formulaire
creer ' crée le Formulaire au nom du client
Sheets("FLOWA").Range("J" & ligne).Value = nom 'mettre le nom du client pour ouvrir sa feuille
End If

'1er formulaire ouverture
If Not Intersect(Target, Range("F6:F12")) Is Nothing Then ' adapter la plage
On Error Resume Next
If Target.Value = "" Then Exit Sub
ligne = Target.Row 'ligne cliquée
nom = Range("F" & ligne).Value  'nom du client
 Sheets(nom).Activate 'active la feuille au nom du client
End If

'2ème formulaire ouverture
If Not Intersect(Target, Range("J6:J12")) Is Nothing Then ' adapter la plage
On Error Resume Next
If Target.Value = "" Then Exit Sub
ligne = Target.Row 'ligne cliquée
nom = Range("J" & ligne).Value  'nom du client
 Sheets(nom).Activate 'active la feuille au nom du client
End If
End Sub
Private Sub creer()
'Boucle sur les feuilles du classeur.
    For Each Ws In ThisWorkbook.Worksheets
     If Ws.Name = nom Then 'même nom
     MsgBox "Une feuille existe dèjà à ce nom!", vbExclamation, "Ajout feuille"
Exit Sub
     End If
    Next Ws
'copie feuille modèle
    Sheets(form).Copy After:=Sheets(Sheets.Count) 'ajoute en dernier
  'renommer la feuille modèle(formulaire) avec le nouveau nom
  Sheets(Sheets.Count).Name = nom
 Sheets(nom).Range("C4").Value = nom 'mettre le nom du client dans le formulaire
 Sheets(nom).Range("F3").Value = madate
End Sub


Voilà

@+ Le Pivert
>
Messages postés
6973
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
16 octobre 2020

Hello,
J'ai récupéré ton code et l'ai adapté à ma feuille, tout fonctionne à merveille désormais !
Merci infiniment pour ta patience et ton aide très précieuse :-)
Josvin
J'ai bien plusieurs feuilles, en effet.
Pour imager, mettons que j'ai une feuille par département géographique, et que l'exemple sur lequel tu as travaillé ne correspondait qu'à un seul département. Je dois donc reproduire le même schéma pour chacun de mes départements (et avec 3 formulaires différents pour chaque personne au lieu d'un... ^^)
Le bouton Retour étant présent pour quitter le formulaire et revenir à la plage de données du département correspondant.
Messages postés
6973
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
16 octobre 2020
558
OK il suffit d'être attentif aux noms des feuilles dans tes macros et la position des donnees dans les cellules