Problème de fermeture de formulaire, erreur 402

Résolu
MrZurg12 Messages postés 15 Date d'inscription mardi 29 mai 2012 Statut Membre Dernière intervention 20 juillet 2012 - 7 juin 2012 à 15:58
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 8 juin 2012 à 12:02
Bien le bonjour !

Je viens aujourd'hui avec un problème de UserForm, à mon avis parce que je ne sais pas bien parametrer les différents objets.

En gros, voila le contexte:
- j'ouvre un fichier (fichier "source"), dans lequel je vais piocher des données
- je fais apparaitre ces données dans les textboxs de mon USF
- j'ai liés ces textboxs aux cellules de mon fichier, pour que toute modifs dans mon userform implique une modification dans mon fichier excel.
- Une fois que la personne a modifié ce qu'elle souhaite, elle appuie sur le bouton OK, qui ferme le userform, et on retombe sur notre excel où l'on voit que les données ont bien étés importées .

Le problème, c'est que quand j'appuie sur OK, ben ça marche pas ! J'ai le droit à une belle erreur 402 qui me dit "Vous devez d'abord fermer ou cacher la feuille modale de premier plan".
Si j'ai bien compris, excel râle parce que le fichier depuis lequel j'extrais mes données est encore ouvert, et qu'il a un niveau modal hierarchique supérieur (je suis pas sur de bien comprendre les subtilités des hierarchies excel, mais c'est ce que j'ai compris de l'aide). Donc en gros, il faut que je ferme mon fichier excel "source" avant de fermer ma userform.
Mais après coup, j'ai mis ma variable qui contient mon fichier source en public (c'est une variable car le fichier peut changer), et là le fichier se ferme bien, mais j'ai quand même une erreur 402 quand je lui demande test_form.Hide . Alors est-ce que ça veut dire que quelque chose d'autre a un niveau modal supérieur ? Mais quoi donc alors ?

Voici mon code:
Option Explicit
Public xls As Workbook 'variable qui contiendra mon fichier source

Public Function DialogueFichiers() As String 'Cette fonction permet de sélectionner le fichier "source", depuis lequel on va extraire les données
DialogueFichiers = ""
Dim fd As FileDialog
'Crée une boite de dialogue de sélection de fichiers :
Set fd = Application.FileDialog(msoFileDialogFilePicker)

dialog_show:
fd.Show
'limite la sélection à un fichier
If fd.SelectedItems.Count > 1 Then GoTo dialog_show

DialogueFichiers = fd.SelectedItems(1)
Set fd = Nothing
End Function

Public Sub Qexport_test_parcourir()
Dim i As Byte
Dim k As Byte
Dim n As Byte
Const a As Byte = 5 'constante contenant le nombre d'attributs
Dim var(1 To a) As String          'variable dans laquelle on stocke les valeurs à copier
Dim test_source(1 To a) As String      ' variable contenant les cellules "sources"
Dim test_arriv(1 To a) As String    'variable contenant les cellules d'arrivée
Dim test_entete(1 To a) As String 'variable contenant les entetes des colonnes d'arrivées, pour les messages d'erreur
Dim fd_p As String 'chemin d'accès au fichier

fd_p = DialogueFichiers 'on récupère le chemin d'accès au fichier dans la variable fd_p

Workbooks.Open Filename:=(fd_p) 'on ouvre le fichier
Set xls = Workbooks.Open(fd_p)   'instanciation de l'objet (qui devient ici le fichier excel indiqué)

'***********************************************
'on s'occupe maintenant du transfert de données
'***********************************************

n = xls.Worksheets(1).Range("A" & Worksheets(1).Columns("A").Rows.Count).End(xlUp).Row 'n représente le nombre de cellules dans lesquelles il y a quelque chose d'inscrit, en se basant sur l'identifiant du risque
k = 2 'qui représente la ligne a partir de laquelle on peut écrire les valeurs source
i = 1 
ThisWorkbook.Worksheets(2).Range("A" & k).Value = k - 1 'On incrémente le paramètre ID de la base de données

'***Matrice de passage***
'on définit les cellules sources
test_source(1) = ThisWorkbook.Worksheets(3).Range("A4").Value & k
test_source(2) = ThisWorkbook.Worksheets(3).Range("A5").Value & k
test_source(3) = ThisWorkbook.Worksheets(3).Range("A6").Value & k
test_source(4) = ThisWorkbook.Worksheets(3).Range("A7").Value & k
test_source(5) = ThisWorkbook.Worksheets(3).Range("A8").Value & k
'on définit les cellules d'arrivée
test_arriv(1) = ThisWorkbook.Worksheets(3).Range("D4").Value & k
test_arriv(2) = ThisWorkbook.Worksheets(3).Range("D5").Value & k
test_arriv(3) = ThisWorkbook.Worksheets(3).Range("D6").Value & k
test_arriv(4) = ThisWorkbook.Worksheets(3).Range("D7").Value & k
test_arriv(5) = ThisWorkbook.Worksheets(3).Range("D8").Value & k

VBA.UserForms.Add("test_form").Show 'on ouvre le userform

With ThisWorkbook.VBProject.VBComponents("test_form").Designer
        .Controls("num_id_base").Value = ThisWorkbook.Worksheets(2).Range("A" & k).Value 'on donne à la textbox la valeur de la cellule source
        .Controls("num_id_base").RowSource = ThisWorkbook.Worksheets(2).Range("A" & k) 'on lie la textbox à une cellule de mon fichier d'arrivée
        .Controls("subassembly").Value = xls.Worksheets(1).Range(test_source(1)).Value
        .Controls("subassembly").RowSource = ThisWorkbook.Worksheets(2).Range(test_arriv(1))
        .Controls("description").Value = xls.Worksheets(1).Range(test_source(2)).Value
        .Controls("description").RowSource = ThisWorkbook.Worksheets(2).Range(test_arriv(2))
        .Controls("ref").Value = xls.Worksheets(1).Range(test_source(3)).Value
        .Controls("ref").RowSource = ThisWorkbook.Worksheets(2).Range(test_arriv(3))
        .Controls("action_plan").Value = xls.Worksheets(1).Range(test_source(4)).Value
        .Controls("action_plan").RowSource = ThisWorkbook.Worksheets(2).Range(test_arriv(4))
        .Controls("owner").Value = xls.Worksheets(1).Range(test_source(5)).Value
        .Controls("owner").RowSource = ThisWorkbook.Worksheets(2).Range(test_arriv(5))
End With

'On supprime la variable xls, après fermeture du fichier
xls.Close True
Set xls = Nothing

End Sub


Dans le code lié à mon userform, voila ce que j'ai écrit :
Public Sub CommandButton1_Click()

xls.Close True
test_form.Hide
ThisWorkbook.Worksheets(2).Show

End Sub


J'espère que j'ai su expliciter mon problème suffisament clairement pour que vous puissiez m'aider. Merci d'avance !

Z.

14 réponses

bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
8 juin 2012 à 10:27
non, non !
ce n'est pas ce que ton code montre, si je reprend cette ligne

VBA.UserForms.Add("test_form").Show 'on ouvre le userform


cette ligne n'affiche pas un formulaire existant mais cree un formulaire de façon dynamique !

Je ne suis pas sure que tu sache ce que tu fais avec cela ! si tu as déjà créé un formulaire et que tu veux l'afficher la methode est:


load test_form
test_form.show


rien de plus !

pour initialiser la form lors du chargement(load) de celle-ci il faut utiliser l'evenement

UserForm_Initialize()


ce qui donnerait pour ton besoin :

Private Sub UserForm_Initialize()
With Me
        .Controls("num_id_base").Value = ThisWorkbook.Worksheets(2).Range("A" & k).Value 'on donne à la textbox la valeur de la cellule source
        .Controls("num_id_base").RowSource = ThisWorkbook.Worksheets(2).Range("A" & k) 'on lie la textbox à une cellule de mon fichier d'arrivée
        .subassembly.Value = xls.Worksheets(1).Range(test_source(1)).Value
        .subassembly.RowSource = ThisWorkbook.Worksheets(2).Range(test_arriv(1))
        .description.Value = xls.Worksheets(1).Range(test_source(2)).Value
        'etc
End With
end sub


A+
3
Rejoignez-nous