2010-12-14 11 views
0

私は次のサブルーチンを使用して、複数のワークシートを含む単一のブックに1つのフォルダの複数のExcelファイルを結合しています。Excelマクロのヘルプ - スタッキングマクロ

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 

最終製品は、複数のワークシート(および1枚のブランクシート1)を含むExcelファイルです。私はこの新しく作成されたワークブックに別のマクロを適用する方法が不思議でした。例として、この新しいワークブック内のすべてのワークシートが、ヘッダーを太字にして特定の方法で色付けし、空のワークシートを削除することを希望します。

例えば:あなたの第2のサブを探して

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

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

で一番上の行の形式でを求めたように、まず、Sheet1を削除します! –

答えて

0

が、その後のように、コピーした後、どこかのdoループでサブを呼び出し、シートを指定するヘッダにパラメータを追加します。

Sub Headers(workingSheet As Worksheet) 

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

このコードは、次の操作を行います:

このような

1)あなたのポスト

2)、サムの質問を閉じて、残りのシート

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

ワークシートをループする必要はありません。彼らをGROUPして、仕事をしてからUNGROUPしてください。 –

+0

@iDevlop - これにいくつかのコードを表示できますか? VBAでグループ化するには、ワークシートの配列を作成する必要があると思いました。 (配列( "Sheet1"、 "Sheet2"、 "Sheet3")))しかし、これを行うには、最初に配列を作成するワークブックの各ワークシートをループする必要がありますか? –

+0

サンプルを使って回答を投稿しました(フォーマット済みのコード) –

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

iDevlop - これはうまくいきましたが、私の意見はシート参照をハードコードする必要があり、Sheet1、Sheet2という名前のシートが3枚しかないと仮定しています。 、およびSheet3。コードを可能な限り再利用できるようにするには(シートと名前の不確定数を処理する)、シートをループすることを避けることはできません。 –

+0

@残念:あなたの反対に同意します。私は今は時間がありませんが、私は正しい方法を示すようにしようとします。私は最初と最後のシート(あなたが識別できる)を参照することで、これまでにやったと確信しています。ちょうど方法を見つける必要がある...または私が間違っていることを認めよう;-) –

+0

VBAがActiveWorkbook.Worksheets.Groupのようなものを持っていれば何が良いだろう。ところで、誰が間違っているのか正しいのかを見てはいけません。お互いに学び合うことについての助けとなり、より効率的なコーディング方法を教えてくれれば嬉しく思います! –