Allèger un code

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. Contributeur
    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
    1. 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