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