Simplification code
Coucou à tous ! Novice dans la programmation VBA je fais appel à vous pour me permettre de progresser sur un point.
J'ai une façon de coder très brut, et j'aimerais utiliser plus de fonction et de boucles, sauf que je ne visualise pas bien comment faire.
Pour vous mettre dans le contexte : Je suis dans la création d'un fichier de suivi de parc machine, permettant de renseigner les événements du parc dans une base, les trier et les analyser. Pour ce faire j'emploi un UserForm qui nous permet de renseigner toutes les données nécessaires à la construction de cette base. Dans ce UserForm, se trouvent évidemment des Text/Combo/Checkboxs. Voici la manière dont je ramène mes informations :
If Valid_Prev.Value = False Then
Select Case MsgBox("Confirmer la création d'une nouvelle panne ?", vbYesNo, "Demande de confirmation")
Case vbYes
L = Feuil1.Range("a65536").End(xlUp).Offset(1, 0).Row
Feuil1.Cells(L, 1) = Page_saisie.Num_Inter.Value
Feuil1.Cells(L, 2) = Page_saisie.Materiel.Value
Feuil1.Cells(L, 3) = Page_saisie.Unite_prod.Value
Feuil1.Cells(L, 4) = Page_saisie.Date_demande.Value
Feuil1.Cells(L, 5) = Page_saisie.Date_prevue.Value
Feuil1.Cells(L, 6) = Page_saisie.Date_realisation.Value
Feuil1.Cells(L, 7) = Page_saisie.T_real.Value
Feuil1.Cells(L, 8) = Page_saisie.Statut.Value
Feuil1.Cells(L, 9) = Page_saisie.Description_dep.Value
Feuil1.Cells(L, 10) = Page_saisie.Nom_tech.Value
Feuil1.Cells(L, 11) = Page_saisie.Commentaire.Value
Feuil1.Cells(L, 12) = Page_saisie.Priorite.Value
Feuil1.Cells(L, 13) = Page_saisie.Cout.Value
Case vbNo
Exit Sub
End Select
ElseIf Valid_Prev.Value = True Then
Select Case MsgBox("Confirmer la création d'une nouvelle panne ?", vbYesNo, "Demande de confirmation")
Case vbYes
L = Feuil4.Range("a65536").End(xlUp).Offset(1, 0).Row
Feuil4.Cells(L, 1) = Page_saisie.Num_Inter.Value
Feuil4.Cells(L, 2) = Page_saisie.Materiel.Value
Feuil4.Cells(L, 3) = Page_saisie.Unite_prod.Value
Feuil4.Cells(L, 4) = Page_saisie.Date_demande.Value
Feuil4.Cells(L, 5) = Page_saisie.Date_prevue.Value
Feuil4.Cells(L, 6) = Page_saisie.Date_realisation.Value
Feuil4.Cells(L, 7) = Page_saisie.T_real.Value
Feuil4.Cells(L, 8) = Page_saisie.Statut.Value
Feuil4.Cells(L, 9) = Page_saisie.Description_dep.Value
Feuil4.Cells(L, 10) = Page_saisie.Nom_tech.Value
Feuil4.Cells(L, 11) = Page_saisie.Commentaire.Value
Feuil4.Cells(L, 12) = Page_saisie.Priorite.Value
Feuil4.Cells(L, 13) = Page_saisie.Cout.Value
Feuil4.Cells(L, 14) = Page_saisie.Preventif1.Value
Feuil4.Cells(L, 15) = Page_saisie.Preventif2.Value
Feuil4.Cells(L, 16) = Page_saisie.Preventif3.Value
Feuil4.Cells(L, 17) = Page_saisie.Preventif4.Value
Case vbNo
Exit Sub
End Select
End IfTout ça pour dire: si cette case est coché , on met les infos là , si non on met les infos là.
L'objectif de ma demande : Me montrer comment on fait mieux pour dire la même chose.
Merci d'avance le forum
Max
Bonjour,
Qu'est ce qui change entre les 2?
1- la feuille (Feuil1 ou Feuil4)
2- le nombre de contrôles (preventif1, 2, 3, 4 en plus)
Donc, on déclare une variable "feuille" de type Worksheet :
Dim Wsh As Worksheet
'Détermination de la feuille selon case à cocher
If Valid_Prev.Value = False Then
Set Wsh = Feuil1
Else
Set Wsh = Feuil4
End If
Select Case MsgBox("Confirmer la création d'une nouvelle panne ?", vbYesNo, "Demande de confirmation")
Case vbYes
'Transfert données dans la bonne feuille, à la bonne ligne
With Wsh
L = .Range("A65536").End(xlUp).Offset(1, 0).Row
.Cells(L, 1) = Page_saisie.Num_Inter.Value
.Cells(L, 2) = Page_saisie.Materiel.Value
.Cells(L, 3) = Page_saisie.Unite_prod.Value
.Cells(L, 4) = Page_saisie.Date_demande.Value
.Cells(L, 5) = Page_saisie.Date_prevue.Value
.Cells(L, 6) = Page_saisie.Date_realisation.Value
.Cells(L, 7) = Page_saisie.T_real.Value
.Cells(L, 8) = Page_saisie.Statut.Value
.Cells(L, 9) = Page_saisie.Description_dep.Value
.Cells(L, 10) = Page_saisie.Nom_tech.Value
.Cells(L, 11) = Page_saisie.Commentaire.Value
.Cells(L, 12) = Page_saisie.Priorite.Value
.Cells(L, 13) = Page_saisie.Cout.Value
'Ajout des contrôles supplémentaires Feuil4
If .Name = Feuil4.Name Then
.Cells(L, 14) = Page_saisie.Preventif1.Value
.Cells(L, 15) = Page_saisie.Preventif2.Value
.Cells(L, 16) = Page_saisie.Preventif3.Value
.Cells(L, 17) = Page_saisie.Preventif4.Value
End If
End With
Case vbNo
'ICI, rien à ajouter car rien à faire...
End SelectSachant que dans un tel cas, j'aurais utilisé If à la place de Select Case, le second cas ne servant à rien...
Donc :
Dim Wsh As Worksheet
'Détermination de la feuille selon case à cocher
If Valid_Prev.Value = False Then
Set Wsh = Feuil1
Else
Set Wsh = Feuil4
End If
If MsgBox("Confirmer la création d'une nouvelle panne ?", vbYesNo, "Demande de confirmation") = vbYes Then
'Transfert données dans la bonne feuille, à la bonne ligne
With Wsh
L = .Range("A65536").End(xlUp).Offset(1, 0).Row
.Cells(L, 1) = Page_saisie.Num_Inter.Value
.Cells(L, 2) = Page_saisie.Materiel.Value
.Cells(L, 3) = Page_saisie.Unite_prod.Value
.Cells(L, 4) = Page_saisie.Date_demande.Value
.Cells(L, 5) = Page_saisie.Date_prevue.Value
.Cells(L, 6) = Page_saisie.Date_realisation.Value
.Cells(L, 7) = Page_saisie.T_real.Value
.Cells(L, 8) = Page_saisie.Statut.Value
.Cells(L, 9) = Page_saisie.Description_dep.Value
.Cells(L, 10) = Page_saisie.Nom_tech.Value
.Cells(L, 11) = Page_saisie.Commentaire.Value
.Cells(L, 12) = Page_saisie.Priorite.Value
.Cells(L, 13) = Page_saisie.Cout.Value
'Ajout des contrôles supplémentaires Feuil4
If .Name = Feuil4.Name Then
.Cells(L, 14) = Page_saisie.Preventif1.Value
.Cells(L, 15) = Page_saisie.Preventif2.Value
.Cells(L, 16) = Page_saisie.Preventif3.Value
.Cells(L, 17) = Page_saisie.Preventif4.Value
End If
End With
End IfBonjour,
Pas de nécessité de boucle mais une partie du code peut quand même être factorisée :
Dim sh As Worksheet, L As Long
Set sh = IIf(Valid_Prev.Value, Feuil4, Feuil1)
If MsgBox("Confirmer la création d'une nouvelle panne ?", vbYesNo, "Demande de confirmation") = vbYes Then
With sh
L = .Range("a65536").End(xlUp).Offset(1, 0).Row
.Cells(L, 1) = Page_saisie.Num_Inter.Value
.Cells(L, 2) = Page_saisie.Materiel.Value
.Cells(L, 3) = Page_saisie.Unite_prod.Value
.Cells(L, 4) = Page_saisie.Date_demande.Value
.Cells(L, 5) = Page_saisie.Date_prevue.Value
.Cells(L, 6) = Page_saisie.Date_realisation.Value
.Cells(L, 7) = Page_saisie.T_real.Value
.Cells(L, 8) = Page_saisie.Statut.Value
.Cells(L, 9) = Page_saisie.Description_dep.Value
.Cells(L, 10) = Page_saisie.Nom_tech.Value
.Cells(L, 11) = Page_saisie.Commentaire.Value
.Cells(L, 12) = Page_saisie.Priorite.Value
.Cells(L, 13) = Page_saisie.Cout.Value
If Valid_Prev.Value Then
.Cells(L, 14) = Page_saisie.Preventif1.Value
.Cells(L, 15) = Page_saisie.Preventif2.Value
.Cells(L, 16) = Page_saisie.Preventif3.Value
.Cells(L, 17) = Page_saisie.Preventif4.Value
End If
End With
End IfJ'ai aussi ôté ton Select Case pas vraiment justifié car tu n'utilises qu'un Case.
eric
Edit : salut pijaku. Tu as dégainé plus vite...
Bonjour Eriic et Pijaku, merci pour votre rapidité
Pour te répondre Pijaku, la différence est sur la CheckBox "Valid_Prev" elle permet en effet de catégoriser l'événement en un événement préventif ou non. D’ou le fait qu'on envoi sur Feui1 si non préventif et Feuil4 si préventif, That's all .
Le select case, c'est vrai j'ai jugé utile vu qu'il y avait le IF du MsgBox et le IF du Valid_Prev.
Dans tous les cas, vous avez répondu à ma question et à mon objectif, merci à vous, à très bientôt,
Max
Ah oui mais génie que je suis, j'ai omis une information cruciale
Si la checkbox Valid_Prev est cochée, il faut mettre l’événement ET dans Feuil1 ET dans feuil4 donc vos codes fonctionnent parfaitement selon ce que je vous avez demandé avant, mais ce n'est plus la même écriture dans ce cas la ?
Dim sh As Worksheet, L As Long
Set sh = IIf(Valid_Prev.Value, Feuil4, Feuil1)
If MsgBox("Confirmer la création d'une nouvelle panne ?", vbYesNo, "Demande de confirmation") = vbYes Then
With sh
L = .Range("a65536").End(xlUp).Offset(1, 0).Row
.Cells(L, 1) = Page_saisie.Num_Inter.Value
.Cells(L, 2) = Page_saisie.Materiel.Value
.Cells(L, 3) = Page_saisie.Unite_prod.Value
.Cells(L, 4) = Page_saisie.Date_demande.Value
.Cells(L, 5) = Page_saisie.Date_prevue.Value
.Cells(L, 6) = Page_saisie.Date_realisation.Value
.Cells(L, 7) = Page_saisie.T_real.Value
.Cells(L, 8) = Page_saisie.Statut.Value
.Cells(L, 9) = Page_saisie.Description_dep.Value
.Cells(L, 10) = Page_saisie.Nom_tech.Value
.Cells(L, 11) = Page_saisie.Commentaire.Value
.Cells(L, 12) = Page_saisie.Priorite.Value
.Cells(L, 13) = Page_saisie.Cout.Value
If Valid_Prev.Value Then
.Cells(L, 14) = Page_saisie.Preventif1.Value
.Cells(L, 15) = Page_saisie.Preventif2.Value
.Cells(L, 16) = Page_saisie.Preventif3.Value
.Cells(L, 17) = Page_saisie.Preventif4.Value
End If
End With
End IfComment je peux faire ça ?
Merci et désolé ^^
Max
Salut Eriiic,
Comment va?
Max : Si case cochée => on met dans Feuil1 et Feuil4. Ok.
Si case non cochée => on met ou? Feuil1? Feuil4? Autre?
Re pijaku,
SI case non cochée ==> Feuil 1 .
Merci encore
Re,
en utilisant un tableau pour éviter la répétition :
Non testé bien sûr faute de fichier fourni. Nécessitera peut-être 1 ou 2 ajustements...
eric
Edit : petite correction du code à 10:52
Merci , eriiic je test je vous dis.
Max
Code corrigé, je m'étais fait un peu des noeuds :
Dim sh As Worksheet, L As Long, tabl(), i As Long
ReDim tabl(1 To 1, 1 To 13)
If MsgBox("Confirmer la création d'une nouvelle panne ?", vbYesNo, "Demande de confirmation") = vbYes Then
For i = 1 To 13
tabl(1, 1) = Page_saisie.Num_Inter.Value
tabl(1, 2) = Page_saisie.Materiel.Value
tabl(1, 3) = Page_saisie.Unite_prod.Value
tabl(1, 4) = Page_saisie.Date_demande.Value
tabl(1, 5) = Page_saisie.Date_prevue.Value
tabl(1, 6) = Page_saisie.Date_realisation.Value
tabl(1, 7) = Page_saisie.T_real.Value
tabl(1, 8) = Page_saisie.Statut.Value
tabl(1, 9) = Page_saisie.Description_dep.Value
tabl(1, 10) = Page_saisie.Nom_tech.Value
tabl(1, 11) = Page_saisie.Commentaire.Value
tabl(1, 12) = Page_saisie.Priorite.Value
tabl(1, 13) = Page_saisie.Cout.Value
Next i
' commum
L = Feuil1.Range("a65536").End(xlUp).Offset(1, 0).Row
Feuil1.Cells(L, 1).Resize(, 13) = tabl
L = Feuil4.Range("a65536").End(xlUp).Offset(1, 0).Row
Feuil4.Cells(L, 1).Resize(, 13) = tabl
If Valid_Prev.Value Then
' complément
ReDim tabl(1 To 1, 1 To 4)
For i = 1 To 4
tabl(1, 1) = Page_saisie.Preventif1.Value
tabl(1, 2) = Page_saisie.Preventif2.Value
tabl(1, 3) = Page_saisie.Preventif3.Value
tabl(1, 4) = Page_saisie.Preventif4.Value
Next i
Feuil4.Cells(L, 14).Resize(, 4) = tabl
End If
End IfRe , j'étais entrain de t'écrire et t'envoyer le fichier car, il y avait des petits kwaks
MERCI pour votre participation dans mon fichier.
Max
J'incris Feuil1 et Feuil4 dans tous les cas.
A relire j'ai l'impression que c'est que si cochée. Tu confirmes ?
Si oui, essaie d'adapter (2 lignes à déplacer) et reviens si difficulté
eric
Oui c'est bien ça , mais ne t'inquiète pas je me débrouilles pour ça. Tu enfin VOUS m'avez sortis une bûche du pied ^^
Bonne journée à tous
Max
Petite correction du code d'Eriiic, nul besoin, ni de i, ni de boucles. Une réminiscence du code de test sans doute...
Dim sh As Worksheet, L As Long, tabl()
ReDim tabl(1 To 1, 1 To 13)
If MsgBox("Confirmer la création d'une nouvelle panne ?", vbYesNo, "Demande de confirmation") = vbYes Then
tabl(1, 1) = Page_saisie.Num_Inter.Value
tabl(1, 2) = Page_saisie.Materiel.Value
tabl(1, 3) = Page_saisie.Unite_prod.Value
tabl(1, 4) = Page_saisie.Date_demande.Value
tabl(1, 5) = Page_saisie.Date_prevue.Value
tabl(1, 6) = Page_saisie.Date_realisation.Value
tabl(1, 7) = Page_saisie.T_real.Value
tabl(1, 8) = Page_saisie.Statut.Value
tabl(1, 9) = Page_saisie.Description_dep.Value
tabl(1, 10) = Page_saisie.Nom_tech.Value
tabl(1, 11) = Page_saisie.Commentaire.Value
tabl(1, 12) = Page_saisie.Priorite.Value
tabl(1, 13) = Page_saisie.Cout.Value
' commum
L = Feuil1.Range("a65536").End(xlUp).Offset(1, 0).Row
Feuil1.Cells(L, 1).Resize(, 13) = tabl
L = Feuil4.Range("a65536").End(xlUp).Offset(1, 0).Row
Feuil4.Cells(L, 1).Resize(, 13) = tabl
If Valid_Prev.Value Then
' complément
ReDim tabl(1 To 1, 1 To 4)
tabl(1, 1) = Page_saisie.Preventif1.Value
tabl(1, 2) = Page_saisie.Preventif2.Value
tabl(1, 3) = Page_saisie.Preventif3.Value
tabl(1, 4) = Page_saisie.Preventif4.Value
Feuil4.Cells(L, 14).Resize(, 4) = tabl
End If
End IfLe code fonctionne à l'envers comme Eriiic l'avais supputé, mais je pensais qu'il fallait imbriqué une If Valid_Prev.Value
Manque de pot c'est pas aussi simple.
Du coup comment faire fonctionné le code pour que:
Si coché, feuil1 + feuil4
Si non coché : feuil1 uniquement ?
Merci
Dim sh As Worksheet, L As Long, tabl()
ReDim tabl(1 To 1, 1 To 13)
If MsgBox("Confirmer la création d'une nouvelle panne ?", vbYesNo, "Demande de confirmation") = vbYes Then
tabl(1, 1) = Page_saisie.Num_Inter.Value
tabl(1, 2) = Page_saisie.Materiel.Value
tabl(1, 3) = Page_saisie.Unite_prod.Value
tabl(1, 4) = Page_saisie.Date_demande.Value
tabl(1, 5) = Page_saisie.Date_prevue.Value
tabl(1, 6) = Page_saisie.Date_realisation.Value
tabl(1, 7) = Page_saisie.T_real.Value
tabl(1, 8) = Page_saisie.Statut.Value
tabl(1, 9) = Page_saisie.Description_dep.Value
tabl(1, 10) = Page_saisie.Nom_tech.Value
tabl(1, 11) = Page_saisie.Commentaire.Value
tabl(1, 12) = Page_saisie.Priorite.Value
tabl(1, 13) = Page_saisie.Cout.Value
' commum
L = Feuil1.Range("a65536").End(xlUp).Offset(1, 0).Row
Feuil1.Cells(L, 1).Resize(, 13) = tabl
If Valid_Prev.Value Then
L = Feuil4.Range("a65536").End(xlUp).Offset(1, 0).Row
Feuil4.Cells(L, 1).Resize(, 13) = tabl
' complément
ReDim tabl(1 To 1, 1 To 4)
tabl(1, 1) = Page_saisie.Preventif1.Value
tabl(1, 2) = Page_saisie.Preventif2.Value
tabl(1, 3) = Page_saisie.Preventif3.Value
tabl(1, 4) = Page_saisie.Preventif4.Value
Feuil4.Cells(L, 14).Resize(, 4) = tabl
End If
End IfOu, d'ailleurs, je me demande si ceci ne fonctionnerai pas :
Dim sh As Worksheet, L As Long, tabl()
ReDim tabl(1 To 1, 1 To 17)
If MsgBox("Confirmer la création d'une nouvelle panne ?", vbYesNo, "Demande de confirmation") = vbYes Then
tabl(1, 1) = Page_saisie.Num_Inter.Value
tabl(1, 2) = Page_saisie.Materiel.Value
tabl(1, 3) = Page_saisie.Unite_prod.Value
tabl(1, 4) = Page_saisie.Date_demande.Value
tabl(1, 5) = Page_saisie.Date_prevue.Value
tabl(1, 6) = Page_saisie.Date_realisation.Value
tabl(1, 7) = Page_saisie.T_real.Value
tabl(1, 8) = Page_saisie.Statut.Value
tabl(1, 9) = Page_saisie.Description_dep.Value
tabl(1, 10) = Page_saisie.Nom_tech.Value
tabl(1, 11) = Page_saisie.Commentaire.Value
tabl(1, 12) = Page_saisie.Priorite.Value
tabl(1, 13) = Page_saisie.Cout.Value
tabl(1, 14) = Page_saisie.Preventif1.Value
tabl(1, 15) = Page_saisie.Preventif2.Value
tabl(1, 16) = Page_saisie.Preventif3.Value
tabl(1, 17) = Page_saisie.Preventif4.Value
L = Feuil1.Range("a65536").End(xlUp).Offset(1, 0).Row
Feuil1.Cells(L, 1).Resize(, 13) = tabl
If Valid_Prev.Value Then
L = Feuil4.Range("a65536").End(xlUp).Offset(1, 0).Row
Feuil4.Cells(L, 1).Resize(, 17) = tabl
End If
End IfLes deux solutions fonctionnent parfaitement
Le quel serrait à retenir selon vous ( je vous reprécise que je veux améliorer ma façon de coder) ? merci
Max