Macro pour plusieurs fichiers
bonjour,
j'ai une macro pour insérer une ligne avec recopiage de formule ( les formules se situent en colonnes W; X ; Y )qui est valable pour un fichier A,
j'aimerai que cette macro puisse insérer la même ligne au même endroit dans plusieurs autres fichiers ( +- 25 )
tout en sachant que les 7 premières colonnes des fichiers à rajouter sont en liaisons avec le fichier A
ma question est la suivante : en insérant une ligne dans le fichier A est ce que les liaisons dans les autres fichiers seront toujours correctes et si cela est posssible comment faire
et comment faire pour que la macro soit valable pour mes 25 autres fichiers
merci d'avance pour votre attention
AUBA
Bonjour Auba,
Pour voir ma solution, il faut que tu charges dans un dossier :
- les 3 classeurs dans lesquels il faut ajouter une ligne. N'ouvrir aucun de ces fichiers : c'est la macro qui se chargera de les ouvrir !
- le classeur macro qui va agir sur ces 3 fchiers. Ce fichier là doit être ouvert. Modifie dans la macro le chemin qui permet d'accéder à ces 3 fichiers puis il te suffit de cliquer sur le bouton "Lance le traitement".
Ci-joint les 4 fichiers annoncés :
Cela repose sur la macro suivante :
Public NumLigne As String
Sub InsertLigneAvecFormules()
'Ouverture des fichiers à impacter
'---------------------------------
Workbooks.Open Filename:="C:\ ... \Fichier 01.xls"
Range("A1").Select
Workbooks.Open Filename:="C:\ ... \Fichier 02.xls"
Range("A1").Select
Workbooks.Open Filename:="C:\ ... \Fichier 03.xls"
Range("A1").Select
'Après quel N° de ligne faut-il rajouter une nouvelle ligne ?
'-----------------------------------------------------------
Recommence:
NumLigne = InputBox("Après quel N° de ligne faut-il rajouter une nouvelle ligne ?", Question)
If Not IsNumeric(NumLigne) Then GoTo Recommence
Windows("Fichier 01.xls").Activate
Call Routine
Windows("Fichier 02.xls").Activate
Call Routine
Windows("Fichier 03.xls").Activate
Call Routine
MsgBox "La nouvelle ligne a été ajoutée sur tous les fichiers !"
End Sub
Sub Routine()
'Insertion d'une nouvelle ligne
'------------------------------
Cells(NumLigne + 1, 1).Select
Selection.EntireRow.Insert
'Copie des formules se trouvant en colonne X, X et Y sur la nouvelle ligne
'-------------------------------------------------------------------------
Range(Cells(NumLigne, 23), Cells(NumLigne, 25)).Select
Selection.Copy
Range(Cells(NumLigne + 1, 23), Cells(NumLigne + 1, 25)).Select
ActiveSheet.Paste
Application.CutCopyMode = False
Range("A1").Select
End SubBonjour Marmotte18,
je viens de tester ta proposition, elle est remarquable mais j'ai encore 3 questions sur ta proposition.
dans ma demande j'avais signalé que les 7 premières colonnes étaient en liaisons et lorsque je teste il n'y a pas de liaison dans la ligne insérée
lorsque le message box qui demande le numéro de ligne pour inserer une nouvelle ligne apparait on ne peut pas annuler
dernier détail, est il possible que les fichiers ne s'ouvrent pas tous automatiquement car il y en a 25 et cela est trop lourd, est il possible de pouvoir choisir les fichiers à ouvrir via une liste déroulante
encore merci d'avance
AUBA
Bonjour AUBA,
Tu as dit : dans ma demande j'avais signalé que les 7 premières colonnes étaient en liaisons et lorsque je teste il n'y a pas de liaison dans la ligne insérée Le problème est que tu n'as transmis aucun fichier Excel permettant d'effectuer des tests. Par ailleurs, je n'ai pas non plus d'information sur la nature de ces liaisons. De ce fait, je peux difficilement voir ce que l'on peux faire !
Tu as dit : lorsque le message box qui demande le numéro de ligne pour inserer une nouvelle ligne apparait on ne peut pas annulerC'est effectivement une amélioration nécessaire que je peux apporter :
Recommence:
NumLigne = InputBox("Après quel N° de ligne faut-il rajouter une nouvelle ligne ?", "Question")
If NumLigne = "" Then MsgBox "ABANDON DU TRAITEMENT !": Exit Sub
If Not IsNumeric(NumLigne) Then GoTo RecommenceTu as dit : dernier détail, est il possible que les fichiers ne s'ouvrent pas tous automatiquement car il y en a 25 et cela est trop lourd, est il possible de pouvoir choisir les fichiers à ouvrir via une liste déroulante Dans ton problème d'origine, je n'ai pas fait attention au fait qu'il ne s'agissait pas de créer un enregistrement sur l'ensemble de tes fichiers mais seulement sur un ou plusieurs et jusqu'à concurrence de 25. Désolé, j'ai mal lu !
Je veux bien me pencher sur le problème mais il n'est pas sûr que j'y arrive.
Par ailleurs, l'envie de rajouter une nouvelle ligne vient-il toujours du Fichier 01 ? En tous les cas, c'est comme ça qu'a été conçue la macro.
-- 25 Juil 2010, 19:01 --
Bonsoir AUBA,
Je te joins une 2e version de ma proposition.
Fichier 01, Fichier 02 et Fichier 03 sont les mêmes qu'au début !
Dans ThisWorkBook, je mets :
Private Sub Workbook_Open()
'Réinitialise la table interne et les choix de la ListBox quand on ouvre le fichier
'----------------------------------------------------------------------------------
With Sheets("Feuil1").ListBox1
For I = 0 To .ListCount - 1
Fichier(I) = ""
If .Selected(I) = True Then .Selected(I) = False
Next I
End With
End SubDans Feuil1, je mets :
Private Sub ListBox1_Change()
'Remplissage du choix fait dans la liste déroulante des fichiers à ouvrir
'------------------------------------------------------------------------
Dim Choix As Byte
With Sheets("Feuil1").ListBox1
For Choix = 0 To .ListCount - 1
If .Selected(Choix) = True Then
Fichier(Choix) = "Fichier" & Right("00" & (Choix + 1), 2)
Else
Fichier(Choix) = ""
End If
Next Choix
End With
End Sub
Private Sub CommandButton1_Click()
'Réinitialise la table interne et les choix de la ListBox quand on clique sur le bouton "réinitialise"
'-----------------------------------------------------------------------------------------------------
With Sheets("Feuil1").ListBox1
For I = 0 To .ListCount - 1
Fichier(I) = ""
If .Selected(I) = True Then .Selected(I) = False
Next I
End With
End SubDans Module1, je mets :
Public NumLigne As String, Fichier(2) As Variant
Sub InsertLigneAvecFormules()
Dim Ctr As Byte, F As Byte
'Ouverture des fichiers à impacter
'---------------------------------
For F = 0 To 2
Select Case Fichier(F)
Case "Fichier01"
Ctr = Ctr + 1
Workbooks.Open Filename:="C:\ ... \Fichier 01.xls"
Range("A1").Select
Case "Fichier02"
Ctr = Ctr + 1
Workbooks.Open Filename:="C:\ ... \Fichier 02.xls"
Range("A1").Select
Case "Fichier03"
Ctr = Ctr + 1
Workbooks.Open Filename:="C:\ ... \Fichier 03.xls"
Range("A1").Select
End Select
Next F
If Ctr = 0 Then MsgBox "Aucun fichier n'a été sélectionné => ABANDON DU TRAITEMENT !": Exit Sub
'Après quel N° de ligne faut-il rajouter une nouvelle ligne ?
'-----------------------------------------------------------
Recommence:
NumLigne = InputBox("Après quel N° de ligne faut-il rajouter une nouvelle ligne ?", "Question")
If NumLigne = "" Then MsgBox "ABANDON DU TRAITEMENT !": Exit Sub
If Not IsNumeric(NumLigne) Then GoTo Recommence
For F = 0 To 2
Select Case Fichier(F)
Case "Fichier01"
Windows("Fichier 01.xls").Activate
Call Routine
Case "Fichier02"
Windows("Fichier 02.xls").Activate
Call Routine
Case "Fichier03"
Windows("Fichier 03.xls").Activate
Call Routine
End Select
Next F
MsgBox "La nouvelle ligne a été ajoutée sur tous les fichiers !"
End Sub
Sub Routine()
'Insertion d'une nouvelle ligne
'------------------------------
Cells(NumLigne + 1, 1).Select
Selection.EntireRow.Insert
'Copie des formules se trouvant en colonne X, X et Y sur la nouvelle ligne
'-------------------------------------------------------------------------
Range(Cells(NumLigne, 23), Cells(NumLigne, 25)).Select
Selection.Copy
Range(Cells(NumLigne + 1, 23), Cells(NumLigne + 1, 25)).Select
ActiveSheet.Paste
Application.CutCopyMode = False
Range("A1").Select
End Sub