Agrandir automatiquement un formulaire
Bonjour à tous,
Je vous contacte car ça fait 2 jours que je bûche sur un truc mais je n'arrive à rien !
J'ai créé un Userform qui permet de remplir une fiche Excel.
Lorsque la Race et le genre sont remplis, j'aimerai que le Userform se déploie pour montrer une image.
Jusque là aucun problème. Mon code donne ça :
Private Sub cmdTEST_Click()
If cboRace.Value = "Nain" And cboGenre.Value = "Femelle" Then
With FrmPersonne
.Width = 420
.Height = 360
Naine.Visible = True
End With
Else
End If
End Sub
Le souci c'est que je n'arrive pas à créer une procédure qui déploie ce volet automatiquement lorsque les ComboBox sont remplies.
J'ai essayé avec le code suivant mais rien n'y fait. Lorsque j'entre des "valeurs" il ne se déploie pas tout seul :(
Sub Ajout_personnage()
If cboRace.Value <> "" And cboGenre.Value <> "" Then
If cboRace.Value = "Elfe Clair" And cboGenre.Value = "Femelle" Then
With FrmPersonne
.Width = 420
.Height = 360
ElfeClairF.visiblue = True
End With
'Là il y aurait des ELSEIF pour insérer tous les autres combos Race/Genre
End If
End If
End Sub
Voilà donc pour résumer, quand j'entre une race et un genre, le volet reste comme sur la première image, tant que je n'ai pas l'action d'un bouton ça ne marche pas.
Avez-vous une idée ?
Je vous remercie par avance.
Beoden
Bonjour,
Regarde cet exemple,
Dés que tu auras mis une valeur ou lettre quelconque dans le 1er textbox, l'USF double en largeur
Dés que tu auras mis une valeur ou lettre quelconque dans le 2ème textbox, l'USF revient à l'origine
Bonjour l'équipe.
Un exemple très simple (avec ton image)
Il faut que les conditions de remplissage d'ensemble se trouvent dans CHAQUE combo.
Merci à vous deux pour vos réponses.
En terme de rendu final, ce que je recherche se rapproche plus de ce que M12 me propose.
J'ai essayé de l'appliquer encore une fois à mon cas, mais toujours rien.
Sub AjoutPersonnage_AfterUpdate()
If Me.cboRace.Value <> "" And Me.cboGenre.Value <> "" Then
#############
Ici je fais donne mes conditions
#############
If Me.cboRace.Value = "Elfe Clair" And Me.cboGenre.Value = "Femelle" Then
With FrmPersonne
.Width = 420
.Height = 360
ElfeClairF.Visible = True
End With
ElseIf Me.cboRace.Value = "Elfe Clair" And Me.cboGenre.Value = "Mâle" Then
With FrmPersonne
.Width = 420
.Height = 360
ElfeClairM.Visible = True
End With
ElseIf Me.cboRace.Value = "Elfe Sombre" And Me.cboGenre.Value = "Femelle" Then
With FrmPersonne
.Width = 420
.Height = 360
ElfeSomF.Visible = True
End With
ElseIf Me.cboRace.Value = "Elfe Sombre" And Me.cboGenre.Value = "Mâle" Then
With FrmPersonne
.Width = 420
.Height = 360
ElfeSomM.Visible = True
End With
#############
Je termine par ça
#############
Else
If Me.cboRace.Value = "" And Me.cboGenre.Value = "" Then
With FrmPersonne
.Width = 260
.Height = 360
End With
End If
End Sub
Je n'ai pas précisé que je débute un peu dans le VBA ^^ Peut-être que je ne cerne pas le problème, mais pour moi ça devrait fonctionner...
Ton problème vient de ce que tu n'as pas dû faire au départ un bon vieil organigramme fonctionnel (crayon, papier, gomme).
On le voit tout de suite quand tu écris :
If cboRace.Value <> "" And cboGenre.Value <> "" Then
If cboRace.Value = "Elfe Clair" And cboGenre.Value = "Femelle" Then
Bla...bla...la...
'Là il y aurait des ELSEIF pour insérer tous les autres combos Race/Genre
End If
End If
parce que la condition If cboRace.Value <> "" And cboGenre.Value <> "" Then ne sert à rien. Si tu l'enlèves, le résultat sera identique.
En fait tout se passe comme si tu ne savais pas exactement ce qui doit déclencher l'élargissement de ton formulaire.
Si l'élargissement doit être automatique dès qu'il y a un contenu dans les deux combos quel qu'il soit, alors tu peux t'inspirer de la base ci-dessous. Mais je te confirme que c'est dans les combos que ça se passe.
Naine.xlsm
Merci à tous pour vos retours !
J'ai réussi à obtenir ce que je souhaitais.
En effet Optimix, en relisant tout ça je me suis rendu compte que certaines choses étaient en trop, que ça ne servait à rien et je l'avais même volontairement supprimé avant même de lire ton commentaire ^^.
If cboRace.Value <> "" And cboGenre.Value <> "" Then
J'arrive donc au résultat que je souhaitais. Pour que ce soit parfait il me manquerait une chose mais je n'arrive pas à le faire... Je ne sais pas si c'est mon manque de vocabulaire ou si je suis parti de biais encore une fois...
Je me suis rendu compte que dans mon formulaire, les images ont un ordre (suivant la création de ces dernières dans le Userform). Et donc, si je commence par un Nain (qui est au bas de la liste) et que je souhaite changer par la suite et passer sur un Elfe, la dernière image que j'ai créée dans le Userform étant Nain, elle reste par dessus et maintenant activée par la macro.
Conséquence : Lorsque l'on joue avec les combobox Race et Genre, ça ne suit pas comme il le faudrait, la dernière image créée reste affichée.
J'ai essayé de donner le nom de l'image choisie à une variable (Vimage) et j'ai essayé de cacher l'image si les combobox changent de valeur, mais je ne suis arrivé à rien.
J'ai aussi essayé de changer la position de l'image pour qu'elle passe en 1er plan mais je n'y suis pas arrive non plus.
Avez-vous une idée (Ca sera ma dernière demande promis ^^)
Je met mon code ci-dessous le classeur est trop lourd...
Option Explicit
Dim Vimage As String
'###############################################
'BOUTON FERMER
'###############################################
Private Sub cmdAnnuler_Click()
FrmPersonne.Hide
Unload FrmPersonne
End Sub
'###############################################
'BOUTON OK
'###############################################
Private Sub cmdOK_Click()
'###############################################
'REMPLISSAGE DE LA FICHE
'###############################################
'INFORMATIONS PERSONNAGE
Cells(5, 3) = cboRace.Value
Cells(2, 9) = UCase(txtNom.Value)
Cells(2, 7) = (txtPrenom.Value)
Cells(6, 3) = cboGenre.Value
Cells(6, 8) = txtPro.Value
'CLASSE
If optWar.Value = True Then
Cells(4, 3) = "Guerrier"
ElseIf optMage.Value = True Then
Cells(4, 3) = "Mage"
ElseIf optRogue.Value = True Then
Cells(4, 3) = "Éclaireur"
End If
'ASCENDANT
Cells(5, 3) = cboAsc.Value
'CROYANCE
If optCroy.Value = True Then
Cells(7, 14) = "Croyant"
ElseIf optAT.Value = True Then
Cells(7, 14) = "Athée"
ElseIf optInd.Value = True Then
Cells(7, 14) = "Indécis"
End If
End Sub
Sub cboRace_Change()
If cboRace.Value <> "" And cboGenre.Value <> "" Then
Call Ajout_Perso
'UTILISATION DE LA VARIABLE VIMAGE POUR CACHER LES IMAGES
'(Ne fonctionne pas)
' Vimage.Visible = False
Else
Me.Width = 260
End If
End Sub
Sub cboGenre_Change()
If cboRace.Value <> "" And cboGenre.Value <> "" Then
Call Ajout_Perso
'UTILISATION DE LA VARIABLE VIMAGE POUR CACHER LES IMAGES
'(Ne fonctionne pas)
' Vimage.Visible = False
Else
Me.Width = 260
End If
End Sub
Sub Ajout_Perso()
'###############################################
'MONTRER L'IMAGE CORRESPONDANTE
'###############################################
If cboRace.Value = "Elfe Clair" And cboGenre.Value = "Femelle" Then
With FrmPersonne
Me.Width = 420
ElfeClairF.Visible = True
Vimage = ElfeClairF.Name
End With
Exit Sub
ElseIf cboRace.Value = "Elfe Clair" And cboGenre.Value = "Mâle" Then
With FrmPersonne
Me.Width = 420
ElfeClairM.Visible = True
Vimage = ElfeClairM.Name
End With
Exit Sub
ElseIf cboRace.Value = "Elfe Sombre" And cboGenre.Value = "Femelle" Then
With FrmPersonne
Me.Width = 420
ElfeSomF.Visible = True
Vimage = ElfeSomF.Name
End With
Exit Sub
ElseIf cboRace.Value = "Elfe Sombre" And cboGenre.Value = "Mâle" Then
With FrmPersonne
Me.Width = 420
ElfeSomM.Visible = True
Vimage = ElfeClairM.Name
End With
Exit Sub
ElseIf Me.cboRace.Value = "Elfe Sylvestre" And Me.cboGenre.Value = "Femelle" Then
With FrmPersonne
Me.Width = 420
ElfeSylF.Visible = True
Vimage = ElfeSylF.Name
End With
Exit Sub
ElseIf Me.cboRace.Value = "Elfe Sylvestre" And Me.cboGenre.Value = "Mâle" Then
With FrmPersonne
Me.Width = 420
ElfeSylM.Visible = True
Vimage = ElfeSylM.Name
End With
Exit Sub
ElseIf Me.cboRace.Value = "Faune" And Me.cboGenre.Value = "Femelle" Then
With FrmPersonne
Me.Width = 420
FauneF.Visible = True
Vimage = FauneF.Name
End With
Exit Sub
ElseIf Me.cboRace.Value = "Faune" And Me.cboGenre.Value = "Mâle" Then
With FrmPersonne
Me.Width = 420
FauneM.Visible = True
Vimage = FauneM.Name
End With
Exit Sub
ElseIf Me.cboRace.Value = "Halfelin" And Me.cboGenre.Value = "Femelle" Then
With FrmPersonne
Me.Width = 420
HalfelinF.Visible = True
Vimage = HalfelinF.Name
End With
Exit Sub
ElseIf Me.cboRace.Value = "Halfelin" And Me.cboGenre.Value = "Mâle" Then
With FrmPersonne
Me.Width = 420
HalfelinM.Visible = True
Vimage = HalfelinM.Name
End With
Exit Sub
ElseIf Me.cboRace.Value = "Humain" And Me.cboGenre.Value = "Femelle" Then
With FrmPersonne
Me.Width = 420
Humaine.Visible = True
Vimage = Humaine.Name
End With
Exit Sub
ElseIf Me.cboRace.Value = "Humain" And Me.cboGenre.Value = "Mâle" Then
With FrmPersonne
Me.Width = 420
Humain.Visible = True
Vimage = Humain.Name
End With
Exit Sub
ElseIf Me.cboRace.Value = "Nain" And Me.cboGenre.Value = "Femelle" Then
With FrmPersonne
Me.Width = 420
Naine.Visible = True
Vimage = Naine.Name
End With
Exit Sub
ElseIf Me.cboRace.Value = "Nain" And Me.cboGenre.Value = "Mâle" Then
With FrmPersonne
Me.Width = 420
Nain.Visible = True
Vimage = Nain.Name
End With
Exit Sub
End If
End Sub
Private Sub UserForm_Initialize()
cboGenre.AddItem "Mâle"
cboGenre.AddItem "Femelle"
cboRace.AddItem "Elfe Clair"
cboRace.AddItem "Elfe Sombre"
cboRace.AddItem "Elfe Sylvestre"
cboRace.AddItem "Faune"
cboRace.AddItem "Halfelin"
cboRace.AddItem "Humain"
cboRace.AddItem "Nain"
With FrmPersonne
Me.Width = 260
End With
End Sub
Bonjour Beoden, le Forum,
Il suffit après la visibilité de chaque image de rajouter la propriété ZOrder
ElfeSomM.Visible = True
ElfeSomM.Zorder 0
Ainsi l'image en sélection sera chaque fois au dessus des autres.
Je ne pense pas que ce soit une bonne idée que d'encapsuler les images dans ton fichier Excel. Ton fichier va souffrir inutilement d'obésité. La fonction LoadPicture() permet d'avoir toutes les images dans un dossier séparé du fichier Excel en ressources externes. Dans l'exemple ci-dessous, si tu sélectionnes "Nain" et "Femelle", la photo se chargera de façon dynamique. Je ne l'ai pas mise dans un dossier à part, mais dans le dossier où se trouve le fichier Excel pour faire simple. Ci-dessous les fichiers à mettre dans le même dossier.
Bien sûr, le nom "nain.jpg" est dans le dur dans cet exemple, mais ce sera à toi de mettre les noms dans un tableau.
X Cellus,
Merci pour ta réponse, c'est parfait :)
Optimix,
En effet c'est une bonne idée. Je vais essayer de manipuler tout ça pour optimiser mon fichier :)
Merci à tous pour votre aide et merci à toi Optimix pour tes supers conseils !
Bonne continuation.
Bonjour… (d’un nouveau personnage)
qui utilise des tableaux (ListObjects), des noms simples et qui n'abuse pas du Me. afin d’initialiser simplement la largeur et mettre en évidence l’information nécessaire.
Reste à installer les images (non jointes) remplacées ici par des étiquettes en gardant (ou adaptant) des noms identiques à celles-ci.
Si leur nombre et leur poids ne sont pas importants, tu peux les garder dans le classeur sinon tu auras intérêt à adopter l’avis de Optimix