XL 2019 mise en forme du code vba

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

  • SOUNDING TANK PROTIS .xlsm
    137 KB · Affichages: 25
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é.

sylvanu

XLDnaute Barbatruc
Supporter XLD
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.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
Concernant le niveau des réservoirs, une solution en PJ sans VBA mais uniquement avec une MFC.
Dans la PJ un curseur fait varier le niveau pour test.
C'est une idée comme une autre de simplification.
Plus de détails si intéressé. ;)
 

Pièces jointes

  • SOUNDING TANK PROTIS(V3) .xlsm
    136 KB · Affichages: 3

sylvanu

XLDnaute Barbatruc
Supporter XLD
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

  • SOUNDING TANK PROTIS(V4) .xlsm
    144 KB · Affichages: 3
Dernière édition:

defre

XLDnaute Nouveau
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 ;)
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
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.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
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.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
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.
 

defre

XLDnaute Nouveau
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 :)
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
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.
 

Discussions similaires

Statistiques des forums

Discussions
312 191
Messages
2 086 052
Membres
103 109
dernier inscrit
boso_vs_viking