Allèger un code

lanetmel Messages postés 200 Date d'inscription   Statut Membre Dernière intervention   -  
lermite222 Messages postés 9042 Statut Contributeur -
Bonjour,

J'ai crée le code suivant mais je sais que c'est beaucoup trop long et je ne sais pas comment regrouper.. Suis-je obliger de déclarer mes variables de cette façon? Aussi quand j'arrive dans la partie avec le Combobox : J'ai les Combobox 3 à 7 dans lesquels les grades1 à 24 peuvent être selectionnés, vis à vis chaque combobox il y a deux textbox à emplir par l'utilisateur. un seul combobox peut-être empli comme les 5 peuvent l'être... Le but est que selon le grade sélectionné dans le combobox, les infos des textbox vont se placer dans une autre feuille.
(+3 colonnes à chaque changement de grade)

Option Explicit
Private Sub CmdOK_Click()
Dim Lign As Long
Dim grade1, grade2, grade3, grade4, grade5, grade6, grade7, grade8, grade9, grade10, grade11, grade12, grade13, grade14, grade15 As Variant
Dim grade16, grade17, grade18, grade19, grade20, grade21, grade22, grade23, grade24 As Variant
grade1 = "Fas"
grade2 = "Fas/1F"
grade3 = "Sel/Reg"
grade4 = "Sel/Sap"
grade5 = "Sel"
grade6 = "1com"
grade7 = "1com/1W"
grade8 = "1com2W"
grade9 = "1com"
grade10 = "1com Sap"
grade11 = "1com Reg"
grade12 = "2com"
grade13 = "2com Sap"
grade14 = "2com Reg"
grade15 = "3com"
grade16 = "3com Sap"
grade17 = "3com Reg"
grade18 = "3B"
grade19 = "palette"
grade20 = "inconnu1"
grade21 = "inconnu2"
grade22 = "inconnu3"
grade23 = "inconnu4"
grade24 = "inconnu5"

'--- en feuil Infos va chercher la ligne vide.....
With Sheets("Infos")
'......comprise entre la ligne 5 et la dernière ligne remplie
For Lign = 5 To .Range("a" & Rows.Count).End(xlUp).Row + 1
'.... s'il n'y a pas d'erreur (déclenchée par une formule)
If IsError(.Cells(Lign, 1)) Then
'si elle est vide alors...
ElseIf .Cells(Lign, 1) = "" Then
'on écrit dedans !!!
.Cells(Lign, 1) = (TextBox3.Value)
.Cells(Lign, 2) = (TextBox4.Value)
.Cells(Lign, 4) = (ComboBox2.Value)
.Cells(Lign, 3) = (TextBox5.Value)
.Cells(Lign, 5) = (ComboBox1.Value)
.Cells(Lign, 6) = (TextBox18.Value)
.Cells(Lign, 7) = (ComboBox8.Value)
.Cells(Lign, 8) = (ComboBox9.Value)
.Cells(Lign, 85) = (ComboBox10.Value)
.Cells(Lign, 86) = (TextBox16.Value)
.Cells(Lign, 191) = (TextBox19.Value)
If ComboBox3.Value = grade1 Then
.Cells(Lign, 10) = (TextBox7.Value)
.Cells(Lign, 11) = (TextBox12.Value)
If ComboBox3.Value = grade2 Then
.Cells(Lign, 13) = (TextBox7.Value)
.Cells(Lign, 14) = (TextBox12.Value)
Exit For
End If
End If
End If
Next Lign
End With
Unload Me
End Sub

Private Sub CmdAnnuler_Click()
Unload Me
End Sub

ça fonctionne de cette façon mais je me dis qu'il y a un moyen pour regrouper tout ça au lieu d'écrire les 72 possibilités...

merci à l'avance

2 réponses

  1. lanetmel Messages postés 200 Date d'inscription   Statut Membre Dernière intervention   4
     
    On M'a aidé en message privé! Voici la réponse

    Option Explicit

    Private Sub cmdok_click()
    Dim Lign As Long
    Dim col1, col2, col3, col4, col5 As Integer
    col1 = (ComboBox4.ListIndex * 2) + 11
    col2 = (ComboBox5.ListIndex * 2) + 11
    col3 = (ComboBox6.ListIndex * 2) + 11
    col4 = (ComboBox7.ListIndex * 2) + 11
    col5 = (ComboBox3.ListIndex * 2) + 11

    '--- en feuil Infos va chercher la ligne vide.....
    With Sheets("Infos")
    '......comprise entre la ligne 5 et la dernière ligne remplie
    For Lign = 5 To .Range("a" & Rows.Count).End(xlUp).Row + 1
    '.... s'il n'y a pas d'erreur (déclenchée par une formule)
    If IsError(.Cells(Lign, 1)) Then
    'si elle est vide alors...
    ElseIf .Cells(Lign, 1) = "" Then
    'on écrit dedans !!!
    .Cells(Lign, 1) = (TextBox3.Value)
    .Cells(Lign, 2) = (TextBox4.Value)
    .Cells(Lign, 3) = (TextBox5.Value)
    .Cells(Lign, 61) = (TextBox20.Value)
    .Cells(Lign, 66) = (TextBox21.Value)
    .Cells(Lign, 4) = (ComboBox2.Value)
    .Cells(Lign, 5) = (ComboBox12.Value)
    .Cells(Lign, 6) = (ComboBox1.Value)
    .Cells(Lign, 7) = (TextBox18.Value)
    .Cells(Lign, 8) = (ComboBox8.Value)
    .Cells(Lign, 9) = (ComboBox9.Value)
    .Cells(Lign, 63) = (ComboBox10.Value)
    .Cells(Lign, 64) = (TextBox16.Value)
    .Cells(Lign, 65) = (ComboBox13.Value)
    .Cells(Lign, 150) = (TextBox19.Value)
    .Cells(Lign, col1) = (TextBox7.Value)
    .Cells(Lign, col1 + 1) = (TextBox12.Value)
    .Cells(Lign, col2) = (TextBox8.Value)
    .Cells(Lign, col2 + 1) = (TextBox15.Value)
    .Cells(Lign, col3) = (TextBox9.Value)
    .Cells(Lign, col3 + 1) = (TextBox14.Value)
    .Cells(Lign, col4) = (TextBox10.Value)
    .Cells(Lign, col4 + 1) = (TextBox13.Value)
    .Cells(Lign, col5) = (TextBox6.Value)
    .Cells(Lign, col5 + 1) = (TextBox11.Value)
    .Cells(Lign, 60) = (ComboBox11.Value)
    .Cells(Lign, 163) = (TextBox23.Value)
    .Cells(Lign, 164) = (TextBox24.Value * TextBox20.Value)
    Exit For
    End If
    Next Lign
    End With
    Unload Me
    End Sub

    Private Sub CmdAnnuler_Click()
    Unload Me

    Si ça peut aider d'autres personnes!
    0
  2. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Re,
    Oui mais... Y a encore moyen d'optimiser
    Dans tout les Tag des contrôles du UF tu met la colonnes de destination, par exemple
    dans TextBox3.tag tu met 1
    TextBox4.tag tu met 2
    TextBox5.tag tu met 3
    TextBox20.tag tu met 6
    TextBox21.tag tu met 66
    ComboBox2.tag tu met 4
    ComboBox12.tag tu met 5
    etc.. pour tous
    Et la macro devient..
    Private Sub cmdok_click() 
    Dim Lign As Long, Ctl As Control 
    '--- en feuil Infos va chercher la ligne vide..... 
        With Sheets("Infos") 
            For Lign = 5 To .Range("a" & Rows.Count).End(xlUp).Row + 1 
        '.... s'il n'y a pas d'erreur (déclenchée par une formule) 
                If Not IsError(.Cells(Lign, 1)) And .Cells(Lign, 1) = "" Then 
                    Exit For 
                End If 
            Next Lign 
            For Each Ctl In Me.Controls 
                If TypeOf Ctl Is MSForms.ComboBox Then 
                    .Cells(Lign, Ctl.Tag) = (Ctl.ListIndex * 2) + 11 
                ElseIf TypeOf Ctl Is MSForms.TextBox Then 
                    .Cells(Lign, Ctl.Tag) = Ctl.Value 
                End If 
            Next Ctl 
        End With
    End Sub

    Tu voulais "alléger".. beh voila..
    Reste encore la recherche de la ligne, tu à des lignes vides intercalées ?
    A+
    Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
    NOTE : Je ne répond pas aux MP pour les questions techniques.
    0