2010-12-14 11 views
0

Ich verwende die folgende Subroutine, um mehrere Excel-Dateien aus einem einzigen Ordner in einer einzigen Arbeitsmappe mit mehreren Arbeitsblättern zu kombinieren.Excel-Makrohilfe - Stapeln von Makros

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 

Das Endprodukt ist eine Excel-Datei mit mehreren Arbeitsblättern (sowie einem leeren Blatt 1). Ich habe mich gefragt, wie ich dann ein weiteres Makro auf dieses neu erstellte Arbeitsbuch anwenden kann. Als ein Beispiel möchte ich, dass alle Arbeitsblätter in dieser neuen Arbeitsmappe ihre Kopfzeilen fett und auf eine bestimmte Weise koloriert haben und dass das leere Arbeitsblatt gelöscht wird.

zB:

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

Schließen Sie die Frage, Sam! –

Antwort

0

einen Parameter Header hinzufügen, der ein Blatt gibt, dann die Unter ruft irgendwo in der Do-Schleife nach der Kopie, wie:

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

mit Ihrem zweiten Unter suchen dies wie:

Sub Headers(workingSheet As Worksheet) 

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

Dieser Code wird wie folgt vor:

Erste

1), löschen Sheet1 wie Sie in Ihrem Beitrag fragte

2) Formatieren Sie die obere Reihe in den verbleibenden Blätter

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

Keine Notwendigkeit, die Arbeitsblätter durchzulaufen. GRUPPIEREN Sie sie einfach, erledigen Sie den Job und dann UNGROUP sie. –

+0

@iDevlop - können Sie mir einen Code dafür zeigen? Um in VBA zu gruppieren, dachte ich, dass Sie ein Array von Arbeitsblättern erstellen mussten, z. Sheets (Array ("Sheet1", "Sheet2", "Sheet3")) scheint mir aber, dass Sie zuerst jedes Arbeitsblatt in der Arbeitsmappe durchlaufen müssen, um das Array zu erstellen? –

+0

Ich schrieb eine Antwort mit einem Beispiel (um formatierten Code zu haben) –

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

iDevlop - Ich stimme zu, dass das funktioniert, aber mein Punkt war, dass Sie die Blattverweise hart codieren müssen und Sie davon ausgehen, dass nur drei Blätter Sheet1, Sheet2 sind und Blatt3. Um den Code so wiederverwendbar wie möglich zu machen (d. H. Mit einer unbestimmten Anzahl von Blättern und Namen umgehen), können Sie nicht vermeiden, dass Sie die Blätter durchlaufen ... –

+0

@Remnant: Ich stimme Ihrem Einwand zu. Ich habe momentan keine Zeit, aber ich werde versuchen, einen richtigen Weg zu zeigen. Ich bin mir ziemlich sicher, dass ich das vor einiger Zeit getan habe, indem ich auf das erste und das letzte Blatt (das Sie identifizieren können) verwiesen habe. Ich muss nur herausfinden, wie ... oder zugeben, dass ich falsch liege ;-) –

+0

was wäre gut, wenn VBA etwas wie ActiveWorkbook.Worksheets.Group hätte. Übrigens, sehen Sie nicht darüber nach, wer falsch oder richtig ist ... es geht darum, einander zu helfen, zu lernen, und ich wäre erfreut, wenn Sie mir eine effizientere Art des Codierens zeigen könnten! –