XL 2013 [RESOLU] VBA - Ouvrir un fichier et une feuille spécifique selon des cellules du fichier source

Scoty

XLDnaute Occasionnel
Bonjour à tous :)

Je me lance dans les macros VBA depuis peu, et j'aurai besoin d'un petit coup de pouce. Je sais que le sujet a été traité plusieurs fois, mais je n'arrive malheureusement pas à l'appliquer à mon cas... ou je ne trouve pas exactement ce que je souhaite :/ Explication :

• D'un 1er fichier ("SOURCE"), j'y compile des infos comptables, soit une feuille pour autant de tableau de bord que j'ai.
• Je souhaiterai, grâce à la feuille MACRO de ce fichier source :
1- aller dans la feuille souhaité selon une cellule (ici D4), autrement dit la ville
2- copier le tableau
3 - Ouvrir le tableau de bord initiale de la ville
4 - Ouvrir la feuille correspondante a la cellule c4 du fichier SOURCE <= C'est ici que je sèche !
5 - Coller le tableau

Vous aurez compris qu'il s'agit la de mettre à jour des tableaux du mois précédents, avec les données du mois en cours...

Mes tableaux sont prêts, j'ai commencé un bout du code, mais je sèche quand il faut ouvrir la bonne feuille du tableau de bord selon les infos du fichier SOURCE. Les solutions que j'ai pu trouver proposent de mettre le nom de la feuille directement dans le code. Hors je ne souhaite pas cela car tous les mois je dois les mettre à jours, ce qui serait plus simple de modifier la cellule de ma feuille macro.

J'aurai 2 questions :

• J'ai trouvé ce bout de code dans un forum :
Code:
'Selection de la feuille en fonction de la cellule D4
Range("d4").Select
k = ActiveCell.Value
Sheets(k).Select
Cela marche, mais quand pensez vous ?

• Que dois-je mettre pour récupérer la bonne feuille du fichier ouvert ? Après ce code :
VB:
'Ouvre le fichier / la feuille correspondante
Workbooks.Open Filename:=Range("G8").Value
'Je voudrais mettre un worksheet ici[I] en fonction de la cellule c4 du premier fichier mais pb, ou cela n'est pas la bonne solution ?[/I] :( !
J'ai pensé créer une variable "dim as worksheet" mais je suis perdu quant à son utilisation...

Je vous laisse le fichier source.

Un grand merci d'avance :)

Scoty
 

Fichiers joints

Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonjour le fil

Même sur la planète Mégara, le capitaine Flamme tiquerait en lisant ce qui suit:
Code:
'Selection de la feuille en fonction de la cellule E3
Range("d4").Select
k = ActiveCell.Value
Sheets(k).Select
"Si C'est E3, c'est point D4", penserait-il en dedans de lui ;)
Et moi, sur cette bonne vieille Terre, je pense comme le capitaine Flamme. ;)

Et si j'étais moi, je me contenterai de:
VB:
Dim NomFeuille$
NomFeuille=Range("D4")
If Len(NomFeuille) Then Sheets(NomFeuille).Select
EDITION: Je vois que le post a été édité en douce ;)
Du coup, ma blague tombe à plat ;)

Quoique le capitaine Flamme voit tout! ;)
Je voudrais mettre un worksheet ici en fonction de la cellule c4 du premier fichier

Et il dirait que C4 n'est pas D4 ;)
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re

Alors,après avoir ouvert ton fichier
1) le capitaine Flamme n'est pas infaillible ;)
2) Je te propose de tester cette macro sur ton PC
VB:
Sub check1()
Dim wB_Dest As Workbook, Feuille$
Feuille = Sheets("MACRO").[C4].Text
With Sheets([ville].Text)
.Range(.[A2], .Cells(Rows.Count, "F").End(3)).Copy
End With
'Ouvre le fichier / la feuille correspondante
Set wB_Dest = Workbooks.Open(Filename:=Sheets("MACRO").Range("G8").Text)
wB_Dest.Sheets(Feuille).PasteSpecial Paste:=xlPasteValues
End Sub
NB: Pour qu'elle fonctionne (au moins au début), il faut au préalable nommer ville, la cellule D4
 

Scoty

XLDnaute Occasionnel
Bonjour Staple,

Hahaha oui en effet, j'ai corrigé en douce mes petites coquilles... je suis en plein test du coup je bouge tout le temps les cellules !!! et je ne remets pas forcement à jour le commentaire... faute à moi désolé !!!

En tout cas merci beaucoup. je vais tester de suite. Du coup je pense que tu as vu que c'est le début du code. In fine je souhaiterai faire cela pour tout mes tableaux de bords, faire des enregistrer sous, imprimer en pdf etc.... il faudra surement que je passe par une boucle mais je vais essayer tous seul comme un grand, je continue doucement ma macro :)

Une toute petite dernière question, n'y aurait il pas juste une écriture à apposer sous l'ouverture du tableau de bord de mon code ?
Ton code est évidemment top, juste que je ne le maîtrise pas encore pour le moment

En tous cas merci staple pour ton retour

Scoty
 

Staple1600

XLDnaute Barbatruc
Re

Est-ce qu'au moins le code que je t'ai proposé (check1) fonctionne chez toi?
(Je n'ai pas testé mon code vu que j'ai de classeur Bollene sous la main ;))

Une toute petite dernière question, n'y aurait il pas juste une écriture à apposer sous l'ouverture du tableau de bord de mon code ?
Je n'ai pas compris cette question ;)
 

Scoty

XLDnaute Occasionnel
Staple,

en relisant ton retour Je pense que je me suis mal exprimé. En fait ce que je souhaite faire :

• ouvrir le fichier de tableau de bord correspondant à la ville souhaité (le tableau de bord du mois de juin, d'ou le 06)
• de ce fichier, ouvrir la feuille 07, qui a pour réference la cellule C4 de mon fichier source.

En fait dans ce fichier source, j'y mets les données comptables de chaque ville du mois considéré (Ici, j'ai les données du mois de juillet). Et je souhaiterai pour chaque tableau de bord par ville, coller ses données dans la feuille du mois donnée de la cellule C4.

J'espère ne pas trop avoir embrouillé :s ...
 

Staple1600

XLDnaute Barbatruc
Re

Ce que je veux savoir avant tout si c'est ma macro check1 fait la même chose que la tienne sur ton PC?
Si, oui je pourrai prendre mon goûter, le coeur léger, la méche au vent.
Si non, il va falloir que je reporte mon goûter, pour créer de quoi faire un test complet ;)

PS: Seul l'abus de bière peut m'embrouiller
(heureusement c'est l'heure du thé ;))
 

Scoty

XLDnaute Occasionnel
• Non malheureusement ton code proposé bug à la dernière ligne :"wB_Dest.Sheets(Feuille).PasteSpecial Paste:=xlPasteValues"

• Ma dernière question, serait de savoir quand j'ai ouvert le tableau de bord de la ville souhaité, avec le code suivant :
VB:
'Ouvre le fichier / la feuille correspondante
Workbooks.Open Filename:=Range("G8").Value
avoir peut être juste une fonction rapide qui reprend l'info de la cellule C4 (le mois M) du fichier source afin d'ouvrir le tableau de bord sur cette feuille, qui se nomme aussi 07.
 

Scoty

XLDnaute Occasionnel
Staple,

je te laisse en pièce jointe un exemple de tdb que j'ai crée, tu comprendra mieux du coup.

Globalement, les éléments de mon premier fichier (source) sont les données comptables du mois de juillet pour chaque ville. Il faudrait juste copier coller ces données dans le bon fichier et dans l'onglet 07 (info de la cellule c4 du fichier source).

Et concernant le goûter, 1000000000 excuses !!! le fait que tu passes déjà du temps dessus, je t'aurai bien inviter pour une petite bière après lol !
 

Fichiers joints

Staple1600

XLDnaute Barbatruc
Re

Voila j'ai testé et modifié un chouia et chez moi cela fonctionne.
VB:
Sub check1_II()
Dim wB_Dest As Workbook, Feuille$
Feuille = Sheets("MACRO").[C4].Text
With Sheets([ville].Text)
.Range(.[A2], .Cells(Rows.Count, "F").End(3)).Copy
End With
'Ouvre le fichier / la feuille correspondante
Set wB_Dest = Workbooks.Open(Filename:=Sheets("MACRO").Range("G8").Text)
wB_Dest.Sheets(Feuille).[A2].PasteSpecial Paste:=xlPasteValues
wB_Dest.Close True
End Sub
Allez zou, m'en vais goûter ;)
 

Scoty

XLDnaute Occasionnel
Bonjour à tous, le fil, Staple,

Après quelques essais, j'ai enfin pu faire ma petite macro en compilant celle de Staple et ca marche :) Il s'agit de la check 2 pour les curieux. J'y ai même fait un enregistrer sous et tout ;).

En revanche, je n'arrive toujours pas à m'expliquer ce bout de code (surtout la dernière ligne) :

VB:
'Ouvre le fichier / la feuille correspondante
Set wB_Dest = Workbooks.Open(Filename:=Sheets("MACRO").Range("G8").Text)
wB_Dest.Sheets(feuille).[A2].PasteSpecial Paste:=xlPasteValues
Je comprends que cela ouvre la bonne feuille sur la cellule A2, mais j'ai l'impression que le cas est spécifique car il colle aussi mon tableau préalablement copié dans mon fichier source. Je souhaiterai juste ouvrir mon fichier de destination sur la bonne feuille (fonction des données de mon fichier source), et sélectionner la cellule A2. Pour que je puisse acoller dans la macro juste en dessous l'action de coller que j'ai pu faire via l'enregistreur de macro.

J'ai donc créer une petite macro "juste pour ouvrir" ce que je souhaite :

Code:
Sub juste_ouvrir_le_bon_fichier_et_la_bonne_feuille_sur_la_cellule_A2()

'Déclaration des variables
Dim wB_Dest As Workbook
Dim feuille As Worksheet

'Attribution de la valeur, soit le nom de la feuille du fichier de destination
Feuille = Sheets("MACRO").[C4].Text

'Sélection de la feuille "MACRO"
Sheets("MACRO").Select

'Ouvre le fichier / la feuille correspondante
Set wB_Dest = Workbooks.Open(Filename:=Sheets("MACRO").Range("G8").Text)
Set Feuille = Wbk.Worksheets(feuille).Range(A2).Select
'La ou le bat blesse .... les lignes du dessus ne fonctionnent pas :(...

End Sub
Mais.. Marche pas, j'ai tenté plein, mais plein de possibilité hier... je suis à sec d'idée !! Merci à tous d'un petit coup de pouce

En PJ je vous laisse comme exemple mon fichier source, ainsi qu'un fichier destination
 

Fichiers joints

Scoty

XLDnaute Occasionnel
Hello Staple,

Alors, dans le bout de code que tu m'as proposé pour ouvrir le bon fichier à la bonne feuille, je pense comprendre que :

• wB_Dest.Sheets(feuille).[A2]. => Permet d'ouvrir la bonne feuille à la bonne cellule (A2)
• PasteSpecial Paste:=xlPasteValues => Permet de coller ce qu'on a initialement copier dans le fichier source

En fait à la base, je souhaitais bien partitioner étape par étape la macro, dans l'idée de récupérer certains bout pour recréer d'autres macros par exemple ( bon c'est pas pour tout de suite ^^).

J'avais tenter d'écrire cela initialement (j'ai remis mon collage via l'enregistreur de macro car cela je "maîtrise" un peu) :

VB:
'Ouvre le fichier / la feuille correspondante
Set wB_Dest = Workbooks.Open(Filename:=Sheets("MACRO").Range("G8").Text)
wB_Dest.Sheets(feuille).[A2].

'Colle le tableau ds la feuille correspondante, code récupéré suite à l'enregistreur de macro...
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
Mais malheureusement cela ne fonctionne pas. J'ai l'impression que je ne peux pas utiliser "wB_Dest.Sheets(feuille).[A2]." tout seul si je ne mets pas le pastspecial juste après

Du coup je ne comprends pas du coup pourquoi cela beugue :/.

Pour résumer, je cherche juste à avoir la macro qui me permet d'ouvrir un fichier de tableau de bord, sur une feuille souhaité via les infos de mon fichier source.

Désolé staple si je ne suis pas encore très clair :/ (me suis relu plusieurs fois pr essayer d'être simple ^^)
 

Staple1600

XLDnaute Barbatruc
Re

Tu auras remarqué si tu relis le fil, et notamment le message#11, que mes déclarations de variables étaient
Dim wB_Dest As Workbook, Feuille$
ou plus classiquement Dim Feuille As String
Or toi tu as déclaré Feuille As Worksheet
et tu utilises une variable Wbk non déclarée
Pour résumer, je cherche juste à avoir la macro qui me permet d'ouvrir un fichier de tableau de bord, sur une feuille souhaité via les infos de mon fichier source.
PS: C'est ce que faisait ma dernière macro, non ? (avec la copie/valeurs seules en plus)
 

Scoty

XLDnaute Occasionnel
• OK ok d'accord, je ne savais pas que d'écrire ",Feuille$" correspondait à la déclaration "Dim Feuille As String ".

• Feuille as worksheet, j'ai trouvé cela dans mes recherches, mais justement je n'arrive pas à l'appliquer à mon cas.

PS: C'est ce que faisait ma dernière macro, non ? (avec la copie/valeurs seules en plus)
Absolument oui, ta macro (check2 ac ma petite touche de newbie) fonctionne parfaitement, elle fait parfaitement le job. J'aurai juste souhaité qu'elle n'effectue pas le collage valeurs en plus, juste qu'elle m'amène à la cellule A2 de mon fichier tableau de bord.

Ces juniors qui se lancent dans des macros... mais ou on va lol !
 

Staple1600

XLDnaute Barbatruc
Re

A tester (j'ai la flemme;))
VB:
Sub check1_III()
Dim wB_Dest As Workbook, Feuille$
Feuille = Sheets("MACRO").[C4].Text
'With Sheets([ville].Text)
'.Range(.[A2], .Cells(Rows.Count, "F").End(3)).Copy
'End With
'Ouvre le fichier / la feuille correspondante
Set wB_Dest = Workbooks.Open(Filename:=Sheets("MACRO").Range("G8").Text)
wB_Dest.Sheets(Feuille).Activate
Range("A2").Select
End Sub
 

Scoty

XLDnaute Occasionnel
Ca fonctIOOOOONNNE :) :) :)

C'est super cool merci staple, Au top le coup de main ^^ Enfin la première pierre de posé, avec bien la déclinaison des taches pour que je m'y retrouve comme je souhaitais. :) Etape 2 maintenant c'est de faire une boucle pour ma 30taine de Tdb, de mettre des alertes en cas si les fichiers / dossiers n'existent pas ou je me plante dans les mois etc.... On m'a aussi conseillé d'éviter la liste déroulante dans mon fichier source et de faire du ligne à ligne pour la suite avec l'incrémentation de la variable pr la boucle. Allé Voici la petite bête accouché :

VB:
Sub check4_ac_saveas()

'Déclaration des variables
Dim NomFeuille
Dim wB_Dest As Workbook, Feuille
Dim Chemin As String, Fichier As String

'Attribution de valeurs aux variables
Feuille = Sheets("MACRO").[C4].Text
Chemin = Sheets("MACRO").[G11].Text
Fichier = Sheets("MACRO").[G10].Text

'Sélection de la feuille "MACRO"
Sheets("MACRO").Select

'Selection de la feuille en fonction de la cellule E3
NomFeuille = Range("D4")
If Len(NomFeuille) Then Sheets(NomFeuille).Select

'Copie le tableau de la feuille sélectionnée préalablement
Range("A2:F2").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy

'Ouvre le fichier / la feuille correspondante
Set wB_Dest = Workbooks.Open(Filename:=Sheets("MACRO").Range("G8").Text)
wB_Dest.Sheets(Feuille).Activate
Range("A2").Select

'Colle le tableau ds la feuille correspondante
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

'Effectuer un enregistrer sous... en fonction du nom / adresse du fichier source
ActiveWorkbook.SaveCopyAs Chemin & Fichier

'fermer le fichier actif du mois m-1 sans le sauvegarder
ActiveWorkbook.Close SaveChanges:=False

'Sélection de la feuille "MACRO"
Sheets("MACRO").Select

'Message box
MsgBox "Ayé 1er tdb mis a jour, reste à faire la boucle pr les autres ^^"

End Sub
 

Haut Bas