2010-12-14 87 views
0

J'utilise la sous-routine suivante pour combiner plusieurs fichiers Excel d'un seul dossier dans un seul classeur avec plusieurs feuilles de calcul.Aide de la macro Excel - Empilage des macros

Sub Merge2MultiSheets() 

Dim wbDst As Workbook 
Dim wbSrc As Workbook 
Dim wsSrc As Worksheet 
Dim MyPath As String 
Dim strFilename As String 

Application.DisplayAlerts = False 
Application.EnableEvents = False 
Application.ScreenUpdating = False 
MyPath = "C:\MyPath" ' <-- Insert Absolute Folder Location 
Set wbDst = Workbooks.Add(xlWBATWorksheet) 
strFilename = Dir(MyPath & "\*.xls", vbNormal) 

If Len(strFilename) = 0 Then Exit Sub 

Do Until strFilename = ""    
    Set wbSrc = Workbooks.Open(Filename:=MyPath & "\" & strFilename)     
    Set wsSrc = wbSrc.Worksheets(1)     
    wsSrc.Copy After:=wbDst.Worksheets(wbDst.Worksheets.Count)     
    wbSrc.Close False    
    strFilename = Dir()    
Loop 
wbDst.Worksheets(1).Delete 

Application.DisplayAlerts = True 
Application.EnableEvents = True 
Application.ScreenUpdating = True 

End Sub 

Le produit final est un fichier Excel contenant plusieurs feuilles de calcul (ainsi qu'une feuille 1 vierge). Je me demandais comment puis-je appliquer une autre macro à ce cahier nouvellement créé. Par exemple, je souhaite que toutes les feuilles de calcul de ce nouveau classeur aient leurs en-têtes en gras et en couleur d'une certaine manière, et que la feuille de calcul vide soit supprimée.

par exemple:

Sub Headers() 

Rows("1:1").Select 
Selection.Font.Bold = True 
With Selection.Interior 
    .ColorIndex = 37 
    .Pattern = xlSolid 
End With 
Selection.Borders(xlDiagonalDown).LineStyle = xlNone 
Selection.Borders(xlDiagonalUp).LineStyle = xlNone 
With Selection.Borders(xlEdgeLeft) 
    .LineStyle = xlContinuous 
    .Weight = xlThin 
    .ColorIndex = xlAutomatic 
End With 
With Selection.Borders(xlEdgeTop) 
    .LineStyle = xlContinuous 
    .Weight = xlThin 
    .ColorIndex = xlAutomatic 
End With 
With Selection.Borders(xlEdgeBottom) 
    .LineStyle = xlContinuous 
    .Weight = xlThin 
    .ColorIndex = xlAutomatic 
End With 
With Selection.Borders(xlEdgeRight) 
    .LineStyle = xlContinuous 
    .Weight = xlThin 
    .ColorIndex = xlAutomatic 
End With 
With Selection.Borders(xlInsideVertical) 
    .LineStyle = xlContinuous 
    .Weight = xlThin 
    .ColorIndex = xlAutomatic 
End With 

End Sub 
+0

Fermez la question, Sam! –

Répondre

0

Ajouter un paramètre à en-têtes qui spécifie une feuille, puis appeler le sous quelque part dans la boucle Do après la copie, comme:

Call Headers(wbDst.Worksheets(wbDst.Worksheets.Count)) 

avec votre deuxième sous la recherche comme ceci:

Sub Headers(workingSheet As Worksheet) 

workingSheet.Rows("1:1").Select 
Selection.Font.Bold = True 
With Selection.Interior 
. 
. 
. 
0

ce code va effectuer les opérations suivantes:

1) Tout d'abord, supprimer Sheet1 que vous avez demandé dans votre post

2) Formater la rangée supérieure dans les feuilles restantes

Sub Headers() 
Dim wkSheet As Worksheet 

//Delete Sheet1. Note that alerts are turned off otherwise you are prompted with a dialog box to check you want to delete sheet1 
Application.DisplayAlerts = False 
Worksheets("Sheet1").Delete 
Application.DisplayAlerts = False 

//Loop through each worksheet in workbook sheet collection 
For Each wkSheet In ActiveWorkbook.Worksheets 
    With wkSheet.Rows("1:1") 
     .Interior.ColorIndex = 37 
     //Add additional formatting requirements here 
    End With 
Next 

End Sub 
+0

Pas besoin de faire défiler les feuilles de calcul. Il suffit de les GROUPER, faire le travail, puis les UNGROUP. –

+0

@iDevlop - pouvez-vous me montrer du code pour cela? Pour regrouper dans VBA je pensais que vous deviez créer un tableau de feuilles de calcul par exemple. Sheets (Array ("Sheet1", "Sheet2", "Sheet3")) mais il me semble que pour ce faire, vous devez d'abord parcourir chaque feuille de calcul dans le classeur pour créer le tableau? –

+0

J'ai posté une réponse avec un échantillon (pour avoir un code formaté) –

1
Sheets.Select  'selects all sheets' 
Rows("1:1").Select 
Selection.Interior.ColorIndex = 37 
+0

iDevlop - Je suis d'accord que cela fonctionne, mais mon point était que vous devez coder les références de feuille et vous supposez qu'il n'y a que trois feuilles nommées Sheet1, Sheet2 et Sheet3. Pour rendre le code aussi réutilisable que possible (ie gérer un nombre indéterminé de feuilles et de noms) vous ne pouvez pas éviter de faire défiler les feuilles ... –

+0

@Remnant: Je suis d'accord avec votre objection. Je n'ai pas le temps maintenant, mais je vais essayer de montrer la bonne façon. Je suis sûr que je l'ai fait il y a quelque temps en faisant référence à la première et dernière feuille (que vous pouvez identifier). Juste besoin de trouver comment ... ou admettre que je me trompe ;-) –

+0

ce qui serait bien si VBA avait quelque chose comme ActiveWorkbook.Worksheets.Group. Au fait, ne regardez pas ceci à propos de qui a tort ou raison ... il s'agit de s'entraider pour apprendre et je serais ravi si vous pouviez me montrer une méthode de codage plus efficace! –