Voilà, j'ai effectuer rapidement la copie de mon classeur, je vous l'ai mis en pièce jointe.
appli.xlsm
Mais soucis, j'ai remis exactement le même code et mon alpha me donne "0" ...
Voilà, j'ai effectuer rapidement la copie de mon classeur, je vous l'ai mis en pièce jointe.
appli.xlsm
Mais soucis, j'ai remis exactement le même code et mon alpha me donne "0" ...
Bonjour,
ton elseif est forcément toujours faux, il faut mettre l'opérateur OR ou alors tu voulais mettre -20 ?
j'ai opté pour un remplacement par "OR", et ensuite un remplacement de 20 par -20 : ça a fonctionné pour les deux issues
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 If CDbl(Me.TextBox3) >= 80 And CDbl(Me.TextBox3) <= 100 Then alpha = CDbl(Me.TextBox5) * CDbl(Me.TextBox3) / 100 ElseIf CDbl(Me.TextBox3) >= 20 And CDbl(Me.TextBox3) <= 0 Then alpha = CDbl(Me.TextBox5) + ((CDbl(Me.TextBox3) / 100) * CDbl(Me.TextBox5)) End If
par ailleurs, ton label est trop petit pour contenir tous tes couples
j'ai étiré sa hauteur au maximum de ton userform et ça ne suffit pas
pour que ça soit plus pratique, tu pourrais mettre un listbox qui est alimenté par l'ensemble des valeur (ou un combobox)
Non non, je voulais bien mettre -20
L'affichage en listbox se fait comme en label?
Code : Sélectionner tout - Visualiser dans une fenêtre à part Me.ListBox1.Text.Caption = chaine
Non le contrôle est différent
pour le label, on utilise son titre ... c'est sa fonction première que d'afficher UNE information
un listbox sert à afficher une collection d'informations, sous la forme de lignes et de colonnes (si on en met plusieurs)
on va donc alimenter la liste, une seule colonne suffit.
chaque fois qu'on trouve un Ai/Bi qui répond à tes conditions, on l'ajoute dans la listbox
au lieu de créer des "fausses lignes" de résultat dans une chaine de caractère, qu'on affiche dans le caption du label
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Set plage = Sheets("appli").Range("a1:c2025") tablo = plage Me.ListBox1.Clear For i = LBound(tablo) To UBound(tablo) If CDbl(tablo(i, 3)) >= ratioInf And CDbl(tablo(i, 3)) <= ratioSup Then Me.ListBox1.AddItem CDbl(tablo(i, 1)) & "/" & CDbl(tablo(i, 2)) End If Next i
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Set plage = Sheets("appli").Range("a1:c2025") tablo = plage For i = LBound(tablo) To UBound(tablo) If CDbl(tablo(i, 3)) >= ratioInf And CDbl(tablo(i, 3)) <= ratioSup Then chaine = chaine & vbCrLf & CDbl(tablo(i, 1)) & "/" & CDbl(tablo(i, 2)) End If Next i Me.Label10.Caption = chaine
je te conseille de bien assimiler le tutoriel suivant : http://silkyroad.developpez.com/VBA/ControlesUserForm/
tu verras que de passer à un listbox offre un énorme avantage par rapport au label : manipuler et interagir avec chaque couple si envie
Je vous joint mon ultime appli mais j'ai encore le même soucis qu'hier, mon alpha me donne 0, pourquoi?
Calcul jeux de pignons pour lancement.xlsm
Bonjour,
pourquoi tu as scindé ton userform initial en deux userform ?
tu as maintenant certains Textbox dans ton Userform1 (celui où on fait les calculs) et dans ton Userform2 (qui contient certains Textbox utilisés dans les calcul du userform1) ?
en l'état, ça ne peut que planter, voici pourquoi :
1) Userform1
- tu écris des valeurs dans des Textbox
- tu cliques sur un bouton et ça décharge ton Userform1 : la valeur de tes textbox n'existe plus !
2) Userform2
- tu écris des valeurs dans des Textbox
- tu cliques sur un bouton et ça effectue des calculs qui font référence à tes Textbox du Userform2
==> ça plante car les contrôles de Userform2 ont été déchargés, VBA ne trouve pas les objets !
T'as plusieurs solutions, je ne donne que les plus "simples" à mettre en oeuvre :
1) Mon conseil
tu remets tout dans le même userform
2) Utilisation de Variables publiques
Tu déclares dans un module standard des variables publiques, par exemple "Etirage" / "VitesseArbreMoteur" / "VitesseMachine"
dans ton userform2, quand tu clique sur ton bouton de validation, tu mets les valeurs de tes textbox dans les variables publiques
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Private Sub CommandButton1_Click() Etirage = Me.TextBox1 VitesseArbreMoteur = Me.TextBox2 VitesseMachine = Me.TextBox3 Unload Me End Sub
Ces variables étant publiques, tu peux les réutiliser dans ton userform1, tu remplaces tes "Userform2.Textbox1" par "Etirage" et là tu récupère bien la valeur
3) Ne pas décharger Userform2 mais le masquer
Au lieu de décharger ton Userform2
Tu le caches, comme ça tes contrôles et leurs valeurs sont encore utilisables
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Private Sub CommandButton1_Click() Unload Me End Sub
quand tu caches un userform, tu le fais réapparaître de la même manière quand quand tu l'appelles :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Private Sub CommandButton1_Click() Me.Hide End Sub
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Userform2.Show
Prend ce qui te vas le mieux
C'est parfait, le programme fonctionne!!!
Juste une dernière chose, si je voudrais par exemple afficher un maximum de 5 couples de valeurs, comment je pourrait faire?
Il faut déjà savoir si tu as une préférence sur les couples à récupérer ?
sans aucun préférence, on va récupérer les 5 premiers, en partant du ratio inférieur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 Set plage = Sheets("appli").Range("a1:c2025") tablo = plage Me.ListBox1.Clear For i = LBound(tablo) To UBound(tablo) If CDbl(tablo(i, 3)) >= ratioInf And CDbl(tablo(i, 3)) <= ratioSup Then Me.ListBox1.AddItem CDbl(tablo(i, 1)) & "/" & CDbl(tablo(i, 2)) End If ' on arrête de récupérer des couples quand on en a 5 dans la listbox If Me.ListBox1.ListCount = 5 Then Exit For Next i
Quitte à choisir, je prendrais ceux qui sont les plus près d'alpha (alpha sans l'encadrement)
On a quand même besoin d'un référentiel pour approcher ta valeur exact.
le but de l'encadrement était justement d'éviter d'avoir 0 couple dans ton rapatriement, sans complexifier ton code par une méthode qui recalculerait ton alpha si on ne trouve rien, ou moins de 5 valeurs
c'est plutôt le pourcentage de variation de la valeur alpha qui n'est pas adaptée, si tu remontes trop de choses.
joue sur cette ligne de code
là on est à 1% de variation, c'est peut être trop élevé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Encadrement = alpha * 0.01 'revoir l'encadrement
si vraiment ça colle pas, on changera notre fusil d'épaule, mais le code va être un peu plus lourd
Oui c'est bon j'ai mis un encadrement à 0,25 % et c'est beaucoup mieux!!
Si je souhaite mettre un bouton dans excel, et que quand je clique dessus j'ouvre directement mon programme, comment dois-je m'y prendre?
il faut écrire une macro dans un module standard :
tu adaptes le nom de ton userform dans cette macro
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Sub AfficheUserform() Userform1.Show End Sub
ensuite tu colles un bouton dans une feuille, tu fais un clic droit et tu sélectionnes "affecter une macro" et tu sélectionnes la macro AfficheUserform
J'ai mis dans un module
J'ai mis dans l'userform2
Code : Sélectionner tout - Visualiser dans une fenêtre à part Dim etirage As Double, Va As Double, Vm As Double
J'ai mis alors dans userform1
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Private Sub CommandButton1_Click() etirage = Me.TextBox1 Va = Me.TextBox2 Vm = Me.TextBox3 Unload Me End Sub
Et pourtant j'ai dans Vm, Va, et etirage la valeur 0
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ratioInf = (((alpha - encadrement) * Vm * 0.0762 * WorksheetFunction.Pi * 60 * (1 + etirage) / 0.077 / 1000 / 1.115) / (25 * 60 / 1000)) * 36 / (Va * 80) ratioSup = (((alpha + encadrement) * Vm * 0.0762 * WorksheetFunction.Pi * 60 * (1 + etirage) / 0.077 / 1000 / 1.115) / (25 * 60 / 1000)) * 36 / (Va * 80)
J'ai dis des variables publiques, là ce sont des variables dont la portée ne dépassera pas le module
pour étendre cette portée à tout ton projet :
bien comprendre ce tutoriel : http://silkyroad.developpez.com/VBA/LesVariables/
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Public etirage As Double Public Va As Double Public Vm As Double
et plus particulièrement pour cette question de portée des variables : http://silkyroad.developpez.com/VBA/LesVariables/#LV
Ok, tout est bon
Je vous remercie pour toutes vos réponses, et pour le temps que vous m'avez consacré!
Bonjour,
fais-en bonne usage, c'est tout ce qui compte
merci également
Changement de programme je doit absolument mettre mes couples de valeurs en label :
Est-ce que je réutilise le code que vous m'aviez suggérer précédemment?
Bonjour,
les deux possibilités sont dans le message #25
il te suffit d'intervertir le premier (qui est dans ton code) avec le second.
Pas d'affichage dans le label.. Quand je met un point d'arrêt sur la ligne me.label.caption et plus exactement sur chaine j'ai bien les couples mais pourtant rien ne s'affiche dans le label, pourquoiii?
Il faut agrandir la taille verticale de ton label.
Sinon tu ne vois que la première ligne de ta Chaine.
Or la première ligne .. c'est un saut de ligne.
mon message #23 abordait cet aspect "redimensionnement"
par ailleurs, ton label est trop petit pour contenir tous tes couples
j'ai étiré sa hauteur au maximum de ton userform et ça ne suffit pas
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager