Se connecter avec
S'enregistrer | Connectez-vous

Excel Macro et VB

Dernière réponse : dans Programmation

Bonjour,
J'ai quelques problèmes avec Excel. Je dois générer plus ou moins 4000 fiches qui comportent chacune 6 champs de saisie. Mais je n'ai pas d'expérience en ce qui concerne les macro et encore moins en ce qui concerne VB.
Voici mon problème:
J'ai une "fiche" type (vierge) qui comporte les 6 champs à remplir. J'ai un autre document excel avec les données (rangées dans un tableau) à insérer dans chaque fiche (une ligne du tableau correspond à une fiche).
Pour le moment, j'ai trouver ces lignes-ci pour enregistrer les pg excel:

  1. Public Sub CommandButton1_Click() 'copie sauvegarde classeur
  2. Dim nom As String
  3. nom = Day(Date) & "-" & Month(Date) & "-" & Year(Date) & "_" & ActiveWorkbook.Name
  4. ActiveWorkbook.SaveCopyAs ActiveWorkbook.Path & "\" & nom
  5. rep = MsgBox("Votre base de données est sauvegardée sous le nom : " & nom, vbYes + vbInformation, "Copie sauvegarde classeur")
  6. End Sub


Mais je n'ai pas besoin de la date dans le nom du document il me faudrait une incrémentation (1,2,3...) et pas de bouton sinon faut que j'ouvre les 4000 fiches :S.

J'ai aussi créé la macro suivante:

  1. Sub Remplissage()
  2. '
  3. ' Remplissage Macro
  4. '
  5.  
  6. '
  7. Range("C8").Select
  8. ActiveCell.FormulaR1C1 = "=[L1RACK_FC_EA.xls]L1RACK_FC_EA!R2C5"
  9. Range("F8").Select
  10. ActiveCell.FormulaR1C1 = "=[L1RACK_FC_EA.xls]L1RACK_FC_EA!R2C4"
  11. Range("J8").Select
  12. ActiveCell.FormulaR1C1 = "=[L1RACK_FC_EA.xls]L1RACK_FC_EA!R2C9"
  13. Range("C13").Select
  14. ActiveCell.FormulaR1C1 = "=[L1RACK_FC_EA.xls]L1RACK_FC_EA!R2C1"
  15. Range("G13").Select
  16. ActiveCell.FormulaR1C1 = "=[L1RACK_FC_EA.xls]L1RACK_FC_EA!R2C2"
  17. Range("J13").Select
  18. ActiveCell.FormulaR1C1 = "=[L1RACK_FC_EA.xls]L1RACK_FC_EA!R2C3"
  19. Range("J14").Select
  20. End Sub


Qui elle sert juste a affecter la valeur au champ de la fiche à partir du tableau contenu dans le 2eme document.

Ce que je voudrait faire, c'est une boucle while qui répette ces tâches en incrémentant (pour passer à la ligne suivante du tableau) en enregistrant chaque fois la fiche avec le nom et le n°.

Je sais pas si j'ai été assez claire?

Je vous remercie de pretter attention à mon problème.

Autres pages sur : excel macro

Lassé par la pub ? Créez un compte

Meilleure solution

Expert Programmation

Oufti !!!!!
C'est du grand n'importe quoi, ça, mon ptit zeb >:/

  1. Dim s_wb As Workbook
  2. Set s_wb = Workbooks("L1RACK_FC_EA.xls" ).Worksheets("L1RACK_FC_EA" )
N'y a-t-il rien qui te gêne ?

s_wb est un Workbook, un classeur, quoi.
Workbooks(x).Worksheets(y) est la Worksheet (feuille de calcul) y du Workbook (classeur) x.
On ne peut pas affecter une feuille à un classeur.

Aller, on recommence :
  1. Public Sub ZolieProc(wb_1 As Workbook)
  2. Dim num As Integer
  3. Dim nom As String
  4. Dim t_wb As Workbook
  5. Dim s_ws As Worksheet
  6. Dim t_ws As Worksheet
  7.  
  8. Set s_ws = Workbooks("L1RACK_FC_EA.xls" ).Worksheets("L1RACK_FC_EA" )
  9.  
  10. For num = 1 To 4000
  11. nom = numeroter_fichier(wb_1.Path & "\" & wb_1.Name, num)
  12. wb_1.SaveCopyAs nom
  13.  
  14. Set t_wb = Workbooks.Open(nom)
  15. Set t_ws = t_wb.Worksheets(1)
  16.  
  17. t_ws.Range("C8" ).Value = s_ws.Range("E2" ).Value
  18. t_ws.Range("F8" ).Value = s_ws.Range("D2" ).Value
  19. t_ws.Range("J8" ).Value = s_ws.Range("I2" ).Value
  20. t_ws.Range("C13" ).Value = s_ws.Range("A2" ).Value
  21. t_ws.Range("G13" ).Value = s_ws.Range("B2" ).Value
  22. t_ws.Range("J13" ).Value = s_ws.Range("D2" ).Value
  23.  
  24. t_wb.Save
  25. t_wb.Close
  26. Next
  27. End Sub
  28.  
  29. Public Sub CommandButton1_Click() 'copie sauvegarde classeur
  30. ZolieProc ActiveWorkbook
  31. End Sub
Expert Programmation

A la lecture de ton message : Et hop, encore un qui confond EXCEL avec un gestionnaire de base de données.

Non mais, 4000 fiches !

  1. Sub ExcelAsDB()
  2. Dim t As Balloon
  3. Assistant.On = True
  4. Set t = Assistant.NewBalloon
  5. t.Animation = 11
  6. t.Button = 1
  7. t.Heading = StrReverse(".ruelbat nu tse lecxE" )
  8. t.Text = StrReverse(".seénnod ed esab ed eriannoitseg nu sap tse'n eC" )
  9. t.Show
  10. Assistant.Visible = False
  11. Set t = Nothing
  12. Assistant.On = False
  13. End Sub


_____________________________________________________


On t'oblige à utiliser Excel ?
Bon aller, un peu d'aide tout de même...
Expert Programmation

  1. Public Sub CommandButton1_Click() 'copie sauvegarde classeur
  2. Dim nom As String
  3.  
  4. nom = Day(Date) & "-" & Month(Date) & "-" & Year(Date) & "_" & ActiveWorkbook.Name
  5. ActiveWorkbook.SaveCopyAs ActiveWorkbook.Path & "\" & nom
  6. rep = MsgBox("Votre base de données est sauvegardée sous le nom : " & nom, vbYes + vbInformation, "Copie sauvegarde classeur" )
  7. End Sub
Bon, pas mal.

Cependant, je t'engage à ne pas trop te servir des objets actifs. Excel étant parfois espiègle, il changera inopinément l'objet actif en cours. Donc, quand tu en tiens un (un objet actif), pointe dessus avec une variable pour pouvoir d'y référer ensuite :
  1. Public Sub CommandButton1_Click() 'copie sauvegarde classeur
  2. Dim nom As String
  3. Dim wk As Workbook
  4.  
  5. Set wk = ActiveWorkbook
  6.  
  7. nom = Day(Date) & "-" & Month(Date) & "-" & Year(Date) & "_" & wb.Name
  8. wb.SaveCopyAs wb.Path & "\" & nom
  9.  
  10. rep = MsgBox("Votre base de données est sauvegardée sous le nom : " & nom, vbYes + vbInformation, "Copie sauvegarde classeur" )
  11. End Sub
Tu ne déclares pas rep. C'est mal. C'est très mal ! Ose me dire que tu n'as pas mis Option Explicit au début de ton code !!!! [:zeb:4]
En plus, pourquoi ce rep puisque tu ne t'en sers pas !
  1. Public Sub CommandButton1_Click() 'copie sauvegarde classeur
  2. Dim nom As String
  3. Dim wk As Workbook
  4.  
  5. Set wk = ActiveWorkbook
  6.  
  7. nom = Day(Date) & "-" & Month(Date) & "-" & Year(Date) & "_" & wb.Name
  8. wb.SaveCopyAs wb.Path & "\" & nom
  9.  
  10. MsgBox "Vos données seraient mieux dans un vrai SGBD ! " & vbCrLf & _
  11. "En attendant, les voilà sauvées dans : " & nom, _
  12. vbYes + vbInformation, _
  13. "Copie sauvegarde classeur"
  14. End Sub

Expert Programmation

Alors, c'est cool. A part que ce n'est pas ce que tu veux ^^
Tu veux un nom avec un numéro.

Ben le voilà le numéro :
  1. Dim Numero As Integer
  2. Numero = 1


Bon, alors pour numéroter un fichier, c'est très facile sur le papier :

  1. C:\chemin\fichier.extention
  2. |
  3. `- ajouter là le numéro.
  4. C:\chemin\fichier_numéro.extention


Bref, il faut éclater le nom complet du ficher et le recréer.
C'est du boulot sous VB. Voici comment faire grâce à l'objet FileSystemObject :
  1. Function numeroter_fichier(fichier As String, numero As Integer) As String
  2. Dim FSO As Object
  3. Set FSO = CreateObject("Scripting.FileSystemObject")
  4.  
  5. numeroter_fichier = FSO.GetParentFolderName(fichier) & "\" & _
  6. FSO.GetBaseName(fichier) & "_" & numero & "." & _
  7. FSO.GetExtensionName(fichier)
  8. End Function


  1. Public Sub CommandButton1_Click() 'copie sauvegarde classeur
  2. Dim nom As String
  3. Dim wk As Workbook
  4. Dim num As Integer
  5.  
  6. Set wk = ActiveWorkbook
  7.  
  8. num = 1
  9. nom = numeroter_fichier(wb.Path & "\" & wk.Name, num)
  10. wb.SaveCopyAs nom
  11.  
  12. rep = MsgBox("Votre base de données est sauvegardée sous le nom : " & nom, vbYes + vbInformation, "Copie sauvegarde classeur" )
  13. End Sub


Allez, hop, 4000 fois !
  1. Public Sub CommandButton1_Click() 'copie sauvegarde classeur
  2. Dim nom As String
  3. Dim wk As Workbook
  4. Dim num As Integer
  5.  
  6. Set wk = ActiveWorkbook
  7.  
  8. For num = 1 To 4000
  9. nom = numeroter_fichier(wb.Path & "\" & wk.Name, num)
  10. wb.SaveCopyAs nom
  11. MsgBox "Vos données seraient mieux dans un vrai SGBD ! " & vbCrLf & _
  12. "En attendant, les voilà sauvées dans : " & nom, _
  13. vbInformation, _
  14. "Copie sauvegarde classeur"
  15. Next
  16. End Sub


Tu vas en avoir marre de cliquer avant les 4000 ;)  ([Ctrl+Pause] pour arrêter le massacre.)

  1. Public Sub CommandButton1_Click() 'copie sauvegarde classeur
  2. Dim wk As Workbook
  3. Dim num As Integer
  4.  
  5. Set wk = ActiveWorkbook
  6.  
  7. For num = 1 To 4000
  8. wb.SaveCopyAs numeroter_fichier(wb.Path & "\" & wk.Name, num)
  9. Next
  10. End Sub

Expert Programmation

  1. Sub Remplissage()
  2. '
  3. ' Remplissage Macro
  4. '
  5. '
  6. Range("C8" ).Select
  7. ActiveCell.FormulaR1C1 = "=[L1RACK_FC_EA.xls]L1RACK_FC_EA!R2C5"
  8. Range("F8" ).Select
  9. ActiveCell.FormulaR1C1 = "=[L1RACK_FC_EA.xls]L1RACK_FC_EA!R2C4"
  10. Range("J8" ).Select
  11. ActiveCell.FormulaR1C1 = "=[L1RACK_FC_EA.xls]L1RACK_FC_EA!R2C9"
  12. Range("C13" ).Select
  13. ActiveCell.FormulaR1C1 = "=[L1RACK_FC_EA.xls]L1RACK_FC_EA!R2C1"
  14. Range("G13" ).Select
  15. ActiveCell.FormulaR1C1 = "=[L1RACK_FC_EA.xls]L1RACK_FC_EA!R2C2"
  16. Range("J13" ).Select
  17. ActiveCell.FormulaR1C1 = "=[L1RACK_FC_EA.xls]L1RACK_FC_EA!R2C3"
  18. Range("J14" ).Select
  19. End Sub


Beurk :vomi: 
Quelle horreur !!!!

Alors d'abord, on vire les Select/Active !

  1. Sub Remplissage()
  2. ' Remplissage Macro
  3. Range("C8" ).FormulaR1C1 = "=[L1RACK_FC_EA.xls]L1RACK_FC_EA!R2C5"
  4. Range("F8" ).FormulaR1C1 = "=[L1RACK_FC_EA.xls]L1RACK_FC_EA!R2C4"
  5. Range("J8" ).FormulaR1C1 = "=[L1RACK_FC_EA.xls]L1RACK_FC_EA!R2C9"
  6. Range("C13").FormulaR1C1 = "=[L1RACK_FC_EA.xls]L1RACK_FC_EA!R2C1"
  7. Range("G13").FormulaR1C1 = "=[L1RACK_FC_EA.xls]L1RACK_FC_EA!R2C2"
  8. Range("J13").FormulaR1C1 = "=[L1RACK_FC_EA.xls]L1RACK_FC_EA!R2C3"
  9. End Sub


Ensuite on explicite la source et la cible.
A-t-on besoin que les cellules contiennent une formule ou une valeur ?
La réponse à cette question doit venir de toi.

  • Si oui :
    1. Sub Remplissage()
    2. ' Remplissage Macro
    3. Dim target As Worksheet
    4.  
    5. Set target = ActiveWorksheet
    6.  
    7. target.Range("C8" ).FormulaR1C1 = "=[L1RACK_FC_EA.xls]L1RACK_FC_EA!R2C5"
    8. target.Range("F8" ).FormulaR1C1 = "=[L1RACK_FC_EA.xls]L1RACK_FC_EA!R2C4"
    9. target.Range("J8" ).FormulaR1C1 = "=[L1RACK_FC_EA.xls]L1RACK_FC_EA!R2C9"
    10. target.Range("C13").FormulaR1C1 = "=[L1RACK_FC_EA.xls]L1RACK_FC_EA!R2C1"
    11. target.Range("G13").FormulaR1C1 = "=[L1RACK_FC_EA.xls]L1RACK_FC_EA!R2C2"
    12. target.Range("J13").FormulaR1C1 = "=[L1RACK_FC_EA.xls]L1RACK_FC_EA!R2C3"
    13. End Sub


  • Si non (et mon petit doigt me dit que c'est ici la bonne solution) :
    1. Sub Remplissage()
    2. ' Remplissage Macro
    3.  
    4. Dim source As Worksheet
    5. Dim target As Worksheet
    6.  
    7. Set source = Workbooks("L1RACK_FC_EA.xls").Worksheets("L1RACK_FC_EA")
    8. Set target = ActiveWorksheet
    9.  
    10. target.Range("C8" ).Value = source.Range("E2").Value
    11. target.Range("F8" ).Value = source.Range("D2").Value
    12. target.Range("J8" ).Value = source.Range("I2").Value
    13. target.Range("C13").Value = source.Range("A2").Value
    14. target.Range("G13").Value = source.Range("B2").Value
    15. target.Range("J13").Value = source.Range("D2").Value
    16. End Sub

    Les cellules sont des chaines de caractères.
    Je te remercie pour ces éclaircissements. Je vais essayer ça de suite!! Mais je me demandais s'il n'y avait pas moyen de générer toutes les copies d'un coup sans devoir ousser 4000 fois sur le bouton?
    Expert Programmation

    Aller, 4000 fois :
    1. Public Sub CommandButton1_Click() 'copie sauvegarde classeur
    2. Dim num As Integer
    3. Dim nom As String
    4. Dim a_wb As Workbook
    5. Dim s_wb As Workbook
    6. Dim t_wb As Workbook
    7.  
    8. Set a_wb = ActiveWorkbook
    9. Set s_wb = Workbooks("L1RACK_FC_EA.xls" ).Worksheets("L1RACK_FC_EA" )
    10.  
    11. For num = 1 To 4000
    12. nom = numeroter_fichier(a_wb.Path & "\" & a_wb.Name, num)
    13. a_wb.SaveCopyAs nom
    14.  
    15. Set t_wb = Workbooks.Open(nom)
    16.  
    17. t_wb.Range("C8" ).Value = s_wb.Range("E2").Value
    18. t_wb.Range("F8" ).Value = s_wb.Range("D2").Value
    19. t_wb.Range("J8" ).Value = s_wb.Range("I2").Value
    20. t_wb.Range("C13").Value = s_wb.Range("A2").Value
    21. t_wb.Range("G13").Value = s_wb.Range("B2").Value
    22. t_wb.Range("J13").Value = s_wb.Range("D2").Value
    23.  
    24. t_wb.Save
    25. t_wb.Close
    26.  
    27. Next
    28. End Sub

    Tu vas me dire que je suis completement gauche mais je n'arrive pas a faire fonctionner le code. Et je comprend pas le début ou tu parle de chemin (vu que logiquement il copie dans le même dossier que celui de la source).

    J'ai copier coller ton code ds VB et lorsque je click, il m'indique qu'il manque un objet :S...
    Expert Programmation

    Rhooooooo, c'est beau.
    Et on fait une zolie procédure sans activetruc parce que je n'aime pas ça !

    1. Public Sub ZolieProc(wb_1 As Workbook)
    2. Dim num As Integer
    3. Dim nom As String
    4. Dim s_wb As Workbook
    5. Dim t_wb As Workbook
    6.  
    7. Set s_wb = Workbooks("L1RACK_FC_EA.xls" ).Worksheets("L1RACK_FC_EA" )
    8.  
    9. For num = 1 To 4000
    10. nom = numeroter_fichier(wb_1.Path & "\" & wb_1.Name, num)
    11. wb_1.SaveCopyAs nom
    12.  
    13. Set t_wb = Workbooks.Open(nom)
    14.  
    15. t_wb.Range("C8" ).Value = s_wb.Range("E2").Value
    16. t_wb.Range("F8" ).Value = s_wb.Range("D2").Value
    17. t_wb.Range("J8" ).Value = s_wb.Range("I2").Value
    18. t_wb.Range("C13").Value = s_wb.Range("A2").Value
    19. t_wb.Range("G13").Value = s_wb.Range("B2").Value
    20. t_wb.Range("J13").Value = s_wb.Range("D2").Value
    21.  
    22. t_wb.Save
    23. t_wb.Close
    24. Next
    25. End Sub
    26.  
    27. Public Sub CommandButton1_Click() 'copie sauvegarde classeur
    28. ZolieProc ActiveWorkbook
    29. End Sub


    L'est pas belle la vie ?
    Expert Programmation

    Quoi !
    Il manque un objet ?

    Mon ptit bonhomme, t'auras rien ici si tu ne fais pas d'effort. :o 

    En l'occurrence, il s'agit de dire où, à quelle ligne, dans quel cas, avec un exemple, et avec le message d'erreur complet !

    Oui merci a toi et à ton bos!! ;) .
    Bon alors la j'ai copier coler ds VB ceci:

    1. Function numeroter_fichier(fichier As String, numero As Integer) As String
    2. Dim FSO As Object
    3. Set FSO = CreateObject("Scripting.FileSystemObject")
    4.  
    5. numeroter_fichier = FSO.GetParentFolderName(fichier) & "\" & _
    6. FSO.GetBaseName(fichier) & "_" & numero & "." & _
    7. FSO.GetExtensionName(fichier)
    8. End Function
    9. Public Sub ZolieProc(wb_1 As Workbook)
    10. Dim num As Integer
    11. Dim nom As String
    12. Dim s_wb As Workbook
    13. Dim t_wb As Workbook
    14.  
    15. Set s_wb = Workbooks("L1RACK_FC_EA.xls").Worksheets("L1RACK_FC_EA")
    16.  
    17. For num = 1 To 4000
    18. nom = numeroter_fichier(wb_1.Path & "\" & wb_1.Name, num)
    19. wb_1.SaveCopyAs nom
    20.  
    21. Set t_wb = Workbooks.Open(nom)
    22.  
    23. t_wb.Range("C8").Value = s_wb.Range("E2").Value
    24. t_wb.Range("F8").Value = s_wb.Range("D2").Value
    25. t_wb.Range("J8").Value = s_wb.Range("I2").Value
    26. t_wb.Range("C13").Value = s_wb.Range("A2").Value
    27. t_wb.Range("G13").Value = s_wb.Range("B2").Value
    28. t_wb.Range("J13").Value = s_wb.Range("D2").Value
    29.  
    30. t_wb.Save
    31. t_wb.Close
    32. Next
    33. End Sub
    34.  
    35. Public Sub CommandButton1_Click() 'copie sauvegarde classeur
    36. ZolieProc ActiveWorkbook
    37. End Sub


    Et lorsque je vais clicker sur le bouton, j'ai un message qui me dit:
    Incompatibilité de type :'( 

    Que dois-je faire??
    Expert Programmation

    Ah, ok. Ben faut le préciser quand même. ;) 
    Alors, mets un point d'arrêt sur la ligne 15 (mets le curseur sur la ligne "Set s_wb = " et appuie sur F9) puis clique sur ton bouton.

    Ensuite, appuie sur F8 jusqu'à ce que l'erreur se produise. Et là, dis-moi sur quelle ligne il plante.
    Expert Programmation

    Salut Picpic le belge :hello: 
    Mi euj suis Picard.
    (Un boyau rouge, c'est un Artésien, et par extension, un habitant du Pas-de-Calais, immatriculé 62 ^^ )

    Bon, alors si la ligne "Set s_wb..." est en rouge, c'est parce que tu as fais F9 dessus, c'est le point d'arrêt. Normal.

    Donc tu lances ton programmes, il s'arrête gentiment sur la ligne "Set s_wb = " parce que tu y as mis un point d'arrêt, et quand tu redémarres avec un F8, il plante aussitôt, avec une erreur 13. :/ 

    Un erreur 9 sera plus vraisemblable :
    ---------------------------
    Erreur d'exécution '9': L'indice n'appartient pas à la sélection.
    ---------------------------

    Le classeur L1RACK_FC_EA.xls existe ?
    Est-il ouvert ?
    Possède-t-il une feuille L1RACK_FC_EA ?

    Enchanté Zeb le picard ;)  le 62 n'a aucune signification (picpic seul n'étais pas libre dans hotmail qd j'ai fai mon adresse)

    Le classeur L1RACK_FC... existe avec la feuille L1RACK... et il est ouvert
    Et c'est toujours bien l'erreur 13...

    Si je ferme le classeur LIRACK... contenant la feuille du même nom, lorsque je click sur le bouton j'ai le message d'erreur suivant: L'indice n'apartient pas à la sélection et lorsque je click sur aide il m'affiche l'erreur 9

    Je viens de tester ca marche nickel!!! Il y a juste un truc... il passe pas à la ligne suivante du tableau... donc dans les lignes t_ws.Range("C8" ).Value = s_ws.Range("E2" ).Value il reste tout le temps en E2 (dans ce cas ci) et moi j'aimerais qu'a chaque page, il passe en 3 puis 4...

    Je te remercie déja pour tout ce que tu as fai pour moi... je ne sais comment te remercier!
    Expert Programmation

    Comment me remercier...

    Et bien en ouvrant l'aide en ligne (l'aide d'Excel, en faisant F1) sur la fonction Range. Intéressant, n'est-ce pas ?
    Maintenant, la fonction Cell. Pas mal, non ?

    Remplace Range par Cell dans les lignes 17 à 22. Oui, oui, tout seul, comme un grand, sans autre aide que celle d'Excel.

    Ca marche ? Ben maintenant, à toi de trouver comment décaler :) 

    Je te remercie pour ton aide précieuse, j'ai trouvé hier en faisant une recherche pour incrémentation+VB et j'ai pu observer la syntaxe

    Voici le code définitif:

    1. Function numeroter_fichier(fichier As String, numero As Integer) As String
    2. Dim FSO As Object
    3. Set FSO = CreateObject("Scripting.FileSystemObject")
    4.  
    5. numeroter_fichier = FSO.GetParentFolderName(fichier) & "\" & _
    6. FSO.GetBaseName(fichier) & "_" & numero & "." & _
    7. FSO.GetExtensionName(fichier)
    8. End Function
    9. Public Sub ZolieProc(wb_1 As Workbook)
    10. Dim num As Integer
    11. Dim nom As String
    12. Dim t_wb As Workbook
    13. Dim s_ws As Worksheet
    14. Dim t_ws As Worksheet
    15.  
    16. Set s_ws = Workbooks("L1RACK_FC_EA.xls").Worksheets("L1RACK_FC_EA")
    17.  
    18. For num = 1 To 5
    19. i = num + 1
    20. nom = numeroter_fichier(wb_1.Path & "\" & wb_1.Name, num)
    21. wb_1.SaveCopyAs nom
    22.  
    23. Set t_wb = Workbooks.Open(nom)
    24. Set t_ws = t_wb.Worksheets(1)
    25.  
    26. t_ws.Range("B8").Value = s_ws.Range("E" & i).Value
    27. t_ws.Range("F8").Value = s_ws.Range("D" & i).Value
    28. t_ws.Range("F10").Value = s_ws.Range("I" & i).Value
    29. t_ws.Range("B15").Value = s_ws.Range("A" & i).Value
    30. t_ws.Range("G15").Value = s_ws.Range("B" & i).Value
    31. t_ws.Range("J15").Value = s_ws.Range("C" & i).Value
    32.  
    33. t_wb.Save
    34. t_wb.Close
    35. Next
    36. End Sub
    37.  
    38. Public Sub CommandButton1_Click() 'copie sauvegarde classeur
    39. ZolieProc ActiveWorkbook
    40. End Sub
    Expert Programmation

    Pas mal.
    Voici ce que je te proposais de découvrir :

    1. For num = 1 To 5
    2. i = num + 1
    3.  
    4. ...
    5.  
    6. t_ws.Cells(8, 2).Value = s_ws.Cells(i, 5).Value
    7. t_ws.Range(8, 6).Value = s_ws.Cells(i, 4).Value
    8.  
    9. ...
    10. Next

    Parce que là, ce sont des nombres, mais s'il avait fallu prendre la colonne suivante à la colonne D ?

    Et encore mieux, parce que c'est plus lisible et plus variable :

    1. For num = 1 To ...
    2. ...
    3. t_ws.Cells(8, 2).Value = s_ws.Cells(num + 1, 5).Value
    4. t_ws.Range(8, 6).Value = s_ws.Cells(num + 1, 4).Value
    5. ...
    6. Next


    Enjoy !
    Expert Programmation

    Et si tu cherchais un peu...
    Lis donc ça : http://www.presence-pc.com/forum/ppc/Programmation/vous... (C'est de moi :sol: )

    Des que tu sauras faire pour un, tu pourras le mettre dans ta boucle pour le faire pour tous.

    (En repassant ici et en montrant comment tu as fais, tu pourras recevoir d'autres critiques (objectives) et tu montreras un exemple que d'autres pourront réutiliser, c'est là tout ce qu'on te demande en remerciement ;)  puisque tu posais la question.)

    Voila Zeb, j'ai trouvé en enregistrant une macro. Je sais qu'il y a des champs dans Print que je peux virer (style les 1 mais pas le nom de l'imprimante ou alors ca imprimera sur l'imprimante par défaut). Voici le code (dans l'attente de suggestions pour l'améliorer):
    1. Function numeroter_fichier(fichier As String, numero As Integer) As String
    2. Dim FSO As Object
    3. Set FSO = CreateObject("Scripting.FileSystemObject")
    4.  
    5. numeroter_fichier = FSO.GetParentFolderName(fichier) & "\" & _
    6. FSO.GetBaseName(fichier) & "_" & numero & "." & _
    7. FSO.GetExtensionName(fichier)
    8. End Function
    9. Public Sub ZolieProc(wb_1 As Workbook)
    10. Dim num As Integer
    11. Dim nom As String
    12. Dim t_wb As Workbook
    13. Dim s_ws As Worksheet
    14. Dim t_ws As Worksheet
    15.  
    16. Set s_ws = Workbooks("L1RACK_FC_EA.xlsx").Worksheets("L1RACK_FC_EA")
    17.  
    18. For num = 1 To 2
    19. i = num + 1
    20. nom = numeroter_fichier(wb_1.Path & "\" & wb_1.Name, num)
    21. wb_1.SaveCopyAs nom
    22.  
    23. Set t_wb = Workbooks.Open(nom)
    24. Set t_ws = t_wb.Worksheets(1)
    25.  
    26. t_ws.Range("B8").Value = s_ws.Range("E" & i).Value
    27. t_ws.Range("F8").Value = s_ws.Range("D" & i).Value
    28. t_ws.Range("F10").Value = s_ws.Range("I" & i).Value
    29. t_ws.Range("B15").Value = s_ws.Range("A" & i).Value
    30. t_ws.Range("G15").Value = s_ws.Range("B" & i).Value
    31. t_ws.Range("J15").Value = s_ws.Range("C" & i).Value
    32.  
    33. t_wb.Save
    34. Application.ActivePrinter = "PDFCreator sur Ne00:"
    35. ExecuteExcel4Macro _
    36. "PRINT(1,,,1,,,,,,,,2,""PDFCreator sur Ne00:"",,TRUE,,FALSE)"
    37. t_wb.Close
    38. Next
    39. End Sub
    40.  
    41. Public Sub CommandButton1_Click() 'copie sauvegarde classeur
    42. ZolieProc ActiveWorkbook
    43. End Sub
    Lassé par la pub ? Créez un compte