Optimisation de mon programme

Bonjour à vous,

Je suis novice sur VBA et j'ai du mal pour un programme qui commence à me prendre la tête...

J'ai fouillé sur le forum et ne trouve pas les solutions à mes problèmes.

Je suis entrain de faire un configurateur de voiture et je vous ai créer un exemple qui ressemble presque à l'original pour que vous compreniez mes problèmes.

Le fichier fonction de cette façon :

il y a une interface où l'on vient mettre les choix que l'on veut ( Quantité, masquer ou cacher le prix) des options et lorsque l'on appuie sur le bouton "calculate and adjust" l'offre s'adapte directement aux choix que nous avons fait.

Il y a des options et des sous-options.

Quand un client ne sélectionne pas une option dans l'offre finale nous allons la masquer ou cacher le prix.

Mon programme de cacher les prix fonctionne bien, mais j'ai cependant un problème avec celui du masquage.

Pour masquer il faut mettre un "H" dans la colonne choice de l'interface.

- Dans la capture 1 et dans la 2 vous pouvez voir que je voulais masquer seulement la sous-option 1, mais je ne comprend pas pourquoi la sous-option 2 se masque aussi. Il faut savoir que dans le configurateur il y a par moment des descriptions sous les sous-options ou des lignes vides ou même rien ( une autre sous-option viens directement se mettre à la liste)

- Dans la capture 3, vous pouvez voir que si on masque plusieurs options entière le bandeau de la page suivante remonte. Je voudrai que cela ne vienne pas. Si on masque plusieurs options le bandeau ( mais du même chapitre, car il y a 15 chapitre d'options, la je vous montre que 2) de la page suivante se masque.

- Dans la capture 4, vous pouvez voir que l'option 2.10 ne se masque pas. J'ai tout défini mes variables et tableaux en variant et quand j'essaye de mettre en string plus rien ne fonctionne.. comment faire pour qu'il garde le .10 et pas le reconnaitre en .1?

Si vous arrivez juste à même m'aider pour quelques points cela serait très aimable et j'en serais très reconnaissant.

Meilleures salutations,

Maurer

capture 1 masquage bug capture 2 masquage bug capture 3 masquage bandeau capture 4 bug ref numeric

Bonjour,

très jolies photos. C'est tes vacances ?

Ah, je n'avais pas vu ton fichier

eric

Re,

une fonction qui te retourne les lignes d'une Ref.

Dans l'exemple test je me contente de sélectionner la plage résultante pour faciliter les tests. Fais-en l'usage que tu veux.

Sub test()
    Dim pl As Range
    Set pl = ligOpt("2.10.3")
    If Not pl Is Nothing Then pl.Select
End Sub

Function ligOpt(Ref As String) As Range
    Dim datas, c As Range, lig As Long
    datas = [A1:C1].Resize(Cells(Rows.Count, 3).End(xlUp).Row)
    Set c = Columns(1).Find(Ref, , xlValues, xlWhole)
    If c Is Nothing Then GoTo fin
    lig = c.Row
    If lig <> UBound(datas) Then
        Do While datas(lig + 1, 1) = ""
            lig = lig + 1
            If lig = UBound(datas) Then Exit Do
        Loop
    End If
    Set ligOpt = Range(c, Cells(lig, 1)).EntireRow
    '**********************************************
    ' si tu veux garder affichées les lignes vides du bas sauf une :
    Do While datas(lig - 1, 3) = ""
        lig = lig - 1
    Loop
    '**********************************************
    Set ligOpt = Range(c, Cells(lig, 1)).EntireRow
fin:
End Function

Edit 23:50 : modif code

eric

Bonjour Eric,

Merci de ta réponse.

Je ne comprends pas très bien comment tu peux avoir une plage avec une ligne de départ et une ligne de fin pour qu'il masque.

Peux-tu m'expliquer comment je peux adapter cela à ma sub masquage de mon programme ?

Je dois par moment masquer des options entières qui font par exemple 9 lignes mais par moment aussi une ligne.

Je te remercie en avance,

Meilleures salutations,

Maurer

Bonjour,

commence déjà par tester ce que je t'ai proposé sur différents cas.

Est-ce que ce qui se trouve sélectionné correspond à ce que tu dois masquer ?

eric

J'ai pu faire des tests, il fonctionne bien mais cela ne correspond pas vraiment à ce que j'ai besoin.

Si tu regardes sur la capture, tu peux voir que lorsque j'ai envie qu'il me sélectionne l'option 2.5 il ne prend pas aussi la sous-option...

Comment faire pour lorsque que je veux seulement une sous-option il prenne seulement une sous-option et lorsque qu'il s'agit d'une option entière qu'il prenne toute l'option et sous-option y compris?

Merci pour ton aide j'en suis reconnaissant !

capture

Si tu regardes sur la capture, tu peux voir que lorsque j'ai envie qu'il me sélectionne l'option 2.5

Avec une capture de l'option 2.3, non je ne peux pas voir la 2.5...

A tester :

Sub test()
    Dim pl As Range
    Set pl = ligOpt("2.10")
    If Not pl Is Nothing Then pl.Select
End Sub

Function ligOpt(Ref As String) As Range
    Dim datas, c As Range, lig As Long
    datas = [A1:C1].Resize(Cells(Rows.Count, 3).End(xlUp).Row)
    Set c = Columns(1).Find(Ref, , xlValues, xlWhole)
    If c Is Nothing Then GoTo fin
    lig = c.Row
    If lig <> UBound(datas) Then
        Do While datas(lig + 1, 1) = "" Or Left(datas(lig + 1, 1), Len(Ref)) = Ref
            lig = lig + 1
            If lig = UBound(datas) Then Exit Do
        Loop
    End If
    Set ligOpt = Range(c, Cells(lig, 1)).EntireRow
    '**********************************************
    ' si tu veux garder affichées les lignes vides du bas sauf une :
    Do While datas(lig - 1, 3) = ""
        lig = lig - 1
    Loop
    '**********************************************
    Set ligOpt = Range(c, Cells(lig, 1)).EntireRow
fin:
End Function

eric

Bonjour Eric,

Je te remercie énormément cela marche bien !

Je vais adapter cela pour le masquage à présent.

Une très bonne journée.

Maurer

Est-ce que tu arrives à me dire pourquoi mon bouton "GO" ne fonctionne pas parfaitement ?

Pour lancer mon programme je dois aller dans VBA et lancer manuellement, mais avec un bouton il ne se lance pas ...

Main se lance bien sur le bouton Go.

Par contre tu travailles avec la feuille Interface active. Il faudrait peut-être indiquer à ligOpt() avec quelle feuille elle doit travailler, par défaut c'est l'active.

Et puis :

ligOpt.Hidden = True 'on masque

non. Il faut tester le range qui peut être vide :

if not ligOpt is nothing  then ligOpt.Hidden = True 'on masque

eric

Merci Eric ! Bonne soirée

Rechercher des sujets similaires à "optimisation mon programme"