userform et inputbox

bellic

XLDnaute Junior
Bonjour,

Je suis débutant en vba et j'aimerai avoir quelques solutions à mes problèmes...
J'ai créé un userform qui me permet de choisir 2 options. Pour l'option 1 je ne rencontre pas de problème.
Par contre pour l'option 2 :

Lorsque je choisi de faire l'option 2, j'ai créé un inputbox1 qui me demande de rentrer une variable. J'ai ensuite une nouvelle feuille qui s'insère automatiquement avec comme nom la variable rentrée dans l'inputbox1.
Une fois cette nouvelle feuille créée, j'ai un autre userform qui apparait, avec 2 autres options. Ces options me permettent de choisir d'insérer 2 types de tableau différents. Cependant ne sachant pas le nom de la feuille, puisque c'est une variable rentrée dans le inputbox1, je ne sais pas quoi mettre en destination (nom de la feuille) dans la macro de ce nouveau userform.
Merci de votre aide et j'espère avoir été assez clair.

Cdt,

Bellic
 

Gorfael

XLDnaute Barbatruc
Re : userform et inputbox

Salut bellic et le forum
Rappel : Pas de télépathe, ni de devin sur ce site (du moins, à ma connaissance)

Le nom que tu cherches, c'est la variable retour de l'inputbox. Et si tu comprends pas, pourquoi tu ne mettrais pas ton code sur le poste, hein ! Remarque on risquerait de comprendre de quoi on parle...
A+
 

bellic

XLDnaute Junior
Re : userform et inputbox

Salut Gorfael et Kjin,

Ci joint mon début de code...
Merci de votre aide
a+
Voila mon premier userform :

Private Sub CommandButton1_Click()
If OptionButton1 Then
Unload Accueil_Choix_Projet
rep = InputBox("Quel est le nom du projet?")
If rep = "" Then Exit Sub
Sheets(rep).Activate

Else

If OptionButton2 Then
reponse = InputBox("Inscrire le nom du projet :", nom, "")
If reponse = "" Then Exit Sub
Sheets.Add.Name = reponse
Sheets("paramétres").Range("B1") = reponse

Unload Accueil_Choix_Projet
UserForm1.Show


End If

End If

End Sub


Ensuite mon deuxième avec mon problème :

Private Sub CommandButton1_Click()
If OptionButton1 Then
n = nom ( je sais pas si il faut que je définisse une variable pour la feuille nouvelle?)

Sheets("Feuille_Tableau").Range("L1:U16" & Sheets("Feuille_Tableau").Range("A65536").End(xlUp).Row).Copy Destination:=Sheets("n").Range("B65536").End(xlUp).Offset(1, 0)
Else
If OptionButton2 Then
Sheets("Feuille_Tableau").Range("A1:J6" & Sheets("Feuille_Tableau").Range("A65536").End(xlUp).Row).Copy Destination:=Sheets("n").Range("B65536").End(xlUp).Offset(1, 0)
End If
End If

End Sub
 

Gorfael

XLDnaute Barbatruc
Re : userform et inputbox

Salut bellic et le forum
À voir tes codes, on va te voir souvent ;). Remarque qu'il n'y a que ceux qui ne font rien qui ne font pas d'erreurs.
Pemière macro :
Code:
Private Sub CommandButton1_Click()
If OptionButton1 Then
    Unload Accueil_Choix_Projet
    rep = InputBox("Quel est le nom du projet?")
    If rep = "" Then Exit Sub
    Sheets(rep).Activate
Else
    If OptionButton2 Then
        reponse = InputBox("Inscrire le nom du projet :", nom, "")
        If reponse = "" Then Exit Sub
        Sheets.Add.Name = reponse
        Sheets("paramétres").Range("B1") = reponse

        Unload Accueil_Choix_Projet
        UserForm1.Show
    End If
End If
End Sub
Je n'ai pas touché au code, juste mis en forme pour le rendre plus lisible.
Avoir un code sans ce qu'il est supposé faire... Excel fait toujours ce que tu lui demandes de faire et quelques fois ce que tu veux qu'il fasse.

Remarques à la vue du code :
- On utilise des OptionButtons : en général, ils sont associés à un même groupe, et fonctionnent ensemble => si l'un est vrai (True) les autres sont à faux (False). comme à priori, il n'y en a que deux, je ferais juste un If...Else...endif. S'il y en avait plus, je passerais par If...Else If... Else If... etc...Endif (ou avec un select Case).

- Il n'y a pas beaucoup de USF, de contrôles et c'est fatigant de les renommer, j'en conviens. Mais leur donner un nom explicite, comme les indentations, ça facilite la lisibilité.

- Là, à ce que je vois, si tu lances 2 fois une création, tu vas écraser la première réponse en "Sheets("paramétres").Range("B1")" : C'est peut-être voulu, mais ça me semble bizarre.

Ta deuxième macro est plus compliquée à comprendre.
On va supposer que c'est un code de l'USF "UserForm1" => ton premier code a activé la feuille concernant le (nouveau) projet.
Si c'est le cas, n devrait être ActiveSheet.Name (nom de l'onglet activé).

Première erreur, à mon sens : les noms ambigus ne te permettent pas de savoir sur quel USF tu te trouves, ni de savoir à quoi servent les contrôles. Oui, je sais, maintenant tu sais exactement ce que tu fais, et il y a peu de code. Mais si tu dois le modifier dans six mois, en urgence et vers 3h00 du mat, je te souhaite un bon dépannage.
Et une fois que tu as beaucoup de code, devant l'ampleur du travail, tu ne renommeras pas tes contrôles : les noms écrits dans les codes ne se mettent pas à jour.

Deuxième erreur, vraisemblablement : tu écris : Sheets("n").Range("B65536").End(xlUp) .Offset(1, 0).
Ça veut dire qu'on travaille sur la feuille dont le nom est "n". C'est peut-être voulu, mais j'en doute.
Sheets(n).Range("B65536").End(xlUp) .Offset(1, 0)
signifie qu'on travaille sur la feuille dont le nom est contenu dans la variable n. Ce qui fait une légère différence.

Je préfère déclarer toutes mes variables : Comme je les commence par une majuscule, et que je ne code qu'en minuscules, si quand je valide la ligne ma variable n'affiche pas la majuscule, c'est que j'ai fait une faute de frappe. Pas besoin d'attendre l'exécution du code pour m'en rendre compte. Et des fois, une variable vide donne des résultats... surprenant.

Pour le problème initial :
Tu as ta variable rep qui contient le retour de ton input. Il faut donc que tu conserves son contenu, même après la fin de la macro.
- Tu peux le coller dans une feuille de calcul => mais si quelqu'un y touche...
- Tu peux, dans ton cas, activer la feuille. Mais si on rend active une autre feuille...

Une autre méthode consiste à déclarer la variable en "globale" : la fin de la macro ne la réinitialise pas. Mais si tu utilises une même variable dans plusieurs macros, il faut juste être prudent.
Une variable déclarée dans une macro à pour domaine de travail la macro.
Une variable déclarée en tête de module de classe (par exemple l'USF) à pour domaine le module (l'USF)
Une variable déclarée en tête d'un module général peut être utilisée partout.

Donc, pour ton problème, tu devrais avoir un module général (Module1) qui commencerait par :
Dim Rep as string.
Et chaque fois que tu fais référence à la feuille Rep, ce sera la dernière valeur entrée dans l'inputbox.
donc, dans la seconde, tu auras soit n=Rep et Sheets(n), soit Sheets(Rep).
Attention : tant que tu n'initialises pas ta variable avec une valeur, elle est égale à ""
A+
 
Dernière édition:

bellic

XLDnaute Junior
Re : userform et inputbox

Bonsoir Kijn et Gorfael,

J'ai rencontré quelques problèmes, et je n'est pu vous répondre jusqu'à ce jour,je m'en excuse...
J'aimerai vous envoyer l'ébauche de mon projet en vous reprisant mon problème, mais il est trop lourd. Comment vous l'envoyer autrement?
lorsque je fais choix de projet sur la feuille accueil et que je choisi nouveau projet, cela m'envoie sur une matrice.
Sur cette matrice j'ai la possibilité d'ajouter des missions.
Une fois fait se rajout, je voudrais archiver cette feuille. Pour cela j'ai créé un inputbox qui me demande le nom du projet.
J'aimerai avoir une nouvelle feuille prenant comme nom, le nom dans l'inputbox et les données rentrées dans la matrice.
Et avoir la matrice vierge, une fois archivé.

Merci encore de vos aides,
 

Discussions similaires

Statistiques des forums

Discussions
312 413
Messages
2 088 201
Membres
103 766
dernier inscrit
mahieux