répétitions/ modifications de code (module de classe ???)

sourcier08

XLDnaute Occasionnel
Bonjour à tous,

Je suis confronté à un problème majeur.
Je suis occupé de préparer un fichier pour un inventaire perso et j'ai un soucis concernant les données via un userform.
Je me retrouve avec 16 variables nommées "statx" (ou x est un chiffre), 12 combobox, liés à des checkbox et textbox.
L'idée est bonne et je vois mal comment faire autrement mais le fait de devoir recopier et modifier 11 fois un bout de code me rebute un peu.
J'ai eu beau regarder sur la toile les modules de classes, je n'y comprends rien.

Voici le bout de code du départ et le suivant (que je vais devoir recopier et modifier "x" fois en fonction de mes besoin)
Code:
Set plage = Sheets("choix").Range("Liste5")
    For Each cel In plage
        If cel = ComboBox6.Value Then
        b = cel.Offset(0, -1).Value
        End If
    Next cel
    
    If CheckBox3.Value = True And CheckBox4.Value = False Then
                c = "+"
                ElseIf CheckBox3.Value = False And CheckBox4.Value = True Then
                c = "-"
                ElseIf CheckBox3.Value = False And CheckBox4.Value = False Then
                c = "+"
    End If
    
    If b = "0" Then
        stat1 = ComboBox6.Value
        ElseIf b = "1" Then
        stat1 = ComboBox6.Value & " de " & TextBox6.Value & "%"
        ElseIf b = "2" Then
        stat1 = ComboBox6.Value & " toutes les " & TextBox6.Value & " secondes"
        ElseIf b = "3" Then
        stat1 = c & TextBox6.Value & "% " & ComboBox6.Value
        ElseIf b = "4" Then
        stat1 = ComboBox6.Value & " " & TextBox6.Value & "-" & TextBox7.Value
        ElseIf b = "5" Then
        stat1 = ComboBox6.Value & " " & c & TextBox6.Value & "%"
        ElseIf b = "" Then
        stat1 = c & TextBox6.Value & " " & ComboBox6.Value
    End If

'********************************************

Set plage = Sheets("choix").Range("Liste5")
    For Each cel In plage
        If cel = ComboBox7.Value Then
        b = cel.Offset(0, -1).Value
        End If
    Next cel
    
    If CheckBox5.Value = True And CheckBox6.Value = False Then
                c = "+"
                ElseIf CheckBox5.Value = False And CheckBox6.Value = True Then
                c = "-"
                ElseIf CheckBox5.Value = False And CheckBox6.Value = False Then
                c = "+"
    End If
    
    If b = "0" Then
        stat2 = ComboBox7.Value
        ElseIf b = "1" Then
        stat2 = ComboBox7.Value & " de " & TextBox8.Value & "%"
        ElseIf b = "2" Then
        stat2 = ComboBox7.Value & " toutes les " & TextBox8.Value & " secondes"
        ElseIf b = "3" Then
            If CheckBox5.Value = True And CheckBox6.Value = False Then
                c = "+"
                ElseIf CheckBox5.Value = False And CheckBox6.Value = True Then
                c = "-"
                ElseIf CheckBox5.Value = False And CheckBox6.Value = False Then
                c = "+"
            End If
        stat2 = c & TextBox8.Value & "% " & ComboBox7.Value
        ElseIf b = "4" Then
        stat2 = ComboBox7.Value & " " & TextBox8.Value & "-" & TextBox9.Value
        ElseIf b = "5" Then
        stat2 = ComboBox7.Value & " " & c & TextBox8.Value & "%"
        ElseIf b = "" Then
        stat2 = c & TextBox8.Value & " " & ComboBox7.Value
    End If
' *****************************************************************
La différence entre les deux codes est :

stat1 devient stat2
combobox6 devient combobox7
checkbox3 devient checkbox5
checkbox4 devient checkbox6
textbox6 devient textbox8
textbox7 devient textbox9

Sachant que j'ai à mémoriser les données statx au final pour les utiliser ailleurs.
Comment pourrait-on faire ça via un module de classe (pour pouvoir répéter ça 11 fois)?

Merci d'avance pour l'aide
 

Pièces jointes

  • Diablo2_mules.xlsm
    100.5 KB · Affichages: 42
  • Diablo2_mules.xlsm
    100.5 KB · Affichages: 63
  • Diablo2_mules.xlsm
    100.5 KB · Affichages: 46
Dernière édition:

job75

XLDnaute Barbatruc
Re : répétitions/ modifications de code (module de classe ???)

Bonjour sourcier08,

Un module de classe n'aurait guère d'utilité.

Utilisez le tableau stat au lieu des variables stat1 stat2 stat3...

Code:
Dim stat$(1 To 16) 'en haut
'----
Dim i As Byte, cb As Control 'dans la macro
Dim chb1 As Control, chb2 As Control, tb1 As Control, tb2 As Control

a = ComboBox4
Set plage = Sheets("choix").Range("Liste5")
   
For i = 1 To 12
  
    Set cb = Controls("ComboBox" & 5 + i)
    Set chb1 = Controls("CheckBox" & 1 + 2 * i)
    Set chb2 = Controls("CheckBox" & 2 + 2 * i)
    Set tb1 = Controls("TextBox" & 4 + 2 * i)
    Set tb2 = Controls("TextBox" & 5 + 2 * i)
    
    'recherche valeurs stats
    For Each cel In plage
        If cel = cb Then b = cel.Offset(0, -1)
    Next cel
    
    If chb1 = True And chb2 = False Or chb1 = False And chb2 = False Then
        c = "+"
        ElseIf chb1 = False And chb2 = True Then
        c = "-"
    End If
    
    If b = "0" Then
        stat(i) = cb
        ElseIf b = "1" Then
        stat(i) = cb & " de " & tb1 & "%"
        ElseIf b = "2" Then
        stat(i) = cb & " toutes les " & tb1 & " secondes"
        ElseIf b = "3" Then
        stat(i) = c & tb1 & "% " & cb
        ElseIf b = "4" Then
        stat(i) = cb & " " & tb1 & "-" & tb2
        ElseIf b = "5" Then
        stat(i) = cb & " " & c & tb1 & "%"
        ElseIf b = "" Then
        stat(i) = c & tb1 & " " & cb
    End If

Next
A+
 
Dernière édition:

sourcier08

XLDnaute Occasionnel
Re : répétitions/ modifications de code (module de classe ???)

Merci,

J'ai bossé sur un tableau il y a même pas un mois.
J'aurais du penser à passer par là. Des fois, je mérite des baffes. :confused:
Je continue mes travaux. Je reviendrai présenter le fichier une fois fini.
 

sourcier08

XLDnaute Occasionnel
Re : répétitions/ modifications de code (module de classe ???)

Bonsoir,

Je recueille les infos dont j'ai besoin et ce n'est pas du gâteau mais... je bloque sur une chose.

En restant dans ce même principe, j'aurai besoin qu'à chaque changement d'un combobox, un contrôle soit effectué et qu'en fonction de celui-ci une action se produit sur ce qui est à droite (checkbox + textbox)

Voici ce que j'attends donc avec en exemple les 2 premiers des 12 combobox
Recopier le code 11 fois et le modifier 11 fois aussi ne me plaît pas beaucoup même si ça reste une solution fonctionnelle.

Code:
Private Sub ComboBox6_Change()
Dim plage As Range, cel As Range
Dim b As String

' recherche valeurs stats
Set plage = Sheets("choix").Range("Liste5")
    For Each cel In plage
        If cel = ComboBox6.Value Then
        b = cel.Offset(0, -1).Value
        End If
    Next cel
    If b = "0" Then
        CheckBox3.Visible = False
        CheckBox4.Visible = False
        TextBox6.Visible = False
        TextBox7.Visible = False
        ElseIf b = "4" Then
        TextBox7.Visible = False
    End If
    
End Sub
Code:
Private Sub ComboBox7_Change()
Dim plage As Range, cel As Range
Dim b As String

' recherche valeurs stats
Set plage = Sheets("choix").Range("Liste5")
    For Each cel In plage
        If cel = ComboBox7.Value Then
        b = cel.Offset(0, -1).Value
        End If
    Next cel
    If b = "0" Then
        CheckBox5.Visible = False
        CheckBox6.Visible = False
        TextBox8.Visible = False
        TextBox9.Visible = False
        ElseIf b = "4" Then
        TextBox9.Visible = False
    End If
    
End Sub

Quelle est le moyen d'arriver à ce résultat ?
 

job75

XLDnaute Barbatruc
Re : répétitions/ modifications de code (module de classe ???)

Bonsoir sourcier08,

Dans le code de l'USF utilisez une macro paramétrée :

Code:
Private Sub ComboBox6_Change()
Masque 1
End Sub

Private Sub ComboBox7_Change()
Masque 2
End Sub

'-----------

Sub Masque(i As Byte)
Dim plage As Range, cel As Range
Dim b As String

' recherche valeurs stats
Set plage = Sheets("choix").Range("Liste5")
    For Each cel In plage
        If cel = Controls("ComboBox" & 5 + i) Then
        b = cel.Offset(0, -1)
        End If
    Next cel
    If b = "0" Then
        Controls("CheckBox" & 1 + 2 * i).Visible = False
        Controls("CheckBox" & 2 + 2 * i).Visible = False
        Controls("TextBox" & 4 + 2 * i).Visible = False
        Controls("TextBox" & 5 + 2 * i).Visible = False
        ElseIf b = "4" Then
        Controls("TextBox" & 5 + 2 * i).Visible = False
    End If
End Sub
A+
 

job75

XLDnaute Barbatruc
Re : répétitions/ modifications de code (module de classe ???)

Bonjour,

Pas bête du tout.

Pas bête non plus de remplacer le laborieux :

Code:
' recherche valeurs stats
Set plage = Sheets("choix").Range("Liste5")
    For Each cel In plage
        If cel = Controls("ComboBox" & 5 + i) Then
        b = cel.Offset(0, -1)
        End If
    Next ce
par :

Code:
' recherche valeurs stats
With Controls("ComboBox" & 5 + i)
  If .ListIndex > -1 Then b = [Liste5].Cells(.ListIndex + 1, 0)
End With
Edit : mieux, dans la mesure où il n'y a rien en B35 de la feuille "choix" :

Code:
' recherche valeurs stats
b = [Liste5].Cells(Controls("ComboBox" & 5 + i).ListIndex + 1, 0)
A+
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : répétitions/ modifications de code (module de classe ???)

Re,

Maintenant, puisque vous vous intéressez aux modules de classe, créez en un et mettez-y :

Code:
Public WithEvents CB As MSForms.ComboBox

Private Sub CB_Change()
Dim b As String, i As Byte

' recherche valeurs stats
b = [Liste5].Cells(CB.ListIndex + 1, 0)
    
i = Replace(CB.Name, "ComboBox", "") - 5

With CB.Parent
    If b = "0" Then
        .Controls("CheckBox" & 1 + 2 * i).Visible = False
        .Controls("CheckBox" & 2 + 2 * i).Visible = False
        .Controls("TextBox" & 4 + 2 * i).Visible = False
        .Controls("TextBox" & 5 + 2 * i).Visible = False
        ElseIf b = "4" Then
        .Controls("TextBox" & 5 + 2 * i).Visible = False
    End If
End With
End Sub
Pour l'initialiser avec les 12 ComboBox, mettez dans le code de l'USF :

Code:
Dim CB(11) As New Classe1 'en haut

'------

Private Sub UserForm_Initialize()
Dim n As Byte
For n = 0 To 11
  Set CB(n).CB = Controls("ComboBox" & n + 6)
Next
End Sub
Plus besoin de macro Change pour les ComboBox.

A+
 

ChTi160

XLDnaute Barbatruc
Re : répétitions/ modifications de code (module de classe ???)

Bonjour sourcier08
Bonjour job75
Bonjour Le Fil
Bonjour le Forum

juste pour participer lol
une question que fait la macro si b est différent de 0 et 4 ?
y a t'il pas besoin par exemple d'un Else
voila ce que j'avais mis avant que Job75 ne passe par un module de classe.
Code:
If b = 0 Then
        Controls("CheckBox" & 1 + 2 * i).Visible = IIf(b = 0, False, True)
        Controls("CheckBox" & 2 + 2 * i).Visible = IIf(b = 0, False, True)
        Controls("TextBox" & 4 + 2 * i).Visible = IIf(b = 0, False, True)
        Controls("TextBox" & 5 + 2 * i).Visible = IIf(b = 0, False, True)
       ElseIf b = 4 Then
        Controls("TextBox" & 5 + 2 * i).Visible = IIf(b = 4, False, True)
       Else
        Controls("CheckBox" & 1 + 2 * i).Visible = True
        Controls("CheckBox" & 2 + 2 * i).Visible = True
        Controls("TextBox" & 4 + 2 * i).Visible = True
        Controls("TextBox" & 5 + 2 * i).Visible = True
    End If
peut être n'ai je pas tout compris lol
Bonne continuation
Amicalement
Jean Marie
 
Dernière édition:

sourcier08

XLDnaute Occasionnel
Re : répétitions/ modifications de code (module de classe ???)

Bonsoir,

Je ne suis pas revenu depuis ce matin, ma réponse de remerciements.

B35 de l'onglet choix n'a rien effectivement.

Je suis surtout occupé par la récupération de données actuellement. Je dois tout rentrer manuellement, dans l'onglet "choix" avant de rendre mon fichier opérationnel. Vous pourrez voir une nette amélioration entre le premier fichier fournis et celui-ci. Pour l'heure, je n'ai renseigné que gants, bottes, ceintures, amulettes et anneaux. J'ai de longues heures devant moi, pour tout organiser correctement.

C'est encore un gros chantier, que je dois optimiser mais je vous fournis le fichier tel qu'il est à l'heure actuelle. Histoire que vous vous amusez à regarder où j'en suis.

Et j'ai du ajouter d'autres fonctionnalités de dernières minutes. Plus on avance, plus on se rend compte qu'il y a des choses à améliorer. (Donc 0 et 4 c'est dépassé ^^)

Vous aurez certainement compris que ce fichier me sert à faire l'inventaire des objets en ma possession. Mais ça ne s'arrête pas là, il me sert surtout à avoir un bon rendu pour une recherche ciblée. Et de pouvoir donc mieux voir ce que je cherche. J'ajouterai par la suite la recherche avec le genre et l'inventaire complet et certainement par nom pour gain de temps. Pour l'heure, seul la recherche par type fonctionne.

Pourquoi vouloir créer un tel fichier ? Parce que les connexions/déconnexions aux différents comptes finissent toujours par me positionner en realm down pour un certain temps, pouvant aller jusqu'à 48h, et donc de ne plus pouvoir jouer.
En listant les objets dans des fichiers inventaires, s'il me faut un objet précis, je peux le chercher via celui-ci puis me connecter au bon compte et au on personnage, réduisant fortement les chance de finir sur la touche quelques temps.

Vous pourrez toujours faire une recherche d'objet sur "Trick_pal" en choisissant le type Amulette, Anneau ou Joyau pour voir le résultat d'une recherche sur un de mes personnages.

Les textbox de l'usf1 qui restent vident sont des valeurs variables (à rentrer manuellement, en fonction de ce qui se trouve sur l'objet en question).


Merci à tous deux.
 

Pièces jointes

  • Diablo2_mules.xlsm
    693.3 KB · Affichages: 31
  • Diablo2_mules.xlsm
    693.3 KB · Affichages: 37
  • Diablo2_mules.xlsm
    693.3 KB · Affichages: 47
Dernière édition:

Membres actuellement en ligne

Statistiques des forums

Discussions
312 177
Messages
2 085 972
Membres
103 073
dernier inscrit
MSCHOE16