Garde le même template et le copier sur plusieurs onglet

Bonjour,

Je travaille sur un script Python fonctionnant avec Excel. J'aurais aimé le faire en Python mais impossible de récupérer le template d'un onglet et de l'afficher sur d'autres onglets.

J'imagine que cette manipulation est plus adaptée en VBA, mais connaissant très peu ce langage, je ne vois pas comment copier une partie des cellules d'un onglet exemple ['"A1":"AH3"] d'un onglet nommé "Test" par exemple vers d'autres onglets.

Merci pour votre aide.

Bonjour

exemple

Sub recopie()
Sheets("f1").Range("A1:D1").Copy Destination:=Sheets("f2").Range("A1")
End Sub
8test-recopie.xlsm (13.79 Ko)

C'est exactement ce que je cherchais, merci beaucoup !

Sub lister()
Dim monFichier As String
Dim wb As Workbook
Dim chemin As String
Set wb = Workbooks(ThisWorkbook.Name) 'classeur reception
' On a besoin du chemin absolu du dossier
' Doit se terminer par \
chemin = ThisWorkbook.Path & "\"
' La fonction Dir(chemin, mode) permet de parcourir un dossier
' Ici je rajoute à mon chemin "*.xlsx",
' pour ne retrouver que mes fichiers Excel
' vbNormal permet de ne récupérer que des fichiers,
' vbDirectory récupère tout (dossiers et fichiers)
monFichier = Dir(chemin & "*.xlsx", vbNormal)
Do While monFichier <> ""
   wb.Sheets.Add(After:=Worksheets(Worksheets.Count)).Name = Split(monFichier, "_")(2)
   Sheets("Test").Range("A1:D1").Copy Destination:=Sheets(monFichier).Range("A1") 'ajoute un onglet et le renomme
' Permet de passer au fichier suivant
monFichier = Dir
Loop
End Sub

J'ai poursuivi mon script dans le but est l'ouverture de plusieurs fichiers dans le fichier principale.

J'aimerai pouvoir effectuer cette manipulation de "même template" sur tous ces onglets présents dans mon dossier.

Voici la suite de mon code (le modèle de template se trouve dans l'onglet "Test"). Je vois pas très bien par quoi remplacer cette ligne pour l'appliquer à tous mes onglets importés.

Sheets("f2").Range("A1")

Merci encore pour ton aide.

Essaie ceci (sinon je regarderai ce soir)

Sheets("Test").Range("A1:D1").Copy Destination:=wb.Sheets(Split(monFichier, "_")(2)).Range("A1")

à condition que monFichier soit bien du type : xcvbn_xcvbn_dfghjk.xlsm avec 2 _ car en split l'indice commence à 0

Il faut aussi peut-être préciser que sheets("Test") est issu du fichier existant dans chemin

C'est parfait ! Merci beaucoup !

J'aurais une dernière demande concernant la récupération de données provenant d'un autre onglet nommé "classe" (que tous les fichiers dans mon dossier exceptés mon fichier principale possèdent) et j'aimerais pouvoir récupérer des valeurs présentes dans la cellule "A1:A50" par exemple de l'onglet "classe" et la mettre dans les nouveaux onglets crées grâce à cette ligne :

wb.Sheets.Add(After:=Worksheets(Worksheets.Count)).Name = Split(monFichier, "_")(2)

J'ai tenté une boucle For, mais mon niveau est trop faible en vba pour vraiment utiliser la bonne syntaxe..

Sub toto()
Dim monFichier As String
Dim wb As Workbook
Dim chemin As String
Dim i As Integer
Dim nom As String
Set wb = Workbooks(ThisWorkbook.Name) 'classeur reception
' On a besoin du chemin absolu du dossier
' Doit se terminer par \
chemin = ThisWorkbook.Path & "\"
' La fonction Dir(chemin, mode) permet de parcourir un dossier
' Ici je rajoute à mon chemin "*.xlsx",
' pour ne retrouver que mes fichiers Excel
' vbNormal permet de ne récupérer que des fichiers,
' vbDirectory récupère tout (dossiers et fichiers)
monFichier = Dir(chemin & "*.xlsx", vbNormal)
Do While monFichier <> ""
   wb.Sheets.Add(After:=Worksheets(Worksheets.Count)).Name = Split(monFichier, "_")(2)
   Sheets("Test").Range("A1:D1").Copy Destination:=wb.Sheets(Split(monFichier, "_")(2)).Range("A1")
'L'idée étant ici de parcourir l'onglet classe de mon fichier présent dans mon dossier et de recupérer les cellules "A1:A50" et de les copier en "A10:A59" par exemple

   For i = 1 To monFichier
        Sheets("classe").Range("A1:D1").Copy Destination:=wb.Sheets(i).Range("A10:A59")
   Next
' Permet de passer au fichier suivant

monFichier = Dir
Loop
End Sub

Merci une nouvelle fois pour ton aide !

Tu ne peux pas faire une boucle de ce type

Do While monFichier <> ""
   For i = 1 To monFichier

   Next
   monFichier = Dir
Loop

Pour 2 raisons,

  1. - i étant un entier (integer) alors que monFichier est un nom (string)
  2. - tu boucles déjà sur les fichiers dans do While .... Loop

Petite simplification, ceci devrait suffire

Set wb = ThisWorkbook

au lieu de

Set wb = Workbooks(ThisWorkbook.Name)

J'aurais une dernière demande concernant la récupération de données provenant d'un autre onglet nommé "classe" (que tous les fichiers dans mon dossier exceptés mon fichier principale possèdent) et j'aimerais pouvoir récupérer des valeurs présentes dans la cellule "A1:A50" par exemple de l'onglet "classe" et la mettre dans les nouveaux onglets crées grâce à cette ligne :

Do While monFichier <> ""
   wb.Sheets.Add(After:=Worksheets(Worksheets.Count)).Name = Split(monFichier, "_")(2)
   Sheets("Test").Range("A1:D1").Copy Destination:=wb.Sheets(Split(monFichier, "_")(2)).Range("A1")
'L'idée étant ici de parcourir l'onglet classe de mon fichier présent dans mon dossier et de recupérer les cellules "A1:A50" et de les copier en "A10:A59" par exemple

   For i = 1 To monFichier
        Sheets("classe").Range("A1:D1").Copy Destination:=wb.Sheets(i).Range("A10:A59")
   Next
' Permet de passer au fichier suivant

monFichier = Dir
Loop

Merci une nouvelle fois pour ton aide !

si j'ai bien compris, ce que tu veux coier c'est ces cellules appartenant à monFichier, onglet classe :

Sheets("classe").Range("A1:D1").Copy 

et tu veux les mettre où dans wb ? quelle feuille ? celle dont le nom est issu de monFichier ? alors essaie ceci

Do While monFichier <> ""
    onglet = Split(monFichier, "_")(2)
    wb.Sheets.Add(After:=Worksheets(Worksheets.Count)).Name = onglet
    Sheets("Test").Range("A1:D1").Copy Destination:=wb.Sheets(onglet).Range("A1")
    Sheets("classe").Range("A1:D1").Copy Destination:=wb.Sheets(onglet).Range("A10")
    ' Permet de passer au fichier suivant
    monFichier = Dir
Loop

Bonjour,

Excuse pour mon délais de réponse.

Dans l'idée, j'ai dans un dossier plusieurs fichiers qui sont composés de la même manière (les mêmes noms d'onglets mais les valeurs elles, diffèrent).

Ce qui fonctionne pour l'instant c'est de récupérer les noms des fichiers présents dans mon dossier et créer un onglet dans mon fichier principale (ou se lance la macro) pour chaque d'eux.

Ensuite grâce à ton aide, j'ai réussi à copier un template d'un onglet nommé "Test" dans chaque onglet créer pour chaque fichier dans mon dossier (comme indiqué au dessus).

Maintenant la dernière chose que je souhaiterai, c'est d'aller récupérer des valeurs présentes dans des cellules différentes (exemple : ["A1:A50"]) d'un onglet nommé "classe" que tous les fichiers présents dans mon dossier (hors fichier ou s''execute la macro) possèdent.

Et pour terminer pouvoir copier cette valeur à n'importe quel endroit (exemple les cellules : ("A1:A50") de l'onglet 1 du fichier 1 seront copier dans le fichier principale, dans l'onglet correspondant à son nom (fichier1) à la cellule de notre choix exemple ("B1:B50").

Voilà dans l'idée, merci encore pour ton temps et ton aide !

Et pour terminer pouvoir copier cette valeur à n'importe quel endroit (exemple les cellules : ("A1:A50") de l'onglet 1 du fichier 1 seront copier dans le fichier principale, dans l'onglet correspondant à son nom (fichier1) à la cellule de notre choix exemple ("B1:B50").

Donc pour ce cas, est-ce que ceci fonctionne

Do While monFichier <> ""
    onglet = Split(monFichier, "_")(2)
    wb.Sheets.Add(After:=Worksheets(Worksheets.Count)).Name = onglet
    Sheets("Test").Range("A1:D1").Copy Destination:=wb.Sheets(onglet).Range("A1")
    Sheets("classe").Range("A1:A50").Copy Destination:=wb.Sheets(onglet).Range("B1")
    ' Permet de passer au fichier suivant
    monFichier = Dir
Loop

Alors j'ai une erreur pour cette ligne :

Sheets("classe").Range("A1:A50").Copy Destination:=wb.Sheets(onglet).Range("B1")

"L'indice n'appartient pas à la section"

J'imagine qu'il n'arrive pas à récupérer l'onglet "classe" dans les autres fichiers. Pourtant j'ai vérifié que l'orthographe de l'onglet était le bon, mais ça n'a pas l'air de venir de là

Vérifie qu'il n'y a pas d'espace devant ou derrière classe !

N'hésite pas lors de la mise au point à truffer ton code de debug.print (accessible en faisant Ctlr+G à partir de l'éditeur de macro :

Debug.Print onglet
Debug.Print Sheets("classe").Name
Debug.Print wb.Sheets(onglet).Range("B1").Value

et vérifie qu'il n'y a pas de cellules fusionnées !

sinon essaie la copie manuelle pour voir ce qu'il te dit !

Du coup après plusieurs test, je crois avoir trouvé d'où vient le problème.

La macro pour l'instant arrive à récupérer le nom des fichiers et créer un onglet pour chaque fichier mais n'arrive pas à aller à l’intérieur de ces fichiers pour récupérer les valeurs dans l'onglet "classe".

J'ai testé avec une boucle for, pour lui demander de parcourir chaque onglet de chaque feuille et lorsque il tombe sur l'onglet "classe" il effectue la copie.

    
    For Each onglet In ThisWorkbook.Worksheets
        Sheets("classet").Range("A1:A50").Copy Destination:=wb.Sheets(onglet).Range("B1")
    Next

Mais je tombe sur l'erreur incompatibilité de type pour la ligne :

Sheets("classe").Range("A1:A50").Copy Destination:=wb.Sheets(onglet).Range("B1")
Sub  copie()
Dim monFichier As String
Dim wb As Workbook
Dim chemin As String
Dim i As Integer
Dim nom As String
Set wb = Workbooks(ThisWorkbook.Name) 'classeur reception
' On a besoin du chemin absolu du dossier
' Doit se terminer par \
chemin = ThisWorkbook.Path & "\"
' La fonction Dir(chemin, mode) permet de parcourir un dossier
' Ici je rajoute à mon chemin "*.xlsx",
' pour ne retrouver que mes fichiers Excel
' vbNormal permet de ne récupérer que des fichiers,
' vbDirectory récupère tout (dossiers et fichiers)
monFichier = Dir(chemin & "*.xlsx", vbNormal)

Do While monFichier <> ""
    onglet = Split(monFichier, "_")(2)
    wb.Sheets.Add(After:=Worksheets(Worksheets.Count)).Name = onglet
    Debug.Print onglet
    'Sheets("test").Range("A1:AH3").Copy Destination:=wb.Sheets(onglet).Range("A1")
    'Debug.Print Sheets("T15").Name

    For Each onglet In ThisWorkbook.Worksheets
        Sheets("classe").Range("A1:A50").Copy Destination:=wb.Sheets(onglet).Range("B1")
    Next
    Debug.Print wb.Sheets(onglet).Range("B1").Value
    ' Permet de passer au fichier suivant
    monFichier = Dir

Loop
End Sub

Sinon je me suis penché sur les connexions et requètes avec

ADODB.Connection

Mais j'imagine qu'il y a plus simple juste pour récupérer des valeurs dans des cellules d'un fichier fermé...

Merci une nouvelle fois pour ton aide.

si le fichier n'est pas ouvert, en effet cette méthode n'accède pas aux valeurs

il y a la méthode ADODB, mais il y a en effet plus simple si tu connais le lieux où se trouve ces valeurs ... il suffit d'écrire par macro la formule

exemple :

Sub acces()
For i = 1 To 4
    Cells(i, 1).FormulaLocal = "='" & ThisWorkbook.Path & "\[source.xlsx]Feuil1'!A" & i
Next
End Sub
2source.xlsx (7.55 Ko)

Pour plus de souplesse, il vaut mieux utiliser FormulaR1C1

Sub acces()
For i = 1 To 4
For j = 1 To 6
    Cells(i, j).FormulaR1C1 = "='" & ThisWorkbook.Path & "\[source.xlsx]Feuil1'!R" & i & "C" & j
Next
Next
End Sub
4source.xlsx (7.66 Ko)

Merci beaucoup, je vais me servir de ton dernier script.

J'ai juste une dernière question, est ce que tu penses que cette ligne

Cells(i, j).FormulaR1C1 = "='" & ThisWorkbook.Path & "\[source.xlsx]Feuil1'!R" & i & "C" & j

est adaptable non pas à un fichier mais à un dossier, et est-il possible de rediriger le contenu d'une cellule vers une autre cellule. Par exemple faire en sorte que les valeurs de A1:A4 soit copier dans le fichier access-fichier.ferme.xlsm en B5:B8

Dans l'optique de pouvoir l'appliquer à ceci.

Sub  access()
Dim monFichier As String
Dim wb As Workbook
Dim chemin As String
Dim i As Integer
Dim nom As String

Set wb = Workbooks(ThisWorkbook.Name) 'classeur reception

chemin = ThisWorkbook.Path & "\"

monFichier = Dir(chemin & "*.xlsx", vbNormal)

Do While monFichier <> ""
    onglet = Split(monFichier, "_")(2)
    wb.Sheets.Add(After:=Worksheets(Worksheets.Count)).Name = onglet
    Debug.Print onglet
    Sheets("test").Range("A1:AH3").Copy Destination:=wb.Sheets(onglet).Range("A1")
    'Debug.Print Sheets("T15").Name

    For i = 1 To 4
    For j = 1 To 6
          Cells(i, j).FormulaR1C1 = "='" & ThisWorkbook.Path & "\[source.xlsx]Feuil1'!R" & i & "C" & j

   Next
   Next
    monFichier = Dir

Loop
End Sub

Merci beaucoup, je vais me servir de ton dernier script.

J'ai juste une dernière question, est ce que tu penses que cette ligne

Cells(i, j).FormulaR1C1 = "='" & ThisWorkbook.Path & "\[source.xlsx]Feuil1'!R" & i & "C" & j

est adaptable non pas à un fichier mais à un dossier, et est-il possible de rediriger le contenu d'une cellule vers une autre cellule. Par exemple faire en sorte que les valeurs de A1:A4 soit copier dans le fichier access-fichier.ferme.xlsm en B5:B8

oui c'est possible

  1. A la place de ThisWorkbook.Path tu mets le chemin du dossier
  2. A la place de R" & i & "C" & j tu mets R" & a & "C" & b où a est la ligne (R=Row) et b la colonne (C=Column) - dans la boucle tu incrémentes les valeurs de a et b ou tu les mets en relation avec i et j, dans ton exemple a=i+4 et b=2
Rechercher des sujets similaires à "garde meme template copier onglet"