Macro bancale et user forme non automatique

Bonjour,

Je débute dans le VBA et j'aurais grandement besoin de votre aide sur un soucis que je rencontre avec l'utilisation d'un userform que je viens de créer (je débute...)

Avant de vous exposer mon problème, je vais vous expliquer en 2 lignes le fonctionnement du fichier :

Depuis l'onglet budget, on va chercher toutes les informations situées dans l'onglet plan de maintenance prev pour un produit et un libellé de tâche que nous souhaitons étudier (choix en A16 et B16 avec cascade déroulante).

Afin que les calculs (un peu plus bas) de l'onglet budget puissent s'adapter dynamiquement à différents plan de maintenance qui peuvent changer (variation de colonne etc...), j'ai créé une recherche INDEX qui nécessite de la part de l'utilisateur 2 minutes de configuration : simplement renseigner les numéros de colonne (du plan de maintenance) correspondant aux items qui nous intéressent dans le tableau de configuration de colonne (onglet budget). Une fois les colonne déterminées par l'utilisateur, les recherches INDEX extraient les données et nous obtenons nos calculs...

J'ai créé un userform afin que la configuration des colonnes se fassent directement depuis l'userform (ce qui me permettra plus tard de virer le tableau de configuration et de n'avoir que l'userform, et ça fait un petit côté professionnel très flatteur...

1) Une première macro est faite pour obtenir la liste déroulante lors du choix du produit à étudier. Je ne sais pas du tout si elle est optimisé car c'est un membre du forum qui me l'avait faite et j'ai fais quelques petits changements et elle est peut etre trop complexe pour une simple cascade déroulante (qui présente d'ailleurs dans la colonne produit, sans grande incidence sur la recherche, des doublons... mais tant pis je fais avec :'(((((((((

2) Afin d'effacer les colonnes de choix produit à l'ouverture du fichier(A16 et B17), j'ai rajouter ces lignes

Private Sub Workbook_Open()

Range("A16:B16").Select

Selection.ClearContents

End Sub

sauf qu'après l'ajout de ses lignes, quand j'ouvrais le fichier, il plantait du coup j'ai rajouter une sorte de système anti bug "On Error GoTo Fin" au début de la macro de la cascade déroulante...ça ne fait plus le bug du coup mais j'ai l'impression de faire un peu trop de bidouillage...

3) Afin de configurer les colonnes pour l'utilisation du fichier, je dois passer par la case développeur pour faire lecture et lancer l'user forme... j'ai essayé de créer un bouton et de rattacher le lancement de l'userform mais sans succès.

De plus, lorsque j'ai fais ma configuration des colonnes, si je ferme et ré-ouvre le fichier, et lance mon userform, je dois à nouveau renseigner toutes les colonnes, celui-ci semble prendre sa forme initiale lors de sa création...

Ah oui et j'ai aussi une erreur quand je lance mon userform, car j'ai rajouté une fonction modale pour pouvoir afficher l'user form et pouvoir naviguer dans mes onglets...

Désolé je sais que c'est un peu long mais toutes informations que vous voudrez bien me donner seront bénéfiques pour moi,

Je vous remercie d'avance

Voici le lien de la bête :

Avant de vous exposer mon problème, je vais vous expliquer en 2 lignes le fonctionnement du fichier :

Bonjour Frédo j'adore cette remarque

vais jetais un oeil amateur sur ton fichier

Merci je sens que cela va beaucoup me servir

Oui 2 lignes c'est vrai que j'étais inspiré mais j'ai essayé d'être concis sans être barbant... A voir si j'ai respecté le deal lol

Bonjour,

Après lecture de ton code il me semble qu'il ne peut fonctionner que si le fichier a été enregistré à la fermeture sur l'onglet

"Budget".

Dans le cas contraire ton workbook_open ne va pas modifier les bonnes cellules.

J'ai essayé avec :

Private Sub Workbook_Open()
With Sheets("Budget")
.activate

Range("A16:C16").Select
    Selection.ClearContents
    End With

End Sub

je n'ai pas d'erreur de mon coté

Pour le reste je pense que Ric a déjà résolu

Alors pour vous tenir au courant, j'ai remis mes lignes fastidieuses text box pour correctement afficher les colonnes sur les bonnes lignes (oui la solution de ric est top mais vu que certaines text box ont une numérotation qui n'a pas de logique ça faisait un décalage sur la ligne item.

Mon user forme se lance correctement a l'ouverture du fichier ça c'est top !

Dernière petite chose quand j'enregistre ferme et reouvre le fichier, luser form reviens a sa forme sans valeur ... Est il possible de sauvegarder les données rentrées dans luserform ?

Merci a vous

Re,

Pour être précis :

Tu souhaites qu'à l'ouverture du userform ( donc évènement bouton clic)

le userform se charge avec les derniers renseignements validés ?

Oui voilà parce que c'est un fichier que l'on configure qu'une fois pour l'exploiter. Quand je redémarre il y a 2 colonnes où il est inscrit 44 et le reste vide (d'ailleurs je n'arrive pas a voir à quel moment ces données ont été enregistrées et ou sont elles stockés...). L'idée serait qu'il garde tout ses paramétrages

ok je vois ,

Les infos pour le userform sont bien à de H6 à N9 ?

Pour la ligne formation du userform les infos sont ou ?

Nota le 44 à été tapé directement à la création du userform. donc il affiche toujours 44 pour le moment.

H5 car il a la ligne des formations également,

J'en profite pour une autre question après je ne vous embête plus

Lorsque je vérouiller le tableau non modifiable en bas pour protéger la zone, ma liste déroulante en cascade ne fonctionne plus, vous avez une solution ?

Merci bcp

Bonjour à tous,

...

Private Sub Workbook_Open()
With Sheets("Budget")
.activate

Range("A16:C16").Select
    Selection.ClearContents
    End With

End Sub

...

Bien vu ... excellent >

Je n'avais pas porté attention à ce point.

ric

Bonjour à tous,

Lorsque je vérouiller le tableau non modifiable en bas pour protéger la zone, ma liste déroulante en cascade ne fonctionne plus, vous avez une solution ?

Le code modifié ainsi > si la protection est active, elle restera active.

Si la protection est inactive, elle restera inactive.

Et A16 et B16 fonctionneront que la feuille soit protégée zou pas.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim oSheet As Worksheet
Dim oCell As Range, oRange As Range
Dim sAdresses As String
Dim lRowMin As Long, lRowMax As Long
Dim EtatdelaProtection As Boolean
   'Dim colpas  As Long

   'On s'assure que la cellule modifiée est dans la colonne A et la ligne >=16
If Target.Count = 1 And Target.Column = 1 And Target.Row = 16 Then      '''''>= 16 Then
      If Me.ProtectContents = True Then EtatdelaProtection = True
      Me.Unprotect      ' désactiver la protection
      colpas = Chr(Cells(7, 8).Value + 64)
      On Error GoTo Fin

   'On s'assure qu'une valeur est bien renseignée dans la colonne A
      If Len(Target.Value) > 0 Then
   'On initialise le variable sAdresses
         Set oSheet = ThisWorkbook.Worksheets("Plan de maintenance prév.")
         sAdresses = "='" & oSheet.Name & "'!"
   'On selectionne les lignes de la feuille "Plan de maintenance prev." pour la valeur contenu dans A
         Set oRange = oSheet.UsedRange
         lRowMin = 0
         lRowMax = 0
         If oRange.Rows.Count > 0 Then
            For Each oCell In oRange.Columns(1).Cells
               If oCell.Value2 = Target.Value Then
                  If lRowMin = 0 Then
                     lRowMin = oCell.Row
                     lRowMax = oCell.Row
                  Else
                     If oCell.Row > lRowMax Then
                        lRowMax = oCell.Row
                     End If
                  End If
               End If
            Next
            sAdresses = sAdresses & colpas & lRowMin & ":" & colpas & lRowMax
   ' ='Plan de maintenance prév.'!$A$5:$A$460

   'On ajoute la validation dans la colonne "E"
            Set oCell = Target.Offset(, 1)
            With oCell.Validation
               .Delete
               .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=sAdresses
               .IgnoreBlank = True
               .InCellDropdown = True
               .ShowInput = True
               .ShowError = True
            End With

   'S'il n'y a qu'une valeur dans la liste, on la copie dans la cellule. Sinon on vide la cellule
            If lRowMin = lRowMax And lRowMin > 0 Then
               oCell.Value = oSheet.Range("$H" & lRowMin).Value
            Else
               oCell.Value = ""
            End If
         End If
      End If
   End If

   If EtatdelaProtection = True Then Me.Protect      ' réactiver la protection 1re cas
   Exit Sub
Fin:
   If EtatdelaProtection = True Then Me.Protect      ' réactiver la protection 1re cas
End Sub

ric

merci ric, cela fonctionne parfaitement,

merci à tous pour votre aide )))

Désolé je n'étais pas là hier après midi mais je vois que Ric a résolu le problème

Rechercher des sujets similaires à "macro bancale user forme automatique"