Résolu Excel Macro et VB

  • Auteur de la discussion picpic62
  • Date de début

zeb

Modérateur
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 ?
 

picpic62

Nouveau membre
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...
 

picpic62

Nouveau membre
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
 

zeb

Modérateur
Meilleure réponse
Oufti !!!!!
C'est du grand n'importe quoi, ça, mon ptit zeb >:/

Code:
Dim s_wb As Workbook
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 :
Code:
Public Sub ZolieProc(wb_1 As Workbook)
  Dim num As Integer
  Dim nom As String
  Dim t_wb As Workbook
  Dim s_ws As Worksheet
  Dim t_ws As Worksheet

  Set s_ws = Workbooks("L1RACK_FC_EA.xls" ).Worksheets("L1RACK_FC_EA" )

  For num = 1 To 4000
    nom = numeroter_fichier(wb_1.Path & "\" & wb_1.Name, num)
    wb_1.SaveCopyAs nom

    Set t_wb = Workbooks.Open(nom)
    Set t_ws = t_wb.Worksheets(1)

    t_ws.Range("C8" ).Value = s_ws.Range("E2" ).Value
    t_ws.Range("F8" ).Value = s_ws.Range("D2" ).Value
    t_ws.Range("J8" ).Value = s_ws.Range("I2" ).Value
    t_ws.Range("C13" ).Value = s_ws.Range("A2" ).Value
    t_ws.Range("G13" ).Value = s_ws.Range("B2" ).Value
    t_ws.Range("J13" ).Value = s_ws.Range("D2" ).Value
 
    t_wb.Save
    t_wb.Close
  Next
End Sub

Public Sub CommandButton1_Click() 'copie sauvegarde classeur
    ZolieProc ActiveWorkbook
End Sub
 

picpic62

Nouveau membre
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!
 

zeb

Modérateur
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 :)
 

picpic62

Nouveau membre
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:

Code:
Function numeroter_fichier(fichier As String, numero As Integer) As String
    Dim FSO As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")

    numeroter_fichier = FSO.GetParentFolderName(fichier) & "\" & _
                        FSO.GetBaseName(fichier) & "_" & numero & "." & _
                        FSO.GetExtensionName(fichier)
End Function
Public Sub ZolieProc(wb_1 As Workbook)
  Dim num As Integer
  Dim nom As String
  Dim t_wb As Workbook
  Dim s_ws As Worksheet
  Dim t_ws As Worksheet

  Set s_ws = Workbooks("L1RACK_FC_EA.xls").Worksheets("L1RACK_FC_EA")

  For num = 1 To 5
    i = num + 1
    nom = numeroter_fichier(wb_1.Path & "\" & wb_1.Name, num)
    wb_1.SaveCopyAs nom

    Set t_wb = Workbooks.Open(nom)
    Set t_ws = t_wb.Worksheets(1)

    t_ws.Range("B8").Value = s_ws.Range("E" & i).Value
    t_ws.Range("F8").Value = s_ws.Range("D" & i).Value
    t_ws.Range("F10").Value = s_ws.Range("I" & i).Value
    t_ws.Range("B15").Value = s_ws.Range("A" & i).Value
    t_ws.Range("G15").Value = s_ws.Range("B" & i).Value
    t_ws.Range("J15").Value = s_ws.Range("C" & i).Value
    
    t_wb.Save
    t_wb.Close
  Next
End Sub

Public Sub CommandButton1_Click() 'copie sauvegarde classeur
    ZolieProc ActiveWorkbook
End Sub
 

zeb

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

Code:
For num = 1 To 5
    i = num + 1

    ...

    t_ws.Cells(8, 2).Value = s_ws.Cells(i, 5).Value
    t_ws.Range(8, 6).Value = s_ws.Cells(i, 4).Value
    
    ...
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 :

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

Enjoy !
 

picpic62

Nouveau membre
Encore merci pour toute tes infos, je suis entrain d'utiliser le prog ca marche bien!!! Mais je me demandais s'il y avait moyen d'envoyer à l'impression en même temps que l'on enregistre?
 

zeb

Modérateur
Et si tu cherchais un peu...
Lis donc ça : (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.)
 

picpic62

Nouveau membre
Oki j'essayerai de regarder ça le w-e et quand j'aurai trouvé, je posterai ma solution.
 

picpic62

Nouveau membre
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):
Code:
Function numeroter_fichier(fichier As String, numero As Integer) As String
    Dim FSO As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")

    numeroter_fichier = FSO.GetParentFolderName(fichier) & "\" & _
                        FSO.GetBaseName(fichier) & "_" & numero & "." & _
                        FSO.GetExtensionName(fichier)
End Function
Public Sub ZolieProc(wb_1 As Workbook)
  Dim num As Integer
  Dim nom As String
  Dim t_wb As Workbook
  Dim s_ws As Worksheet
  Dim t_ws As Worksheet

  Set s_ws = Workbooks("L1RACK_FC_EA.xlsx").Worksheets("L1RACK_FC_EA")

  For num = 1 To 2
    i = num + 1
    nom = numeroter_fichier(wb_1.Path & "\" & wb_1.Name, num)
    wb_1.SaveCopyAs nom

    Set t_wb = Workbooks.Open(nom)
    Set t_ws = t_wb.Worksheets(1)

    t_ws.Range("B8").Value = s_ws.Range("E" & i).Value
    t_ws.Range("F8").Value = s_ws.Range("D" & i).Value
    t_ws.Range("F10").Value = s_ws.Range("I" & i).Value
    t_ws.Range("B15").Value = s_ws.Range("A" & i).Value
    t_ws.Range("G15").Value = s_ws.Range("B" & i).Value
    t_ws.Range("J15").Value = s_ws.Range("C" & i).Value
   
    t_wb.Save
    Application.ActivePrinter = "PDFCreator sur Ne00:"
    ExecuteExcel4Macro _
       "PRINT(1,,,1,,,,,,,,2,""PDFCreator sur Ne00:"",,TRUE,,FALSE)"
    t_wb.Close
  Next
End Sub

Public Sub CommandButton1_Click() 'copie sauvegarde classeur
    ZolieProc ActiveWorkbook
End Sub
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 137
Messages
6 718 147
Membres
1 586 399
Dernier membre
mehdivil59
Partager cette page
Haut