2017-03-15 12 views
0

私はVBAで新しくなっています。私は、指定されたファイルの場所からワークシートをマスターの統合ワークブックにコピーしようとしています。重複したワークシートを統合ワークブックにコピーしないようにしたいと思います。たとえば、シート1がマスターの統合ワークブックにコピーされている場合、コマンドが実行されたときに再コピーする必要はありません。以下は私がこれまで持っていたコードです。ワークシートを複製せずに別のワークブックにコピーする

Private Sub CommandButton1_Click() 

Dim directory As String 
Dim fileName As String 
Dim sheet As Worksheet 
Dim total As Integer 

Application.ScreenUpdating = False 
Application.DisplayAlerts = False 

directory = "c:\test\" 
' edit directory 

fileName = Dir(directory & "*.xl??") 

Do While fileName <> "" 
Workbooks.Open (directory & fileName) 

For Each sheet In Workbooks(fileName).Worksheets 
    total = Workbooks("test import.xlsm").Worksheets.Count 
    Workbooks(fileName).Worksheets(sheet.Name).Copy _ 
    after:=Workbooks("test import.xlsm").Worksheets(total) 
Next sheet 

Workbooks(fileName).Close 

fileName = Dir() 

Loop 


Application.ScreenUpdating = True 
Application.DisplayAlerts = True 

End Sub 

答えて

0

Function IsSheetFree(wb As Workbook, shtName As String) As Boolean 
    Dim sht As Worksheet 

    On Error Resume Next '<--| prevent any subsequent error to stop the function 
    Set sht = wb.Worksheets(shtName) '<--| try setting 'sht' worksheet object to the one with passed name in the passed workbook 
    IsSheetFree = sht Is Nothing '<--| return 'True' if 'sht' has not been successfully set 
End Function 

のようなヘルパー関数を使用して、次のようにそれを悪用する可能性があります:コメントを

Private Sub CommandButton1_Click() 

    Dim directory As String 
    Dim fileName As String 
    Dim sht As Worksheet 

    Dim totalWb As Workbook 

    Set totalWb = Workbooks("test import.xlsm") 

    Application.ScreenUpdating = False 
    Application.DisplayAlerts = False 

    directory = "c:\test\" 
    ' edit directory 

    fileName = Dir(directory & "*.xl??") 

    Do While fileName <> "" 
     Workbooks.Open directory & fileName '<--| this makes the just opened workbook the "active" one 

     For Each sht In Worksheets '<--| loop through currently active workbook worksheets 
      If IsSheetFree(totalWb, sht.Name) Then sht.Copy after:=totalWb.Worksheets(totalWb.Worksheets.Count) 
     Next sht 

     ActiveWorkbook.Close 

     fileName = Dir() 
    Loop 

    Application.ScreenUpdating = True 
    Application.DisplayAlerts = True 

End Sub 
0

いけないsheet.Nameを使用しています。 ワークシート(インデックス)を使用して、目的のブックを識別します。もっと安全にすると、確実に1枚ずつコピーされます(ダブルコピーは避けてください)。

+0

感謝を。私はWorksheets(sheet.Name)をWorksheets(Index)に置き換えましたが、コマンドを複数回実行すると、シートに再コピーされ、シート名の後に(2)または(3)が追加されます。それが既にコピーされている場合は、シートをまったくコピーしないようにする方法はありますか? –

関連する問題