2017-09-01 115 views
0

我目前運行2個宏。將工作簿合併到一個主工作表中

1)將我的文件夾中的所有csv全部打開並在一個工作簿中打開 - 這很好。

2)將它們全部組合到主工作表中。

我的問題是2.它跳過一些文件。這是大約250 csv文件,我試圖把它放到一個。一些工作簿將是空白的,但仍會有標題。標題都是一樣的。

這裏是代碼:

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 = "PATH" ' change to suit 
    Set wbDst = Workbooks.Add(xlWBATWorksheet) 
    strFilename = Dir(MyPath & "\*.csv", 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 

Sub CopyFromWorksheets() 
    Dim wrk As Workbook 'Workbook object - Always good to work with object variables 
    Dim sht As Worksheet 'Object for handling worksheets in loop 
    Dim trg As Worksheet 'Master Worksheet 
    Dim rng As Range 'Range object 
    Dim colCount As Integer 'Column count in tables in the worksheets 

    Set wrk = ActiveWorkbook 'Working in active workbook 

    For Each sht In wrk.Worksheets 
     If sht.Name = "Master" Then 
      MsgBox "There is a worksheet called as 'Master'." & vbCrLf & _ 
      "Please remove or rename this worksheet since 'Master' would be" & _ 
      "the name of the result worksheet of this process.", vbOKOnly + vbExclamation, "Error" 
      Exit Sub 
     End If 
    Next sht 

    'We don't want screen updating 
    Application.ScreenUpdating = False 

    'Add new worksheet as the last worksheet 
    Set trg = wrk.Worksheets.Add(After:=wrk.Worksheets(wrk.Worksheets.Count)) 
    'Rename the new worksheet 
    trg.Name = "Master" 
    'Get column headers from the first worksheet 
    'Column count first 
    Set sht = wrk.Worksheets(1) 
    colCount = sht.Cells(1, 255).End(xlToLeft).Column 
    'Now retrieve headers, no copy&paste needed 
    With trg.Cells(1, 1).Resize(1, colCount) 
     .Value = sht.Cells(1, 1).Resize(1, colCount).Value 
     'Set font as bold 
     .Font.Bold = True 
    End With 

    'We can start loop 
    For Each sht In wrk.Worksheets 
     'If worksheet in loop is the last one, stop execution (it is Master worksheet) 
     If sht.Index = wrk.Worksheets.Count Then 
      Exit For 
     End If 
     'Data range in worksheet - starts from second row as first rows are the header rows in all worksheets 
     Set rng = sht.Range(sht.Cells(2, 1), sht.Cells(65536, 1).End(xlUp).Resize(, colCount)) 
     'Put data into the Master worksheet 
     trg.Cells(65536, 1).End(xlUp).Offset(1).Resize(rng.Rows.Count, rng.Columns.Count).Value = rng.Value 
    Next sht 
    'Fit the columns in Master worksheet 
    trg.Columns.AutoFit 

    'Screen updating should be activated 
    Application.ScreenUpdating = True 
End Sub 

我的頭從A3走:C3,上面是不需要的數據。

+0

如果您使用的是Excel 2013或更高版本你可能要考慮使用Power查詢/ GET和變換。它可以將一大套.csv整合到一張表中,而不需要任何宏工作,並且可能會快得多(假設您實際上並不需要每個.csv,因爲它也是工作簿中的自己的選項卡,似乎是一個壞主意)。 – Wedge

+0

@Wedge Im 2010 :(我想我很快就會得到2013的。 – excelguy

+0

@Wedge Is Power Power 2010年的查詢可以作爲免費的MS加載項嗎? –

回答

1

通過將CSV工作表複製到工作簿中,然後將數據複製到主選項卡,您正在做不必要的工作。只需將CSV中的數據直接帶入預先加載的主選項卡(模板)即可。

此代碼假定工作簿中有1個工作表,該工作表將運行已經定義了標題的代碼。請參閱有關將10調整爲實際擁有的列標題數的說明。

Option Explicit 

Sub LoadCSVs() 

Dim wsDest As Worksheet 
Set wsDest = ThisWorkbook.Worksheets("Master") 

With wsDest 

    'clear old data if needed 
    If Len(.Range("B2")) Then 
     Intersect(.UsedRange, .UsedRange.Offset(1)).Clear 'removes old data 
    End If 

End With 

Application.ScreenUpdating = False 

Dim MyPath As String 
MyPath = "PATH" ' change to suit 

Dim strFilename As String 
strFilename = Dir(MyPath & "\*.csv", vbNormal) 

If Len(strFilename) = 0 Then Exit Sub 

Do Until strFilename = "" 

    Dim wbSrc As Workbook 
    Set wbSrc = Workbooks.Open(Filename:=MyPath & "\" & strFilename) 

    Dim wsSrc As Worksheet 
    Set wsSrc = wbSrc.Worksheets(1) 

    With wsSrc 

     If Len(.Range("B2")) Then 

      Dim vData As Variant 'load data to variant 
      vData = Intersect(.UsedRange, .UsedRange.Offset(1)) 

      'place on master tab               'adjust to column header length 
      wsDest.Range("A" & wsDest.Rows.Count).End(xlUp).Offset(1).Resize(UBound(vData), 10).Value = vData 

     End If 

    End With 

    wbSrc.Close False 

    strFilename = Dir() 

Loop 

End Sub 
+0

這看起來工作。讓我測試它的升技。 – excelguy

+0

我應該有一個空白工作簿中名爲master的工作表?我已經命名爲master,然後代碼執行完美,但是沒有數據被複制到主數據中,並且在A1和A2中也有類似文件名和記錄數的數據,但是標題不會在A3:C3之前啓動 – excelguy

+0

您需要將代碼調整到哪裏我在第1行中用'Intersect(.UsedRange,.UsedRange.Offset(1))'假定了頭文件,想法是將這段代碼放入一張工作簿中,其中一張工作表叫做'Master',頭部在第一行。 –

0

該索引可能不可靠,您可能會過早退出循環。

For Each sht In wrk.Worksheets 

    If sht.Name <> "Master"    
     'Data range in worksheet - starts from second row as first rows are the header rows in all worksheets 
     Set rng = sht.Range(sht.Cells(2, 1), sht.Cells(65536, 1).End(xlUp).Resize(, colCount)) 
     'Put data into the Master worksheet 
     trg.Cells(65536, 1).End(xlUp).Offset(1).Resize(rng.Rows.Count, rng.Columns.Count).Value = rng.Value 
    End If 

Next sht 
+0

嗨niton,感謝您的回答,我正在尋找一些代碼,它結合了所有。正如斯科特所說,我通過首先將csv引入工作簿來完成不必要的工作。 – excelguy

相關問題