Bonjour à tous,
je demande votre aide car je ne me retrouve pas du tout. J'aimerais savoir s'il est possible à partir de mon Userform d'ouvrir un autre classeur et récupérer ou envoyer des données?
Merci à tous de m'aider.
Bonjour à tous,
je demande votre aide car je ne me retrouve pas du tout. J'aimerais savoir s'il est possible à partir de mon Userform d'ouvrir un autre classeur et récupérer ou envoyer des données?
Merci à tous de m'aider.
Il suffit de mettre dans la partie adéquate de ton USF une macro utilisant la méthode Open de la collection Workbooks.
Par exemple
Code : Sélectionner tout - Visualiser dans une fenêtre à part Workbooks.Open "Monfichier.xls"
Salut Menhir,
tous mes respects à toi. Sauf erreur de ma part, j'ai mis le code que tu m'a communiqué sur un bouton de sort sorte à ouvrir l'autre classeur mais sa n'a pas marché. Surement que je me trompe.
Dans mon Userform, il a un formulaire qui contient:
- Nom
- Prénoms
- Date de naissance
- Lieu de naissance
après ces informations je souhaiterais cliquer sur un bouton (qui ferme Userform1 et ouvre Userform2) de sorte à ouvrir un autre classeur et entrer les informations suivantes:
- Pays
- Ville
- BP
- Contact
Grand merci à toi de m'assister
Bonjour Vitalus,
Je pense que tu n'as pas bien renseigné le lien vers le fichier, il ne faut pas simplement écrire son nom mais tout son chemin... Il serait également préférable de lui donner un nom pour que la suite soit bien plus aisée :
Après, pour transférer l'information de ce qu'est wb entre le UserForm1 et le UserForm2, tu peux passer par une variable publique, je pense... :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 Dim wb as WorkBook Dim Nom as String Nom = "Dupont" Application.DisplayAlerts = False 'Ceci va bloquer les éventuelles fenêtres de notification à l'ouverture du fichier Set wb = Workbooks.Open("C:\.....\tonfichier.xls") 'tu ouvres ton fichier et lui donnes le nom "wb", ensuite, rien de plus simple 'Pour écrire "Dupont" (donc le Nom) en "C5" dans la 3ème feuille : wb.Sheets(3).Range("C5").value = Nom Application.DisplayAlerts = True
tout en haut du code de ton UserForm1 :
Tu places cela également dans ton UserForm2 ainsi :
Code : Sélectionner tout - Visualiser dans une fenêtre à part Public wb as WorkBook '(à la place du Dim écrit dans le message précédent)
Dis-moi si ça te va
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Public wb as Workbook Private Sub UserForm_Initialize() 'ici, tu précises que la variable wb du UserForm2 correspond à la variable wb définie dans le UserForm1 Set wb = UserForm1.wb ... End Sub
Quentin
Salut QUENTIN,
je ne crois pas avoir bien compris tes conseils. Je m'en excuse pour cela. Je vais joindre mon doc pour que tu puisse mieux apprécier ce que j'ai fais. Je crois que j'ai foiré.
Mon premier fichier se nomme : TEST1 et le second: wb. Les deux fichier se trouvent sur mon bureau.
Grand merci à toi de m'aider
Bonjour Vitalus,
J'espère avoir réussi à mieux expliquer ma solution ici
NB : N'ayant pas ton 2ème fichier, je ne sais pas là où les infos doivent être écrites et donc le code ne fonctionnera pas comme tu le souhaites, mais je pense qu'avec ce que j'écris ci-dessous, tu devrais pouvoir le faire aisément toi-même !
Remplace le contenu du code de ton USF1 par :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87 Option Explicit Public FichierCible As Workbook Public FichierOrigine As Workbook Private Sub CommandButton1_Click() Dim derlign As Integer With FichierOrigine.Sheets("Feuil1") derlign = .Range("A" & Rows.Count).End(xlUp).Row + 1 .Range("A" & derlign).Value = Me.TextBox1.Value .Range("B" & derlign).Value = Me.TextBox2.Value .Range("C" & derlign).Value = Me.TextBox3.Value 'classement par ordre alphabétique .Sort.SortFields.Clear .Sort.SortFields.Add Key:=Range("A1"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal End With With FichierOrigine.Sheets("Feuil1").Sort .SetRange Range("A2:C100" & derlign) .Header = xlNo .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With Unload Me UserForm1.Show End Sub Private Sub CommandButton2_Click() Unload Me UserForm1.Show End Sub Private Sub CommandButton4_Click() Call OuvrirFichier If FichierCible Is Nothing Then Exit Sub Unload Me UserForm2.Show End Sub Sub OuvrirFichier() Dim Chemin As String 'Objectif : Sélectionner un fichier (celui dont tu parles avec Pays, Ville...) 'Ce Fichier, un classeur Excel, on l'appellera FichierCible (voir la déclaration tout en haut du code) 'On va commencer par aller chercher le fichier voulu : With Application.FileDialog(msoFileDialogFilePicker) 'on utilise la boîte de dialogue pour chercher des fichiers .AllowMultiSelect = False 'Un seul fichier à ouvrir à la fois .InitialFileName = ActiveWorkbook.Path 'la recherche commencera au niveau du classeur actif .Filters.Add "Classeurs Excels", "*.xls,*.xls?", 1 'on force les formats xls et tous les xlsx, xlsm... .Show 'afficher la fenêtre de recherche If .SelectedItems.Count = 0 Then MsgBox "Aucun fichier choisi...", vbExclamation, "Impossible de continuer" Exit Sub Else Chemin = .SelectedItems(1) 'quand tu fermeras cette fenêtre, le chemin du fichier à ouvrir sera End If End With Application.DisplayAlerts = False Set FichierCible = Workbooks.Open(Chemin) Application.DisplayAlerts = True 'Une variable objet (FichierCible) a été créée, elle est associée au fichier que tu as sélectionné 'à partir de maintenant, pour travailler dans ce classeur Excel, il suffit de commencer par FichierCible. 'par exemple : FichierCible.Sheets(1).range("A5:C8").Interior.Color = vbBlue End Sub Private Sub UserForm_Initialize() Set FichierOrigine = ActiveWorkbook 'on va par la suite naviguer entre 2 classeurs, il est important de spécifier dans lequel on travaille 'car par défaut, Sheets(3) signifie ActiveWorkBook.Sheets(3), donc si le classeur actif n'est plus celui d'origine 'alors tout se mélangera... Exactement comme 'Range("C5")' écrira dans la feuille active, il faut spécifier la feuille si tu ne parles pas de celle-la 'il vaut donc bien mieux stocker le classeur actif sous un nom, ici FichierOrigine End Sub
Et celui de ton USF2 par :
Quentin
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 Option Explicit Public FichierCible As Workbook Public FichierOrigine As Workbook Private Sub UserForm_Initialize() 'la variable objet FichierCible est associée au UserForm1, on la duplique ici pour que ce soit plus simple à gérer 'On aurait pu changer le nom, cela n'a pas d'importance. Nota : on l'a déclarée en haut également Set FichierCible = UserForm1.FichierCible 'idem pour le FichierOrigine Set FichierOrigine = UserForm1.FichierOrigine 'Au passage, sache que tant que tu n'as pas déchargé (unload) le UserForm1, tu peux aller chercher toutes les valeurs de ses contrôles 'exemple : 'MsgBox UserForm1.TextBox1.Text 'Il est très important de spécifier dans quel fichier on travaille lorsque l'on écrit par exemple FichierOrigine.Sheets(1)... car 'Sheets(1).Select sélectionnerait la feuille 1 du classeur actif (qui n'est plus forcément celui d'origine...) End Sub Private Sub CommandButton1_Click() 'Je ne sais pas où tu veux lire / écrire des informations dans le FichierCible 'Mais si tu veux écrire le contenu de la TextBox4 dans la cellule A1 la première feuille du classeur cible : FichierCible.Sheets(1).Range("A1").Value = TextBox4.Text 'Ainsi, si tu veux afficher en msgbox le contenu de la cellule J8 de la 3ème feuille du classeur cible : MsgBox FichierCible.Sheets(3).Cells(8, "J").Text 'etc... End Sub
Partager