XL 2019 mise en forme du code vba

  • Initiateur de la discussion Initiateur de la discussion defre
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

defre

XLDnaute Nouveau
bonjour, je suis novice en matiere de VBA, j'ai recupere un code pour automatiser les sondes ( fioul et eau potable) de ma barge et les transformer en M3 avec une correction pour le trim (avant-arriere) et le heel ( droite -gauche).
apres beaucoup d' essaie et de prise de tete il fonctionne enfin. par contre je pense que la forme n'ai pas faite dans les règles de l' art.
pourriez vous me dire ce que vous en pensé.

merci a vous.
ps: désolé pour les accents je suis sur un qwerty et la correction ne marche pas tout le temps
 

Pièces jointes

Solution
Bonjour,
Remplacez :
VB:
UserForm1.OptionButton(i).Value
par
Code:
UserForm1.Controls("OptionButton" & i).Value
Je n'avais pas testé tout le programme. L'idée était juste de trouver des pistes de réduction de code.
En PJ, c'est corrigé.
Bonjour Defre,
Le principal c'est que ça marche ! 🙂

Juste un petit point concernant les sondes. Au lieu de faire des IF autant utiliser une formule puisque c'est linéaire :
VB:
'trim
x = 2 * b + 5
'heel
y = 2 * g + 12
' trim water
x = 2 * k + 5
'heel
y = 2 * h + 12
Ainsi vous gagnez 28 IFs, ce qui fait une jolie haie. 🙂

Il y a d'autre chose à optimiser. Par exemple quand on a plein de IF on peut utiliser un Select Case, ce qui est plus intéressant.
Je vais regarder.
 
Le curseur ne sert à rien.
Il est juste là pour faire varier "arbitrairement" les niveaux donnés en E26,I26, M26 et Q26.
Je suppose que dans votre logiciel ces valeurs viennent d'autre part.

S'il ne s'agit que d'afficher un niveau, on peut le faire aussi très simplement avec un graphique en colonne.
L' avantage c'est qu'il peut afficher toutes les valeurs entre 0 et 100%
 

Pièces jointes

Dernière édition:
oui j'avais compris, mais je trouvais ca pas mal pour par exemple faire une simulation ou un truc du genre ( si on veux après prendre des valeur pour faire la stabilité).
par contre j'ai essaye de mettre la formule " x= 2*k+5", en faite ce n' ai pas bon car le x c'est la valeur du colummoffset par rapport a la textbox2
si tu avais une autre idée pour enlever les "if" je suis preneur.
en tout cas merci 😉
 
Désolé, quand vous faites :
VB:
'trim
If b = -1.5 Then x = 2
If b = -1 Then x = 3
If b = -0.5 Then x = 4
If b = 0 Then x = 5
If b = 0.5 Then x = 6
If b = 1 Then x = 7
If b = 1.5 Then x = 8
Vous affectez à la variable x une certaine valeur qui va dépendre de b.
En faisant :
Code:
x = 2 * b + 5
Vous faites exactement la même chose :
Si b=0 alors x=2*0+5 donc x=5, ce qui en anglais donne : If b=0 then x=5.

x "n'est pas la valeur du colummoffset par rapport a la textbox2" puisque en faisant x=5 vous affectez à x la valeur 5.

Je ne comprends pas le souci.
 
Puisqu'on a le temps, continuons.
Ce morceau :
VB:
If UserForm1.OptionButton1.Value = True Then Cells(8, 1).Select
If UserForm1.OptionButton2.Value = True Then Cells(8, 1).Select
If UserForm1.OptionButton3.Value = True Then Cells(64, 1).Select
If UserForm1.OptionButton4.Value = True Then Cells(92, 1).Select
If UserForm1.OptionButton5.Value = True Then Cells(120, 1).Select
If UserForm1.OptionButton6.Value = True Then Cells(120, 1).Select
If UserForm1.OptionButton7.Value = True Then Cells(152, 1).Select
If UserForm1.OptionButton8.Value = True Then Cells(181, 1).Select
If UserForm1.OptionButton9.Value = True Then Cells(203, 1).Select
If UserForm1.OptionButton10.Value = True Then Cells(225, 1).Select
If UserForm1.OptionButton11.Value = True Then Cells(247, 1).Select
If UserForm1.OptionButton12.Value = True Then Cells(269, 1).Select
Peut être réduit avec :
Code:
MatCell = Array(0, 8, 8, 64, 92, 120, 120, 152, 181, 203, 225, 247, 269)
For i = 1 To UBound(MatCell)
    If UserForm1.OptionButton(i).Value = True Then Cells(MatCell(i), 1).Select
Next i
où i donne l'indice du Userform et l' array donne le N° de ligne.
 
Et pour finir :
VB:
If UserForm1.OptionButton1.Value = True Then Cells(18, 2).Select: ActiveCell.Value = r: Call remplissageFO1P
If UserForm1.OptionButton2.Value = True Then Cells(18, 6).Select: ActiveCell.Value = r: Call remplissageFO1S
If UserForm1.OptionButton3.Value = True Then Cells(18, 10).Select: ActiveCell.Value = r: Call remplissageFO2P
If UserForm1.OptionButton4.Value = True Then Cells(18, 14).Select: ActiveCell.Value = r: Call remplissageFO2S
If UserForm1.OptionButton5.Value = True Then Cells(15, 18).Select: ActiveCell.Value = r: Call remplissageFODAYP
If UserForm1.OptionButton6.Value = True Then Cells(15, 22).Select: ActiveCell.Value = r: Call remplissageFODAYS
If UserForm1.OptionButton7.Value = True Then Cells(15, 26).Select: ActiveCell.Value = r: Call remplissageFOCLEAN
If UserForm1.OptionButton8.Value = True Then Cells(42, 2).Select: ActiveCell.Value = r: Call remplissageDIRTYOIL
If UserForm1.OptionButton9.Value = True Then Cells(42, 6).Select: ActiveCell.Value = r: Call remplissageBILGE
If UserForm1.OptionButton10.Value = True Then Cells(42, 10).Select: ActiveCell.Value = r: Call remplissageBLACKWATER
If UserForm1.OptionButton11.Value = True Then Cells(42, 14).Select: ActiveCell.Value = r: Call remplissageGREYWATER
If UserForm1.OptionButton12.Value = True Then Cells(42, 18).Select: ActiveCell.Value = r: Call remplissageLUBOIL
Peut être remplacé par :
Code:
MatLig = Array(0, 18, 18, 18, 18, 15, 15, 15, 42, 42, 42, 42, 42)
MatCol = Array(0, 2, 6, 10, 14, 18, 22, 26, 2, 6, 10, 10, 18)
For i = 1 To UBound(MatLig)
    If UserForm1.OptionButton(i).Value = True Then Cells(MatLig(i), MatCol(i)).Select
Next i
Si vous avez opté pour la représentation des cuves par une MFC ou un graphique, alors les "call" ne servent à rien, puisque c'est automatique.
 
génial, ça raccourcie bien le code.
pour les cuves je ne sais pas encore, mais je garde ton exemple car même si il ne me sert pas pour ce fichier la, il me servira surement pour un autre.
en tout cas merci de m'avoir accordé du temps.
bon week end 🙂
 
Si vous hésitez encore pour les cuves, vous pouvez optimiser le code.
Par exemple pour RemplissageFO1P on peut faire :
VB:
Sub RemplissageFO1P()
Bleu = RGB(191, 143, 0)
f = 404.244 / 10
Range("B9:B18").Interior.Color = RGB(192, 192, 192)
If r = 0 Then Range("B18").Interior.Color = RGB(192, 192, 192)
Ratio = r / f
For i = 0 To 9
    If Ratio > i Then Range("B" & 18 - i).Interior.Color = Bleu
Next i
If r >= f * 9.9 Then Range("B9").Interior.Color = Bleu
End Sub
Pour les autres, c'est pareil.
Bon week end.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
3
Affichages
372
Réponses
1
Affichages
573
Réponses
19
Affichages
1 K
Retour