Problème de fermeture de formulaire, erreur 402 [Résolu]

MrZurg12 15 Messages postés mardi 29 mai 2012Date d'inscription 20 juillet 2012 Dernière intervention - 7 juin 2012 à 15:58 - Dernière réponse : ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention
- 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.
Afficher la suite 

14 réponses

Répondre au sujet
bigfish_le vrai 1839 Messages postés vendredi 13 mai 2005Date d'inscription 20 novembre 2013 Dernière intervention - 8 juin 2012 à 10:27
+3
Utile
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+
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de bigfish_le vrai
bigfish_le vrai 1839 Messages postés vendredi 13 mai 2005Date d'inscription 20 novembre 2013 Dernière intervention - 8 juin 2012 à 10:29
+3
Utile
erratum:


ce qui donnerait pour ton besoin :

Private Sub UserForm_Initialize()
With Me
        .num_id_base.Value = ThisWorkbook.Worksheets(2).Range("A" & k).Value 'on donne à la textbox la valeur de la cellule source
        .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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de bigfish_le vrai
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 8 juin 2012 à 11:35
+3
Utile
Bonjour, bigfish_le_vrai,

Relis tout depuis le début. Tu verras que le nombre d'aberrations est élevé :
1) si ses contrôles sont liés (c'est ce qu'il a dit) :
- ou ils le sont en création
- ou ils le sont dynamiquement
Dans un cas comme dans l'autre, il n'a pas à leur attribuer une valeur par lecture de cellules.
2) faire les choses dans cet ordre est doublement surprenant :
.Controls("num_id_base").Value = ThisWorkbook.Worksheets(2).Range("A" & k).Value ' !!!!! curieux puisque ligne suivante pour lier
.Controls("num_id_base").RowSource = ThisWorkbook.Worksheets(2).Range("A" & k)


3) Sa "création" ne peut, avec sa syntaxe, telle que montrée, que provoquer une erreur, avant même le bloc with et non, comme il le dit, au bloc With
conclusions :
- je ne crois pas qu'il connaisse la portée de ce qu'il écrit. J'ai l'impression de ce qu'il a "assemblé", sans les comprendre, des petit bouts de code (trouvés où ?)
- tout est à reprendre à zéro ete je lui conseille ceci :
--créer "normalement" (depuis l'IDE) son userform non modal et les contrôles qu'il doit contenir (en non modal pour pouvoir aller sur sa feuille sans l'erreur dénoncée au départ)
-- les (les contrôles) lier comme il l'entend ! soit (de préférence et si cellules fixes) en mode création, soit (si non fixes) dynamiquement

De cette manière :
- toute modif sur la feuille entraîne ipso-facto et immédiatement la modif du contrôle lié
- toute modif d'un contrôle lié du userform entraîne ipso-facto celle de la cellule liée. Ces modifications interviennent au lostfocus

PS : nul besoin de charger (load) puis montrer (show). Montrer (show) charge automatiquement.
Voilà.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 7 juin 2012 à 16:46
0
Utile
Bonjour
Si tu veux faire cela, ote donc la propriété modale de ton userform +++>> Showmodal = False

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
MrZurg12 15 Messages postés mardi 29 mai 2012Date d'inscription 20 juillet 2012 Dernière intervention - 7 juin 2012 à 17:05
0
Utile
Bonjour ucfoutu

J'ai oté la propriété showmodal, et là il se passe quelque chose de surprenant.
Je réussis à ouvrir mon fichier source, mais instantanément après, j'obtiens une erreur 91 "Variance objet ou variable de bloc With non définie" qui pointe sur la première la première ligne à l'intérieur de ce With:
With ThisWorkbook.VBProject.VBComponents("risk_form").Designer
        .Controls("num_id_base").Value = ThisWorkbook.Worksheets(2).Range("A" & k).Value
        .Controls("num_id_base").RowSource = ThisWorkbook.Worksheets(2).Range("A" & k)
        .Controls("subassembly").Value = xls.Worksheets(1).Range(test_source(1)).Value
        .Controls("subassembly").RowSource = ThisWorkbook.Worksheets(2).Range(test_arriv(1))
        .Controls("risk_description").Value = xls.Worksheets(1).Range(test_source(2)).Value
        .Controls("risk_description").RowSource = ThisWorkbook.Worksheets(2).Range(test_arriv(2))
        .Controls("risk_ref").Value = xls.Worksheets(1).Range(test_source(3)).Value
        .Controls("risk_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("risk_owner").Value = xls.Worksheets(1).Range(test_source(5)).Value
        .Controls("risk_owner").RowSource = ThisWorkbook.Worksheets(2).Range(test_arriv(5))
End With


Je ne comprends pas, parce que lorsque ShowModal = True, il comprend très bien ce With...
En tout cas, merci de m'aider :)
Commenter la réponse de MrZurg12
bigfish_le vrai 1839 Messages postés vendredi 13 mai 2005Date d'inscription 20 novembre 2013 Dernière intervention - 7 juin 2012 à 17:19
0
Utile
Salut,

je ne connais pas grand chose de la collection "VBcomponents" mais ce que je sais c'est que lors de l'utilisation de la propriété "Designer" d'un VBcomponent de type form une "DesignerWindow" (fenetre de conception) est ouverte mais non visible.

Pour le savoir ajoute les quelques lignes plus bas:
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

with ThisWorkbook.VBProject.VBComponents("test_form")
 if .HasOpenDesigner=true then .DesignerWindow.Visible=true
end with


/!\ code non testé /!\

A+
Commenter la réponse de bigfish_le vrai
MrZurg12 15 Messages postés mardi 29 mai 2012Date d'inscription 20 juillet 2012 Dernière intervention - 7 juin 2012 à 17:40
0
Utile
Salut Bigfish,

J'ai essayé ton code, mais ça n'a pas l'air de marcher. J'ai d'abord essayé en le mettant à la fin, comme inscrit dans ton message, mais le programme bloque avant.
Je l'ai ensuite mis avant le with, et j'ai la même erreur. J'ai essayé en faisant du pas à pas avec F8, et lorsque l'on passe sur tes 3 lignes il ne se passe rien (enfin il ne bloque pas, il passe à la ligne suivante), mais il bloque quand même en arrivant sur mon with.
Ca c'est dans le cas où je laisse ShowModal = False

Dans le cas où ShowModal=True, le problème est le même qu'au départ, j'ai toujours cette erreur 402. Ton code ne fait pas apparaitre de designer window (que je le mette avant ou après), donc je suppose que ça ne vient pas de là...
Commenter la réponse de MrZurg12
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 7 juin 2012 à 17:44
0
Utile
Peux-tu nous parler avec plus de précision de chacun de ces contrôles ?
Quel type ? Activex ? autre ? placés sur quoi ?


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 7 juin 2012 à 17:50
0
Utile
Et peux-tu également nous dire pourquoi tu as choisi de créer dynamiquement ce userform plutôt qu'en création normale ? Quelle raison impérieuse d'agir aussi lourdement ?

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
MrZurg12 15 Messages postés mardi 29 mai 2012Date d'inscription 20 juillet 2012 Dernière intervention - 8 juin 2012 à 09:40
0
Utile
Bonjour !

Les 5 contrôles concernés sont des "textbox", pas en Activex, de simples controles de formulaire. Ils sont placés sur un UserForm, qui contient beaucoup d'autres textbox, checkboxes et zone de liste modifiable, mais je ne leur ai pas affecté de valeur, je voulais d'abord vérifier que mon code marche sur 5 champs.
Sur ce Userform, il y a mon bouton OK, qui est censé valider et enregistrer les modifs.

Alors j'ai fait d'autres essais avec la commande de mon bouton ok.
Au départ j'ai:
Public Sub CommandButton1_Click()

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

End Sub

J'ai essayé de placer test_form.Hide avant xls.Close True, mais ça ne marche pas non plus. J'ai essayé avec Unload:
Public Sub CommandButton1_Click()

Unload test_form
xls.Close True
Workbooks("fichier.xlsm").Worksheets(2).Show

End Sub

Où fichier.xlsm est le fichier d'arrivée. J'ai essayé cette formulation parce que ça ne marchait pas avec ThisWorkbook, mais ça ne marche pas non plus. On obtient une erreur 438:"Propriéte ou objet non géré par cet objet" qui pointe sur Workbooks("fichier.xlsm").Worksheets(2).Show

Je ne suis pas sur de comprendre ce que tu veux dire par "création normale". Ce serait, plutôt que de faire apparaître un UserForm, mettre ces mêmes contrôles sur une feuille excel et rediriger automatiquement l'utilisateur vers ma feuille avec les contrôles lorsqu'il lance la macro ?
Je dois dire que j'ai pas réflechis en terme de lourdeur de programme, mais plutôt parce que je me suis rendu compte que lorsque l'UserForm est affiché, le fichier source est affiché derrière, et je trouve ça pratique pour l'utilisateur.
Après effectivement, si aucune solution n'est trouvé, je me pencherai probablement là-dessus. Mais je preferai utiliser mon formulaire.
Commenter la réponse de MrZurg12
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 8 juin 2012 à 10:32
0
Utile
J'ai bien l'impression de ce que tu confonds tout !
1) tes textboxes sur ton userform sont donc bien des activex
2) quelle est dans ton esprit la signification de cette ligne (qui "tend" à une opération) d'ajout (assez bizarre et forcément en erreur) :
VBA.UserForms.Add("test_form").Show 'on ouvre le userform

Où as-tu ramassé ce drôle de bout de code (sans, probablement "ramasser" ce qui devait l'accompagner ?) ?
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 8 juin 2012 à 11:57
0
Utile
regarde en plus comment il "lie dynamiquement" ses textboxes !
Même cela est faux, s'agissant de textboxes !


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
MrZurg12 15 Messages postés mardi 29 mai 2012Date d'inscription 20 juillet 2012 Dernière intervention - 8 juin 2012 à 11:59
0
Utile
D'accord je comprend mon erreur ! J'avais trouvé ce code dans un tuto, mais je pensais simplement que j'appelais mon formulaire, pas que je le créais.
Du coup, je n'ai plus de problème d'erreur 402, merci ! Et en plus, l'affichage et les modifications fonctionnent !

Je n'avais pas vu tes commentaires ucfoutu, mais entre temps j'ai résolu mon problème en travaillant à partir de ce que m'a donné Bigfish, et réussi à faire ce que je voulais. Je vais répondre à tes questions, ensuite je t'expliquerai ce que j'ai fait, si ça t'intéresse.
Alors les réponses :
- J'ai trouvé le code VBA.UserForms.Add("test_form").Show dans ce tuto, mais je n'en avais effectivement pas compris la portée. Je pensais simplement faire apparaitre mon userform, je ne pensais pas le créer dynamiquement.
- Ce que je voulais faire avec le Rowsource (ControlSource en fait pour les textbox): je voulais faire apparaitre la valeur source dans ma textbox (qui est contenue dans le fichier que l'utilisateur designe avec la fonction DialogueFichiers, ici monfichier.xlsx), modifier cette valeur si besoin est (toujours dans ma textbox) et que la modification s'enregistre dans la cellule concernée (désignée par Rowsource, dans le classeur qui contient le UserForm). Sauf que effectivement c'est débile, je m'en suis rendu compte. Encore une fois, je n'avais pas vraiment compris ce qu'était ControlSource, mais j'ai pu corriger le problème, comme vous pouvez le voir ci-dessous.

Voila mes codes mis à jour :
Option Explicit
Global Const a As Byte = 5 'constante contenant le nombre d'attributs
Global xls As Workbook
Global k As Byte
Global test_source(1 To a) As String      ' variable contenant les cellules "sources"
Global test_arriv(1 To a) As String    'variable contenant les cellules d'arrivée
Global n As Byte

Public Function DialogueFichiers() As String
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 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
Dim bool As Byte 'variable indiquant si oui ou non l'utilisateur veut modifier un champ non obligatoire

'on définit les en-têtes, pour les messages d'erreur
test_entete(1) = ThisWorkbook.Worksheets(3).Range("C4").Value
test_entete(2) = ThisWorkbook.Worksheets(3).Range("C5").Value
test_entete(3) = ThisWorkbook.Worksheets(3).Range("C6").Value
test_entete(4) = ThisWorkbook.Worksheets(3).Range("C7").Value
test_entete(5) = ThisWorkbook.Worksheets(3).Range("C8").Value

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

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

risk_form.Show

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

End Sub


Et dans mon userform:
Private Sub UserForm_Initialize()
With Me
    .num_id_base.Value = ThisWorkbook.Worksheets(2).Range("A" & k).Value
    .subassembly.Value = xls.Worksheets(1).Range(test_source(1)).Value
    .risk_description.Value = xls.Worksheets(1).Range(test_source(2)).Value
    .risk_ref.Value = xls.Worksheets(1).Range(test_source(3)).Value
    .action_plan.Value = xls.Worksheets(1).Range(test_source(4)).Value
    .risk_owner.Value = xls.Worksheets(1).Range(test_source(5)).Value
End With
With ThisWorkbook.Worksheets(2)
    .Range(test_arriv(1)).Value = Me.subassembly.Value
    .Range(test_arriv(2)).Value = Me.risk_description.Value
    .Range(test_arriv(3)).Value = Me.risk_ref.Value
    .Range(test_arriv(4)).Value = Me.action_plan.Value
    .Range(test_arriv(5)).Value = Me.risk_owner.Value
End With
End Sub

Public Sub CommandButton1_Click()

With ThisWorkbook.Worksheets(2)
    .Range(test_arriv(1)).Value = Me.subassembly.Value
    .Range(test_arriv(2)).Value = Me.risk_description.Value
    .Range(test_arriv(3)).Value = Me.risk_ref.Value
    .Range(test_arriv(4)).Value = Me.action_plan.Value
    .Range(test_arriv(5)).Value = Me.risk_owner.Value
End With

k = k + 1

If k = n + 1 Then
    Me.Hide
Else
    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
    With Me
    .num_id_base.Value = ThisWorkbook.Worksheets(2).Range("A" & k).Value
    .subassembly.Value = xls.Worksheets(1).Range(test_source(1)).Value
    .risk_description.Value = xls.Worksheets(1).Range(test_source(2)).Value
    .risk_ref.Value = xls.Worksheets(1).Range(test_source(3)).Value
    .action_plan.Value = xls.Worksheets(1).Range(test_source(4)).Value
    .risk_owner.Value = xls.Worksheets(1).Range(test_source(5)).Value
    End With    
End If

End Sub


Voila ce que ça donne. Je copie la valeur modifiée dans mon classeur lorsque j'appuie sur le bouton, avant d'incrémenter k (c'est à dire de changer de ligne dans mon fichier qui contient les données à extraire). J'ai testé, ça marche nickel.
En tout cas, merci beaucoup pour vos remarques et votre aide à tout les 2. J'ai compris plein de trucs sur les UserForm, et sur les propriétés des objets.

Z.
Commenter la réponse de MrZurg12
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 8 juin 2012 à 12:02
0
Utile
Car il a bien parlé de textboxes et non de listboxes ou comboboxes, hein ...


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.