MrZurg12
Messages postés15Date d'inscriptionmardi 29 mai 2012StatutMembreDernière intervention20 juillet 2012
-
7 juin 2012 à 15:58
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 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 !
bigfish_le vrai
Messages postés1835Date d'inscriptionvendredi 13 mai 2005StatutMembreDernière intervention20 novembre 201313 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
bigfish_le vrai
Messages postés1835Date d'inscriptionvendredi 13 mai 2005StatutMembreDernière intervention20 novembre 201313 8 juin 2012 à 10:29
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
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018220 8 juin 2012 à 11:35
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
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018220 7 juin 2012 à 16:46
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
MrZurg12
Messages postés15Date d'inscriptionmardi 29 mai 2012StatutMembreDernière intervention20 juillet 2012 7 juin 2012 à 17:05
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:
bigfish_le vrai
Messages postés1835Date d'inscriptionvendredi 13 mai 2005StatutMembreDernière intervention20 novembre 201313 7 juin 2012 à 17:19
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
MrZurg12
Messages postés15Date d'inscriptionmardi 29 mai 2012StatutMembreDernière intervention20 juillet 2012 7 juin 2012 à 17:40
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à...
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018220 7 juin 2012 à 17:44
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
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018220 7 juin 2012 à 17:50
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
MrZurg12
Messages postés15Date d'inscriptionmardi 29 mai 2012StatutMembreDernière intervention20 juillet 2012 8 juin 2012 à 09:40
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.
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018220 8 juin 2012 à 10:32
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
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018220 8 juin 2012 à 11:57
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
MrZurg12
Messages postés15Date d'inscriptionmardi 29 mai 2012StatutMembreDernière intervention20 juillet 2012 8 juin 2012 à 11:59
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.
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018220 8 juin 2012 à 12:02
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