Besoin d'aide : macro VBA

FloR54 -  
michel_m Messages postés 16602 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour à tous

Je cherche un code en VBA pour une macro pour mon travail.

J'ai un répertoire avec plusieurs classeurs excel. Chaque classeur à un nom différent mais la forme du fichier est le même pour tous (un tableau dans lequel je rentre mes informations).

J'aimerais, à partir d'un autre classeur « recap », récupérer les cellules C6, C81 et C83 de chaque classeur de ce répertoire sans les ouvrir. Ce qui serait génial c'est d'avoir les 3 données de ces 3 cellules, les unes en dessous des autres (donc 3 colonnes et autant de lignes que de classeurs dans le répertoire).

Je n'ai pas de connaissance en VBA et cherche tant bien que mal à comprendre sur les forum comment cela marche. A chaque fois que je teste un code, il y a toujours quelques choses qui ne va pas.

Je serais très reconnaissant aux personnes qui voudront bien m'aider !!

Merci à TOUS




9 réponses

michel_m Messages postés 16602 Date d'inscription   Statut Contributeur Dernière intervention   3 314
 
Bonjour,

macro à mettre dans un module VBA du classeur recapitulatif
le classeur "recapitatif" et les classeurs source doivent être dans le m^me répertoire

tu n'avais pas précisé dans quelle feuille étaient C6,C81,C83: à adapter dans la macro

Sub recapituler() 
Dim lig As Long 
Dim recap As String, chemin As String, onglet As String 
Dim fich As String 

recap = ThisWorkbook.Name 
onglet = "feuil1" ' A ADAPTER 
chemin = ThisWorkbook.Path 
Application.ScreenUpdating = False 
Range("A2:C1000").ClearContents 
lig = 2 

ChDir chemin 
fich = Dir("*.xls") 
While fich <> "" 
    If fich <> recap Then 
        Cells(lig, 1) = ExecuteExcel4Macro("'" & chemin & "\[" & fich & "]" & onglet & "'!R6C3")  'R6C3 <==> C6 
        Cells(lig, 2) = ExecuteExcel4Macro("'" & chemin & "\[" & fich & "]" & onglet & "'!R81C3") 'R81C3<==>C81 
        Cells(lig, 3) = ExecuteExcel4Macro("'" & chemin & "\[" & fich & "]" & onglet & "'!R83C3") 
    lig = lig + 1 
    End If 
    fich = Dir 
Wend 

MsgBox "récapitulatif  terminé avec succès" 
End Sub


tu dis...

Michel
:-x
0
lermite222 Messages postés 8724 Date d'inscription   Statut Contributeur Dernière intervention   1 191
 
Bonjour,
Comme tu dis que tu ne connaît pas le VBA je vais essayer d'être clair.
Déjà, lire dans un classeur sans l'ouvrir est trop compliquer, les ouvrir et fermer directement pose moins de problème.
Il faut que tout les classeurs à ouvrir aient une feuille avec le même nom.
Marche à suivre...
1°) Sur la feuille de ton classeur Recap où tu veux voir les données tu colle un bouton de la barre d'outils (pas formulaire)
2°) Tu clic droit sur le nom de l'onglet > Visualiser le code.
Dans la fenêtre qui s'ouvre tu colle TOUT le code ci-dessous.

Option Explicit 

Private Sub CommandButton1_Click() 
Dim e As Integer 
    e = LireRepertoir("C:\Le chemin\complet du répertoir\") 
End Sub 

'Obtenir tous les fichiers d'un répertoire.
'Le nom du répertoire source doit être dans Rep 
Function LireRepertoir(ByVal Rep As String) As Integer 
Dim Obj, RepP, F, S, sf, F1, Fsous 
Dim i As Integer, Ext As String 
Dim Chem As String 
Dim Lig As Double 
Dim Wsh As Worksheet 
Dim WshData As Worksheet 
    Set Wsh = ActiveWorkbook.ActiveSheet 
    Lig = 3 'commence la copie à la ligne 3 
    Application.EnableEvents = False 
    Application.DisplayAlerts = False 
    Set Obj = CreateObject("Scripting.FileSystemObject") 
    Set RepP = Obj.Getfolder(Rep) 
    Chem = Rep: If Right(Chem, 1) <> "\" Then Chem = Chem & "\" 
    Set F = RepP.Files 
    For Each F1 In F 
        Ext = LCase(Right(F1.Name, 3)) 
        If Ext = "xls" Then  'extension à adapter (en minuscule) 
            Workbooks.Open F1.Name 
            'Adapter le nom de la feuille où sont les données 
            Set WshData = ActiveWorkbook.Sheets("feuil1") 
            Wsh.Cells(Lig, 1) = F1.Name 
            Wsh.Cells(Lig, 2) = WshData.Range("C6") 
            Wsh.Cells(Lig, 3) = WshData.Range("C81") 
            Wsh.Cells(Lig, 4) = WshData.Range("C83") 
            Lig = Lig + 1 
            WshData.Parent.Close 
        End If 
    Next F1 
    Set WshData = Nothing 
    Set Wsh = Nothing 
    Application.EnableEvents = True 
    Application.DisplayAlerts = True 
End Function

3°) Tu adapte le chemin de ton répertoir.
4°) Tu adapte le nom de la feuille des classeurs à ouvrir.
Si tu à bien tout suivi, les données s'afficheront dans la feuille où tu à mis le bouton.
A+
L'expérience instruit plus sûrement que le conseil. (André Gide)
Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
0
FloR54
 
Bonjour michel_m

J'ai bien essayé le code mais j'obtiens un résultat étrange.
J'ai plusieurs fois le nom du même fichier qui apparaît et je récupère des noms de cellules que je ne désire pas ?? Je ne sais pas si tu peux y faire quelques choses ?

Flor54
0
michel_m Messages postés 16602 Date d'inscription   Statut Contributeur Dernière intervention   3 314
 
re,

Curieux, chez moi ca marche
ci joint la maquette
http://www.cijoint.fr/cjlink.php?file=cj201009/cijdUzvJ8q.zip
tu dis...
0
FloR54
 
Merci lermite222 pour ton aide.
Je n'ai pas bien compris (je suis un vrai néophite) ce que je dois faire en premier : creer un bouton ??

J'ai été dans outil --> macros --> v.B.E. puis j'ai copié dans un module ton code.

J'ai un message d erreur qui me dit qu il ne peut pas lire le premier fichier de mon repertoire.

Je ne suis pas censé changer "Rep" ?

Est ce que tu as une réponse à cela ?

encore merci

Flor54
0
lermite222 Messages postés 8724 Date d'inscription   Statut Contributeur Dernière intervention   1 191
 
Salut Michel,
Je ne vois pas ce que je pourrais expliquer en plus SUIS LES POSTES UN PAR UN
Pour créer le bouton..
Dans Excel >> Affichage >> Barre d'outils >> cocher : Boite à outils contrôls
Dans cette boite tu sélectionne <Bouton de commande> et tu le colle sur la feuille. RIEN D'AUTRE pour le bouton
Dans cette même boite tu décoche le bouton <Mode création> pour que les poignées du bouton disparaissent.
En suite suis les postes 2,3 etc..
Et ça fonctionne, j'ai tester.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
FloR54
 
déjà : Merci michel_m pour ton aide.

Je ne sais pas pourquoi mais ce n est pas ce à quoi je m'attendais.

Quand j'ouvre le classeur "consolidation" je n'ai pas les valeurs que tu as entré dans les cellules c6, c81, c83 de sv1, sv2, sv3. Ou alors c est que je fais la mauvaise manip. ???

Je ne sais pas isi tu vois ou est mon probleme ?

En tout cas merci !!

flor54
0
michel_m Messages postés 16602 Date d'inscription   Statut Contributeur Dernière intervention   3 314
 
Re,

il faut que les 4 classeurs sv1,Sv2,sv3,consolidation, soient les seuls dans le m^me répertoire

salut lermite (ca va?)
0
lermite222 Messages postés 8724 Date d'inscription   Statut Contributeur Dernière intervention   1 191
 
Au final, le plus simple..
Un classeur exemple
0
FloR54
 
je sais que le travail est tout maché et que je passe pour un c** . Merci lermite222. Quand je clique sur le bouton il me mets erreur d'exécution 1004 ??

Mon premier fichier est introuvable or le chemin est exact et les noms avec. Je suis sur qu'il ya un petit truc simple à faire non ?

en tout cas merci !!
0
FloR54
 
Bonjour Lermite222

J'ai suivi le protocole que tu m'as donné hier...et ca marche !!

je vois les fichier s'ouvrir et se fermer les uns après les autres et je vois aussi les données s'inscrire sur un classeur à part mais lorsque tous les dossiers ont été ouvert, je ne retrouve pas le tableau récapitulatif.

Où est il ? Où vont les données recueillies ?

J'y suis presque, alors vraiment : un grand merci !!

flor54
0
michel_m Messages postés 16602 Date d'inscription   Statut Contributeur Dernière intervention   3 314
 
Excuses moi de t'avoir dérangé avec une solution qui marche sans ouvrir les fichiers...
0
lermite222 Messages postés 8724 Date d'inscription   Statut Contributeur Dernière intervention   1 191
 
Re Michel,
Je ne connais pas ce système pour lire des données dans un classeur fermer, toutefois y a comme qui dirait un ti problème,
Pour avoir des données qui s'affiche j'ai changer les adresses comme suit..
    If fich <> recap Then
        Cells(lig, 1) = ExecuteExcel4Macro("'" & chemin & "\[" & fich & "]" & onglet & "'!R6C1")  'R6C3 <==> C6... pour A6
        Cells(lig, 2) = ExecuteExcel4Macro("'" & chemin & "\[" & fich & "]" & onglet & "'!R7C1") 'R81C3<==>C81... pour A7
        Cells(lig, 3) = ExecuteExcel4Macro("'" & chemin & "\[" & fich & "]" & onglet & "'!R8C1") ... Pour A8
    lig = lig + 1
    End If

J'ai vérifier dans les 3 classeurs j'ai bien des nombres (pas des formules) dans ces cellules.
et il me met
#REF!
Dans toutes le cellules ?
Où est l'erreur ?
A+
0
lermite222 Messages postés 8724 Date d'inscription   Statut Contributeur Dernière intervention   1 191
 
Bon, pour les #REF! j'ai trouvé, j'ajoutais un slash inverse au chemin.
Maintenant il m'affiche tout des 0 (zéro) ?
0
lermite222 Messages postés 8724 Date d'inscription   Statut Contributeur Dernière intervention   1 191
 
Ca y est, ça fonctionne mais c'est pas tellement évident.
Ca n'est pas repris (apparement) par FloR54, mais ça aura quand même servit.
Merci et A+
0
michel_m Messages postés 16602 Date d'inscription   Statut Contributeur Dernière intervention   3 314
 
Salut Lermite,
La syntaxe de cette macro, dite de Walkenbach le grand Sachem mondial Excel, est effectivement pointilleuse (pour rester poli) mais très efficace et rapide lorsqu'il y a peu de cellules à copier dans des fichiers devant rester fermés comme le demandait floxxx... Elle est d'ailleurs souvent utilisée.

cordialement
Michel
0