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

Fermé
Josvin - 13 oct. 2020 à 10:57
 Josvin - 16 oct. 2020 à 13:37
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
A voir également:

5 réponses

cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729
13 oct. 2020 à 11:44
Bonjour,

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

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

0
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 !
0
...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 !
0
cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729 > Josvin
13 oct. 2020 à 12:45
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
0
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...
0
cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729
Modifié le 13 oct. 2020 à 12:57
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
0
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 :-)
0
cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729
13 oct. 2020 à 13:11
Si tu as plusieurs feuilles avec des données oui.
Il suffit de te mettre sur la feuille concernée et faire Alt F11 pour accéder à son module.

Mais si tu n'as qu'une seule feuille avec des données il suffit de faire comme le modèle envoyé

Je ne comprends pas que tu ais plusieurs feuilles, vu que sur le Formulaire il y a un bouton Retour qui te renvoi sur la feuille principale
0
Josvin > cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024
13 oct. 2020 à 15:06
Je bloque sur une petite chose :
Le fait que le formulaire créé par double clic prenne le nom de la colonne A de ma feuille me bloque. J'aimerais rajouter un petit qqch au bout, ne serait-ce qu'une lettre, comme "nom A".
Que faudrait-il que je mette à la place de "nom" dans :
Sheets(Sheets.Count).Name = nom
pour que ce soit le cas ?

Merci encore :-)
0
cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729 > Josvin
13 oct. 2020 à 15:10
Sheets(Sheets.Count).Name = nom & "A" 'tout simplement
0
Josvin > cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024
Modifié le 13 oct. 2020 à 16:47
Merci beaucoup, ça fonctionne ! J'ai réussi à implémenter cette macro à mon fichier :-)

Je suis dorénavant confronté à un autre problème (c'était à prévoir, débutant en VBA, désolé...) :
Comme je l'ai dit, j'ai plusieurs formulaires à créer de la même manière par feuille. J'ai donc copié collé la même macro en entier, sur la même page de l'éditeur puisque je reste sur la même feuille, en ajustant les variables (plages de données, noms des fomulaires) pour correspondre à mon nouveau formulaire.
Mais cela ne fonctionne pas, je pense que les deux macros (sur la même feuille, donc) font conflit entre elles. J'obtiens un message d'erreur :
"Erreur de compilation :
Nom ambigue detecté : Worksheet_BeforeDoubleClick"

J'imagine donc qu'il y a redite entre les deux macros. Mais je ne sais pas comment les imbriquer. Aurais-tu une idée ?
0
cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729 > Josvin
Modifié le 13 oct. 2020 à 17:12
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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.
0
cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729
13 oct. 2020 à 13:23
OK il suffit d'être attentif aux noms des feuilles dans tes macros et la position des donnees dans les cellules
0