En ce qui concerne le code, je n'y comprends pas grand chose non plus. Je pense que Nakolito sera la personne la plus adaptée à te répondre.
Désolé
En ce qui concerne le code, je n'y comprends pas grand chose non plus. Je pense que Nakolito sera la personne la plus adaptée à te répondre.
Désolé
Je vais le contacter en mp, ce sera peut-être mieux que de déborder ce sujet qui est différent
Bon courage pour la suite !![]()
derniere mise a jour du code,
+ commentaire
+ condition de savoir si la cellule demandée est vide ou pas
Effectivement avec les commentaires c'est déjà beaucoup mieux pour les novices.
Je vais moins ramer, y'a des trucs qui ne vont pas me servir comme la mise en page ou les entêtes mais je vais pourvoir me servir de quelques choses.
(c'est pas gagné)
il y a des super tutos pour VBA Excel et ACCESS sur developpez.com,n'hésitez pas y aller, meme pour les novices, c'est suffisament clair.
si le problème est résolu ==>![]()
Franchement c'est super Nakolito, Merci beaucoup.
Mais est-ce que je peux pousser le bouchon un peu plus loin?
Sur la fiche client que je t'ai envoyé, en-dessous des informations décrivant le client, on a une partie qui nous donne les dates de visite, le code de la prestation, et les achats éventuels.
Sur le fichier, est-il possible de récupérer la dernière ligne (c'est à dire la date de sa dernière visite) avec ces 3 critères et de les copier à la suite des autres informations? La difficulté (s'il y en a une pour toi Nakolito) est que la première ligne d'en-tête est toujours la même (ligne 11), mais la dernière est aléatoire puisque tous les clients ne suivent pas le même rythme de visites bien évidemment.
Merci
Une précision désolé.
Il y a toujours une date (puisque le client est venu), mais pas forcemment de prestation et d'achat. Peut-on garder le même principe que si la cellule prestation et/ou achat est vide, alors on la remplace par des "_" pour ne pas tout mélanger.
Merci
dans le code, il faut rajouter une ligne dans les en tete pour rajouter "derniere date visite"
et dans les copierColler, il faut en rajouter un avec en parametre de la cellule, l'adresse de la derniere cellule utilisé.
Tu peux mettre une cellule en dynamique, par exemple en mettant
.range("J" & lastRow(colonne J)) ou quelque chose dans le genre, et avec ca, il te trouvera la derniere cellule de la colonne J et te la mettra dans ton tableau.
OK Nakolito çà marche pour créer les en-têtes du fichier, mais pour recopier les données en fonction de la dernière cellule, je bug, je ne sais pas faire.
Merci de ton aide.
PS: si possible j'aimerai avoir les 3 informations (dernière visite, prestation, achat)
J'ai peut-être un petit bout, j'ai fait:
Mais lorsque je lance la macro, il bug sur la ligne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 'Date dernière visite copierColler "B & lastRow(colonne B)", 13 'Prestation copierColler "C & lastRow(colonne C)", 14 'Achat copierColler "E & lastRow(colonne E)", 15
Je suppose qu' il lit la colonne mais il faut qu'il commence à partir de la ligne 12.
Code : Sélectionner tout - Visualiser dans une fenêtre à part If Workbooks(Workbooks.Count).Sheets(2).Range(rangeSource) = "" Then
Est ce que c'est çà?
Et là, je bloque.
Peux-tu me dépanner stp,
Merci beaucoup.
derniere réponse de ma part, desolé.
Si vous avez des question, des tutos sont la pour ca, on s'improvise pas developpeur, il faut bosser et y passer du temps, et se faire faire quelque chose ca aide sur le moment, mais au final, vous n'avez pas saisi la moitié des infos qu'on vous a refilé.
Donc, je met le projet terminé (a mon gout).
Si il manque des trucs, essayer de chercher par vous meme.
Bonjour tout le monde,
Je viens mettre mon grain de sel à ce stade de la discussion mais ne serait il pas mieux de récupérer les valeurs en laissant les classeurs fermés ? (je doi avouer que je n'ai pas lu tous les posts du sujet)mais si ça intéresse, voici un code qui fait celà (sur 500 classeurs ça va mouliner). Il faut exécuter la proc "RecupValeurCellules" en adaptant le chemin du dossier contenant les classeurs . Cette proc récupère le nom, prénom, rue, n°, CP et ville, il faut adapter pour plus de valeurs :
Bon courrage.
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149 Dim ConnectCL As Object Dim Rs As Object Sub ConnectCLasseur(ConnectCL As Object, _ Fichier As String, _ Optional Rs) Set ConnectCL = CreateObject("ADODB.Connection") If Not IsMissing(Rs) Then Set Rs = CreateObject("ADODB.Recordset") End If 'HDR > YES ou NO; entêtes de colonnes 'IMEX > 1 lecture seule, 2 lecture/écriture ConnectCL.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & Fichier & ";" & _ "Extended Properties=""Excel 8.0;HDR=NO;IMEX= 1;""" End Sub Sub RecupValeur(Classeur As String, _ NomFeuille As String, _ Cellule As String, _ ValRetour As String) 'connecxion ConnectCLasseur ConnectCL, Classeur, Rs 'lecture With Rs .CursorType = 1 .LockType = 3 .Open "SELECT * FROM `" & NomFeuille & "$" & _ Cellule & "` ", ConnectCL ValRetour = .Fields(0).Value End With End Sub Function ChargeFichiers(Chemin As String) As String() Dim TableauFichiers() As String Dim Fichier As String Dim I As Integer Fichier = Dir(Chemin) Do While (Len(Fichier) > 0) 'seulement des classeurs Excel If Right(Fichier, 4) = ".xls" Then I = I + 1 ReDim Preserve TableauFichiers(1 To I) TableauFichiers(I) = Fichier End If Fichier = Dir() Loop ChargeFichiers = TableauFichiers() End Function Sub RecupValeurCellules() Dim TblClasseurs() As String Dim TblRetour(1 To 6) As String Dim TblCellule(1 To 6) As String Dim CheminDossier As String Dim NomFeuille As String Dim Cellule As String Dim I As Integer Dim J As Integer Dim K As Integer Dim L As Integer On Error GoTo Fin 'adapter ici le chemin du dossier contenant les classeurs 'récupère dans un tableau les noms des classeurs CheminDossier = "D:\Dossier Classeurs à récuperer\" TblClasseurs = ChargeFichiers(CheminDossier) 'si aucun classeur dans le dossier indiqué If UBound(TblClasseurs()) = 0 Then MsgBox "Aucun classeur trouvé dans le dossier " & CheminDossier Exit Sub End If 'incrément car pas de ligne 0 K = 1 'toutes les feuilles des classeurs doivent avoir le même nom NomFeuille = "COMMERCIAL" TblCellule(1) = "C4:C4" TblCellule(2) = "F4:F4" TblCellule(3) = "C5:C5" TblCellule(4) = "G5:G5" TblCellule(5) = "C6:C6" TblCellule(6) = "E6:E6" 'boucle sur tous les classeurs For I = 1 To UBound(TblClasseurs()) 'boucle sur les différentes cellules For J = 1 To 6 RecupValeur CheminDossier & TblClasseurs(I), _ NomFeuille, _ TblCellule(J), _ TblRetour(J) Next J 'inscrit les valeurs dans la feuille "Feuil1" du classeur où se trouve 'cette proc For J = 1 To 6 ThisWorkbook.Worksheets("Feuil1").Cells(K, J) = TblRetour(J) Next J Erase TblRetour() 'incrémente pour la ligne suivante K = K + 1 Next I Fin: ConnectCL.Close Set Rs = Nothing Set ConnectCL = Nothing Exit Sub If Err.Number <> 0 Then MsgBox "Erreur de fichier !" End If End Sub
Hervé.
Merci beaucoup Nakolito,
Ce que tu as envoyé fonctionne parfaitement.
Cela va beaucoup nous aider pour notre gestion.
Désolé si j'ai été "un peu" lourd, ou "trop débutant", mais cela m'aurait pris énormement de temps à pouvoir faire ce que tu m'as donné. D'autant plus que je ne sais pas si j'aurais été capable de le faire.
Pour ta réponse Theze, j'ai essayé mais certains codes ne fonctionnaient pas dans mon cas, et comme la solution de Nakolito me convient parfaitement, je n'ai pas approfondi.
Merci.
Je mets la discussion comme "Résolu".
Partager