Sửa code Gộp File

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

thang_nguyen1

Thành viên hoạt động
Tham gia
6/10/16
Bài viết
136
Được thích
8
Mình có một đoạn code về gộp File. Giờ mình muốn sửa sao cho khi gộp file chỉ lấy tiêu đề ở file thứ nhất thôi, từ file thứ hai sẽ bỏ qua tiều đề. Mong mọi người giúp đỡ mình, xin cảm ơn mọi người.
Mã:
Sub MergeSheetInFolder()
   
    Dim objFs As Object
    Dim objFolder As Object
    Dim File As Object
    Dim Wb As Workbook
    Dim ws As Worksheet
    Dim OpenWb As Workbook
    Dim OpenWs As Worksheet
    Dim xDir As String
    Dim Folder As Object
    Dim xRows As Long
    Dim xColumns As Long
    Dim xColumnsFirst As Long
    Dim WorkRng As Range
    Dim xTitleId As String
    Dim LastRowWb As Long
    Dim LastRowOpenWb As Long
   
    On Error Resume Next
   
    Set Wb = ActiveWorkbook
    Set ws = Wb.ActiveSheet
   
    xTitleId = "Vung merge"
    Set WorkRng = Application.Selection
    Set WorkRng = Application.InputBox("Xin chon vung (1 sheet trong file nay) de paste data", xTitleId, WorkRng.Address, Type:=8)
   
    LastRowWb = ws.Cells.Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).Row
   
    If LastRowWb = 0 Then
        LastRowWb = 1
    Else
        LastRowWb = LastRowWb + 1
    End If
   
    With Application
        .ScreenUpdating = False
        .Calculation = xlCalculationManual
        .DisplayStatusBar = False
        .DisplayAlerts = False
        .EnableEvents = False
    End With
   
    Set Folder = Application.FileDialog(msoFileDialogFolderPicker)
   
    If Folder.Show <> -1 Then
        With Application
            .ScreenUpdating = True
            .Calculation = xlCalculationAutomatic
            .DisplayStatusBar = True
            .DisplayAlerts = True
            .EnableEvents = True
        End With
        Exit Sub
    End If
   
    xDir = Folder.SelectedItems(1)
   
    Set objFs = CreateObject("Scripting.FileSystemObject")
    Set objFolder = objFs.GetFolder(xDir)

    For Each File In objFolder.Files
       
        Set OpenWb = Workbooks.Open(File.path, True, True)
        Set OpenWs = OpenWb.ActiveSheet
       
        LastRowOpenWb = OpenWs.Cells.Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).Row
       
        OpenWs.Rows("1:" & LastRowOpenWb).Copy
        Wb.Activate
       
        With ActiveSheet.Range("a" & LastRowWb)
            .PasteSpecial xlPasteAll
            .PasteSpecial xlPasteFormats
        End With
       
        LastRowWb = LastRowWb + LastRowOpenWb
       
        OpenWb.Close False
        Set OpenWb = Nothing
    Next
       
    With Application
        .ScreenUpdating = True
        .Calculation = xlCalculationAutomatic
        .DisplayStatusBar = True
        .DisplayAlerts = True
        .EnableEvents = True
        .CutCopyMode = False
    End With

    MsgBox "Done!"
   
End Sub
 
Mình có một đoạn code về gộp File. Giờ mình muốn sửa sao cho khi gộp file chỉ lấy tiêu đề ở file thứ nhất thôi, từ file thứ hai sẽ bỏ qua tiều đề. Mong mọi người giúp đỡ mình, xin cảm ơn mọi người.
Mã:
Sub MergeSheetInFolder()
  
    Dim objFs As Object
    Dim objFolder As Object
    Dim File As Object
    Dim Wb As Workbook
    Dim ws As Worksheet
    Dim OpenWb As Workbook
    Dim OpenWs As Worksheet
    Dim xDir As String
    Dim Folder As Object
    Dim xRows As Long
    Dim xColumns As Long
    Dim xColumnsFirst As Long
    Dim WorkRng As Range
    Dim xTitleId As String
    Dim LastRowWb As Long
    Dim LastRowOpenWb As Long
  
    On Error Resume Next
  
    Set Wb = ActiveWorkbook
    Set ws = Wb.ActiveSheet
  
    xTitleId = "Vung merge"
    Set WorkRng = Application.Selection
    Set WorkRng = Application.InputBox("Xin chon vung (1 sheet trong file nay) de paste data", xTitleId, WorkRng.Address, Type:=8)
  
    LastRowWb = ws.Cells.Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).Row
  
    If LastRowWb = 0 Then
        LastRowWb = 1
    Else
        LastRowWb = LastRowWb + 1
    End If
  
    With Application
        .ScreenUpdating = False
        .Calculation = xlCalculationManual
        .DisplayStatusBar = False
        .DisplayAlerts = False
        .EnableEvents = False
    End With
  
    Set Folder = Application.FileDialog(msoFileDialogFolderPicker)
  
    If Folder.Show <> -1 Then
        With Application
            .ScreenUpdating = True
            .Calculation = xlCalculationAutomatic
            .DisplayStatusBar = True
            .DisplayAlerts = True
            .EnableEvents = True
        End With
        Exit Sub
    End If
  
    xDir = Folder.SelectedItems(1)
  
    Set objFs = CreateObject("Scripting.FileSystemObject")
    Set objFolder = objFs.GetFolder(xDir)

    For Each File In objFolder.Files
      
        Set OpenWb = Workbooks.Open(File.path, True, True)
        Set OpenWs = OpenWb.ActiveSheet
      
        LastRowOpenWb = OpenWs.Cells.Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).Row
      
        OpenWs.Rows("1:" & LastRowOpenWb).Copy
        Wb.Activate
      
        With ActiveSheet.Range("a" & LastRowWb)
            .PasteSpecial xlPasteAll
            .PasteSpecial xlPasteFormats
        End With
      
        LastRowWb = LastRowWb + LastRowOpenWb
      
        OpenWb.Close False
        Set OpenWb = Nothing
    Next
      
    With Application
        .ScreenUpdating = True
        .Calculation = xlCalculationAutomatic
        .DisplayStatusBar = True
        .DisplayAlerts = True
        .EnableEvents = True
        .CutCopyMode = False
    End With

    MsgBox "Done!"
  
End Sub
Mọi người hỗ trợ mình với...
 
Upvote 0
Nên gửi các files lên rồi diễn giải cụ thể chứ nhìn code suông thế này làm sao biết có phù hợp với file hay không.
Code sửa lại mình mong muốn giữ lại phần bôi vàng( tiêu đề ở file gộp thứ 1) và xóa bỏ chỗ bôi màu đỏ ( từ file gộp thứ hai trở đi)Before.PNGAfter.PNG
 

File đính kèm

  • Gộp File.xlsx
    20.7 KB · Đọc: 5
Upvote 0
Upvote 0
Sao code lại không để trong file vậy, bạn chạy thử chưa. File nào là file nguồn, file nào là file đích vậy.
mình chạy rồi bạn ơi. nó hiện ra ở sheet hiện tại
Bài đã được tự động gộp:

mình chạy rồi bạn ơi. nó hiện ra ở sheet hiện tại
mình chạy rồi bạn ơi. nó hiện ra ở sheet hiện tại
Đây là file nguồn ạ
 

File đính kèm

  • LOG.rar
    4.3 KB · Đọc: 7
Upvote 0
Mã:
Sub MergeSheetInFolder()
  
    Dim objFs As Object
    Dim objFolder As Object
    Dim File As Object
    Dim Wb As Workbook
    Dim ws As Worksheet
    Dim OpenWb As Workbook
    Dim OpenWs As Worksheet
    Dim xDir As String
    Dim Folder As Object
    Dim xRows As Long
    Dim xColumns As Long
    Dim xColumnsFirst As Long
    Dim WorkRng As Range
    Dim xTitleId As String
    Dim LastRowWb As Long
    Dim LastRowOpenWb As Long
'------------------------------   
    Dim i as Long
'------------------------------   
    On Error Resume Next
  
    Set Wb = ActiveWorkbook
    Set ws = Wb.ActiveSheet
  
    xTitleId = "Vung merge"
    Set WorkRng = Application.Selection
    Set WorkRng = Application.InputBox("Xin chon vung (1 sheet trong file nay) de paste data", xTitleId, WorkRng.Address, Type:=8)
  
    LastRowWb = ws.Cells.Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).Row
  
    If LastRowWb = 0 Then
        LastRowWb = 1
    Else
        LastRowWb = LastRowWb + 1
    End If
  
    With Application
        .ScreenUpdating = False
        .Calculation = xlCalculationManual
        .DisplayStatusBar = False
        .DisplayAlerts = False
        .EnableEvents = False
    End With
  
    Set Folder = Application.FileDialog(msoFileDialogFolderPicker)
  
    If Folder.Show <> -1 Then
        With Application
            .ScreenUpdating = True
            .Calculation = xlCalculationAutomatic
            .DisplayStatusBar = True
            .DisplayAlerts = True
            .EnableEvents = True
        End With
        Exit Sub
    End If
  
    xDir = Folder.SelectedItems(1)
'----------------------------------------
    i = 0
'----------------------------------------
    Set objFs = CreateObject("Scripting.FileSystemObject")
    Set objFolder = objFs.GetFolder(xDir)

    For Each File In objFolder.Files
'-----------------------------------
        i = i + 1
'-----------------------------------
        Set OpenWb = Workbooks.Open(File.path, True, True)
        Set OpenWs = OpenWb.ActiveSheet
      
        LastRowOpenWb = OpenWs.Cells.Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).Row

'-----------------------------------
        if i = 1 then
            OpenWs.Rows("1:" & LastRowOpenWb).Copy
        else
            OpenWs.Rows("2:" & LastRowOpenWb).Copy
        end if
'-----------------------------------       
        Wb.Activate

        With ActiveSheet.Range("a" & LastRowWb)
            .PasteSpecial xlPasteAll
            .PasteSpecial xlPasteFormats
        End With

        LastRowWb = LastRowWb + LastRowOpenWb

        OpenWb.Close False
        Set OpenWb = Nothing
        
    Next
      
    With Application
        .ScreenUpdating = True
        .Calculation = xlCalculationAutomatic
        .DisplayStatusBar = True
        .DisplayAlerts = True
        .EnableEvents = True
        .CutCopyMode = False
    End With

    MsgBox "Done!"
  
End Sub

Bạn thêm vào mấy chỗ '------------
 
Upvote 0
Xem file, code trong file.
Sửa đường dẫn thư mục ở ô A1 xong refresh
 

File đính kèm

  • CsvFromFolder_LOG.xlsx
    33.3 KB · Đọc: 12
Upvote 0
Sau phần khai báo các tham biến có ngay lệnh
On Error Resume Next
Là thấy chán rồi! & . . . . .hết muốn xem tiếp!
 
Upvote 0
Sau phần khai báo các tham biến có ngay lệnh
On Error Resume Next
Là thấy chán rồi! & . . . . .hết muốn xem tiếp!
Bỏ qua cái chỗ On Error...
Code này còn một chỗ rất xấu mà dân GPE thường gặp phải. Quý vị đoán xem đó là chỗ nào.
(có đến vài chỗ xấu, nhưng chỗ tôi nói đây hầu hết dân GPE đều bị)
 
Upvote 0
Mã:
Sub MergeSheetInFolder()
 
    Dim objFs As Object
    Dim objFolder As Object
    Dim File As Object
    Dim Wb As Workbook
    Dim ws As Worksheet
    Dim OpenWb As Workbook
    Dim OpenWs As Worksheet
    Dim xDir As String
    Dim Folder As Object
    Dim xRows As Long
    Dim xColumns As Long
    Dim xColumnsFirst As Long
    Dim WorkRng As Range
    Dim xTitleId As String
    Dim LastRowWb As Long
    Dim LastRowOpenWb As Long
'------------------------------  
    Dim i as Long
'------------------------------  
    On Error Resume Next
 
    Set Wb = ActiveWorkbook
    Set ws = Wb.ActiveSheet
 
    xTitleId = "Vung merge"
    Set WorkRng = Application.Selection
    Set WorkRng = Application.InputBox("Xin chon vung (1 sheet trong file nay) de paste data", xTitleId, WorkRng.Address, Type:=8)
 
    LastRowWb = ws.Cells.Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).Row
 
    If LastRowWb = 0 Then
        LastRowWb = 1
    Else
        LastRowWb = LastRowWb + 1
    End If
 
    With Application
        .ScreenUpdating = False
        .Calculation = xlCalculationManual
        .DisplayStatusBar = False
        .DisplayAlerts = False
        .EnableEvents = False
    End With
 
    Set Folder = Application.FileDialog(msoFileDialogFolderPicker)
 
    If Folder.Show <> -1 Then
        With Application
            .ScreenUpdating = True
            .Calculation = xlCalculationAutomatic
            .DisplayStatusBar = True
            .DisplayAlerts = True
            .EnableEvents = True
        End With
        Exit Sub
    End If
 
    xDir = Folder.SelectedItems(1)
'----------------------------------------
    i = 0
'----------------------------------------
    Set objFs = CreateObject("Scripting.FileSystemObject")
    Set objFolder = objFs.GetFolder(xDir)

    For Each File In objFolder.Files
'-----------------------------------
        i = i + 1
'-----------------------------------
        Set OpenWb = Workbooks.Open(File.path, True, True)
        Set OpenWs = OpenWb.ActiveSheet
     
        LastRowOpenWb = OpenWs.Cells.Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).Row

'-----------------------------------
        if i = 1 then
            OpenWs.Rows("1:" & LastRowOpenWb).Copy
        else
            OpenWs.Rows("2:" & LastRowOpenWb).Copy
        end if
'-----------------------------------      
        Wb.Activate

        With ActiveSheet.Range("a" & LastRowWb)
            .PasteSpecial xlPasteAll
            .PasteSpecial xlPasteFormats
        End With

        LastRowWb = LastRowWb + LastRowOpenWb

        OpenWb.Close False
        Set OpenWb = Nothing
       
    Next
     
    With Application
        .ScreenUpdating = True
        .Calculation = xlCalculationAutomatic
        .DisplayStatusBar = True
        .DisplayAlerts = True
        .EnableEvents = True
        .CutCopyMode = False
    End With

    MsgBox "Done!"
 
End Sub

Bạn thêm vào mấy chỗ '------------
Chạy bị lỗi bạn à, chạy đến file gộp cuối cùng nó lại copy 2 lần dữ liệu. Mà code này là của bạn mình lấy từ Add-in của bạn ra
 
Upvote 0
Chạy bị lỗi bạn à, chạy đến file gộp cuối cùng nó lại copy 2 lần dữ liệu. Mà code này là của bạn mình lấy từ Add-in của bạn ra
Mình chạy code thấy vẫn bình thường, không bị copy 2 lần như bạn nói. Tuy nhiên mình thấy có lỗi (1 trong các file cần ghép của bạn bị trống, thư mục có file không phải excel, file excel bị lỗi phiên bản cũ) nên có sửa lại chút.

Mã:
Sub MergeSheetInFolder()
 
    Dim objFs As Object
    Dim objFolder As Object
    Dim File As Object
    Dim Wb As Workbook
    Dim ws As Worksheet
    Dim OpenWb As Workbook
    Dim OpenWs As Worksheet
    Dim xDir As String
    Dim Folder As Object
    Dim xRows As Long
    Dim xColumns As Long
    Dim xColumnsFirst As Long
    Dim WorkRng As Range
    Dim xTitleId As String
    Dim LastRowWb As Long
    Dim LastRowOpenWb As Long
'------------------------------
    Dim i As Long
'------------------------------
    On Error Resume Next
 
    Set Wb = ActiveWorkbook
    Set ws = Wb.ActiveSheet
 
    xTitleId = "Vung merge"
    Set WorkRng = Application.Selection
    Set WorkRng = Application.InputBox("Xin chon vung (1 sheet trong file nay) de paste data", xTitleId, WorkRng.Address, Type:=8)
 
    LastRowWb = ws.Cells.Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).Row

    On Error GoTo Errorhandler

    If LastRowWb = 0 Then
        LastRowWb = 1
    Else
        LastRowWb = LastRowWb + 1
    End If
 
    With Application
        .ScreenUpdating = False
        .Calculation = xlCalculationManual
        .DisplayStatusBar = False
        .DisplayAlerts = False
        .EnableEvents = False
    End With
 
    Set Folder = Application.FileDialog(msoFileDialogFolderPicker)
 
    If Folder.Show <> -1 Then
        With Application
            .ScreenUpdating = True
            .Calculation = xlCalculationAutomatic
            .DisplayStatusBar = True
            .DisplayAlerts = True
            .EnableEvents = True
        End With
        Exit Sub
    End If
 
    xDir = Folder.SelectedItems(1)
'----------------------------------------
    i = 0
'----------------------------------------
    Set objFs = CreateObject("Scripting.FileSystemObject")
    Set objFolder = objFs.GetFolder(xDir)

    For Each File In objFolder.Files
        
        If InStr(1, objFs.GetExtensionName(File), "xls", vbTextCompare) > 0 Then
        
            i = i + 1
            
            Set OpenWb = Workbooks.Open(Filename:= _
            File.Path, _
            UpdateLinks:=0, IgnoreReadOnlyRecommended:=True, _
            CorruptLoad:=XlCorruptLoad.xlExtractData)
    
            Set OpenWs = OpenWb.ActiveSheet
            
            On Error Resume Next
    
            LastRowOpenWb = OpenWs.Cells.Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).Row
    
            If Err <> 0 Then
    
                LastRowOpenWb = 0
                OpenWb.Close False
                Set OpenWb = Nothing
    
            Else
    
                If i = 1 Then
                    OpenWs.Rows("1:" & LastRowOpenWb).Copy
                Else
                    OpenWs.Rows("2:" & LastRowOpenWb).Copy
                End If
    
                Wb.Activate
    
                With ActiveSheet.Range("A" & LastRowWb)
                    .PasteSpecial xlPasteAll
                    .PasteSpecial xlPasteFormats
                End With
    
                If i > 1 Then
                    LastRowWb = LastRowWb + LastRowOpenWb - 1
                Else
                    LastRowWb = LastRowWb + LastRowOpenWb
                End If
    
                OpenWb.Close False
                Set OpenWb = Nothing
    
            End If

            On Error GoTo 0
            
        End If
    Next
      
    With Application
        .ScreenUpdating = True
        .Calculation = xlCalculationAutomatic
        .DisplayStatusBar = True
        .DisplayAlerts = True
        .EnableEvents = True
        .CutCopyMode = False
    End With

    MsgBox "Done!"
 
    Exit Sub
    
Errorhandler:
    With Application
        .ScreenUpdating = True
        .Calculation = xlCalculationAutomatic
        .DisplayStatusBar = True
        .DisplayAlerts = True
        .EnableEvents = True
        .CutCopyMode = False
    End With
    
    MsgBox "Co loi xay ra, vui long kiem tra lai!"
    
    Exit Sub
 
End Sub
 
Upvote 0
Mình chạy code thấy vẫn bình thường, không bị copy 2 lần như bạn nói. Tuy nhiên mình thấy có lỗi (1 trong các file cần ghép của bạn bị trống, thư mục có file không phải excel, file excel bị lỗi phiên bản cũ) nên có sửa lại chút.

Mã:
Sub MergeSheetInFolder()
 
    Dim objFs As Object
    Dim objFolder As Object
    Dim File As Object
    Dim Wb As Workbook
    Dim ws As Worksheet
    Dim OpenWb As Workbook
    Dim OpenWs As Worksheet
    Dim xDir As String
    Dim Folder As Object
    Dim xRows As Long
    Dim xColumns As Long
    Dim xColumnsFirst As Long
    Dim WorkRng As Range
    Dim xTitleId As String
    Dim LastRowWb As Long
    Dim LastRowOpenWb As Long
'------------------------------
    Dim i As Long
'------------------------------
    On Error Resume Next
 
    Set Wb = ActiveWorkbook
    Set ws = Wb.ActiveSheet
 
    xTitleId = "Vung merge"
    Set WorkRng = Application.Selection
    Set WorkRng = Application.InputBox("Xin chon vung (1 sheet trong file nay) de paste data", xTitleId, WorkRng.Address, Type:=8)
 
    LastRowWb = ws.Cells.Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).Row

    On Error GoTo Errorhandler

    If LastRowWb = 0 Then
        LastRowWb = 1
    Else
        LastRowWb = LastRowWb + 1
    End If
 
    With Application
        .ScreenUpdating = False
        .Calculation = xlCalculationManual
        .DisplayStatusBar = False
        .DisplayAlerts = False
        .EnableEvents = False
    End With
 
    Set Folder = Application.FileDialog(msoFileDialogFolderPicker)
 
    If Folder.Show <> -1 Then
        With Application
            .ScreenUpdating = True
            .Calculation = xlCalculationAutomatic
            .DisplayStatusBar = True
            .DisplayAlerts = True
            .EnableEvents = True
        End With
        Exit Sub
    End If
 
    xDir = Folder.SelectedItems(1)
'----------------------------------------
    i = 0
'----------------------------------------
    Set objFs = CreateObject("Scripting.FileSystemObject")
    Set objFolder = objFs.GetFolder(xDir)

    For Each File In objFolder.Files
       
        If InStr(1, objFs.GetExtensionName(File), "xls", vbTextCompare) > 0 Then
       
            i = i + 1
           
            Set OpenWb = Workbooks.Open(Filename:= _
            File.Path, _
            UpdateLinks:=0, IgnoreReadOnlyRecommended:=True, _
            CorruptLoad:=XlCorruptLoad.xlExtractData)
   
            Set OpenWs = OpenWb.ActiveSheet
           
            On Error Resume Next
   
            LastRowOpenWb = OpenWs.Cells.Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).Row
   
            If Err <> 0 Then
   
                LastRowOpenWb = 0
                OpenWb.Close False
                Set OpenWb = Nothing
   
            Else
   
                If i = 1 Then
                    OpenWs.Rows("1:" & LastRowOpenWb).Copy
                Else
                    OpenWs.Rows("2:" & LastRowOpenWb).Copy
                End If
   
                Wb.Activate
   
                With ActiveSheet.Range("A" & LastRowWb)
                    .PasteSpecial xlPasteAll
                    .PasteSpecial xlPasteFormats
                End With
   
                If i > 1 Then
                    LastRowWb = LastRowWb + LastRowOpenWb - 1
                Else
                    LastRowWb = LastRowWb + LastRowOpenWb
                End If
   
                OpenWb.Close False
                Set OpenWb = Nothing
   
            End If

            On Error GoTo 0
           
        End If
    Next
     
    With Application
        .ScreenUpdating = True
        .Calculation = xlCalculationAutomatic
        .DisplayStatusBar = True
        .DisplayAlerts = True
        .EnableEvents = True
        .CutCopyMode = False
    End With

    MsgBox "Done!"
 
    Exit Sub
   
Errorhandler:
    With Application
        .ScreenUpdating = True
        .Calculation = xlCalculationAutomatic
        .DisplayStatusBar = True
        .DisplayAlerts = True
        .EnableEvents = True
        .CutCopyMode = False
    End With
   
    MsgBox "Co loi xay ra, vui long kiem tra lai!"
   
    Exit Sub
 
End Sub
Bạn ơi. Làm sao để giữ đc tiêu đề ở file đầu tiên từ file 2 trở đi xóa bỏ tiêu đề. Mình chạy thử bị mất tiêu đề
 
Upvote 0
Bỏ qua cái chỗ On Error...
Code này còn một chỗ rất xấu mà dân GPE thường gặp phải. Quý vị đoán xem đó là chỗ nào.
(có đến vài chỗ xấu, nhưng chỗ tôi nói đây hầu hết dân GPE đều bị)
Anh chỉ thêm để biết chừng em né.
Với trường hợp thì thì chắc dùng dùng ADO sẽ nhanh hơn chứ nhỉ ?. Bảng tổng hợp để sẵn tiêu đề.
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom