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 If

Tout ç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 Select

Sachant 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 If

Bonjour,

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 If

J'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 If

Comment 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 If

Re , j'étais entrain de t'écrire et t'envoyer le fichier car, il y avait des petits kwaks , je viens de testé ta version corrigé, ça fonctionne à merveille !

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 If

Le 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 If

Ou, 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 If

Les 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

Rechercher des sujets similaires à "simplification code"