Tổng hợp dữ liệu cùng cấu trúc trên cùng một sheet ở nhiều file vào file Tổng hợp (1 người xem)

Người dùng đang xem chủ đề này

titanic20072007

Thành viên thường trực
Tham gia
10/7/07
Bài viết
217
Được thích
8
Nghề nghiệp
Giáo viên
Chào các bạn.
Mình có một tình huống cần các bạn giúp đỡ, cụ thể thế này: Mình có nhiều tệp dữ liệu A, B, C, D,... (số lượng không biết trước) có số sheet và cấu trúc dữ liệu giống nhau ở trong cùng một thư mục. Mình cần phải copy và dán dữ liệu từ sheet Data của các tệp A, B, C, D,... vào tệp Tổng hợp. Copy và paste thủ công lâu quá, mình nhờ các bạn viết hộ code giúp làm việc trên. Cảm ơn các bạn. (tệp dữ liệu mẫu mình gửi kèm ở dưới).
 

File đính kèm

bạn copy file vào chung với các file khác, bấm ngôi sao chạy code
 

File đính kèm

Upvote 0
Cảm ơn bạn HieuCD mình chạy thử và thấy code chạy rất nhanh nhưng khi copy chỉ có tệp cuối cùng là không bị mất dòng cuối. Bạn xem và chỉnh lại code hộ mình nhé.
 
Upvote 0
Chào các bạn.
Mình có một tình huống cần các bạn giúp đỡ, cụ thể thế này: Mình có nhiều tệp dữ liệu A, B, C, D,... (số lượng không biết trước) có số sheet và cấu trúc dữ liệu giống nhau ở trong cùng một thư mục. Mình cần phải copy và dán dữ liệu từ sheet Data của các tệp A, B, C, D,... vào tệp Tổng hợp. Copy và paste thủ công lâu quá, mình nhờ các bạn viết hộ code giúp làm việc trên. Cảm ơn các bạn. (tệp dữ liệu mẫu mình gửi kèm ở dưới).

góp vui
1- nhớ mở vba Alt F11==>Tools > References check vào 2 mục
"Microsoft Scripting Runtime"
"Microsoft ActiveX Data Objects 2.5 Library"
Mã:
Option Explicit

Sub ListFiles()

'Tools > References in the Visual Basic Editor (Alt+F11)
    'Set a reference to
    '"Microsoft Scripting Runtime"
    '"Microsoft ActiveX Data Objects 2.5 Library"
    
    'Declare the variables
    Dim objFSO As FileSystemObject
    Dim objFolder As Folder
    Dim objFile As File
    
    Dim rsCon As Object
    Dim rsData As Object
    Dim szConnect, SourceFile, SourceSheet, SourceRange As String
    Dim szSQL As String
    
    'clearcontent
    [A8:AC60000].ClearContents
    'Create an instance of the FileSystemObject
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    
    'Get the folder
    Set objFolder = objFSO.GetFolder(ThisWorkbook.Path)
    
    'Loop through each file in the folder
    For Each objFile In objFolder.Files
        If objFile <> ThisWorkbook.Path & "\" & ThisWorkbook.Name Then
        
        SourceFile = objFile
        SourceSheet = "Data"
        SourceRange = "A8:AC60000"
    
        szConnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                        "Data Source=" & SourceFile & ";" & _
                        "Extended Properties=""Excel 12.0;HDR=No"";"
        szSQL = "SELECT * FROM [" & SourceSheet & "$" & SourceRange$ & "]"
    
        Set rsCon = CreateObject("ADODB.Connection")
        Set rsData = CreateObject("ADODB.Recordset")
        rsCon.Open szConnect
        rsData.Open szSQL, rsCon, 0, 1, 1

        If Not rsData.EOF Then
                [a60000].End(3).Offset(1).CopyFromRecordset rsData
        End If

        rsData.Close
        Set rsData = Nothing
        rsCon.Close
        Set rsCon = Nothing
        End If
    Next objFile        
End Sub
 
Upvote 0
bạn copy file vào chung với các file khác, bấm ngôi sao chạy code
1/ Nếu trong Folder có file excel mà không có Sheets("Data") thì sẽ lỗi
Mã:
ir = WB.Sheets("Data").Range("B65000").End(xlUp).Row
2/ Nếu xóa dữ liệu ở dòng 8 và 9 đi rồi click vào "1 sao" thì file bung "banh xác".
 
Upvote 0
Chào các bạn.
Mình có một tình huống cần các bạn giúp đỡ, cụ thể thế này: Mình có nhiều tệp dữ liệu A, B, C, D,... (số lượng không biết trước) có số sheet và cấu trúc dữ liệu giống nhau ở trong cùng một thư mục. Mình cần phải copy và dán dữ liệu từ sheet Data của các tệp A, B, C, D,... vào tệp Tổng hợp. Copy và paste thủ công lâu quá, mình nhờ các bạn viết hộ code giúp làm việc trên. Cảm ơn các bạn. (tệp dữ liệu mẫu mình gửi kèm ở dưới).

Chào titanic20072007,

Bạn thử file đính kèm nhé.
Mở file lên, click vào nút "Tổng hợp" của bạn rồi chọn Folder chứa các file cần tổng hợp, click OK.
 

File đính kèm

Upvote 0
Dạo này dùng ADO không ta!!!, mà lỡ dùng CreateObject rồi còn đày đọ con người ta check thêm ADO nữa?-+*/

đang học nên còn háo hức.....cái gì mới cũng khoái.....hihihiih
===
nếu không stick nó báo lỗi user defined not ....gì đó anh ơi, học lóm nên cũng hong có rành lắm........hihihih
 
Upvote 0
đang học nên còn háo hức.....cái gì mới cũng khoái.....hihihiih
===
nếu không stick nó báo lỗi user defined not ....gì đó anh ơi, học lóm nên cũng hong có rành lắm........hihihih

để "anh" chỉ cho
muốn hết lỗi thì sửa mấy cái ni
Mã:
Dim objFSO As FileSystemObject
Dim objFolder As Folder
Dim objFile As File

thành
Mã:
Dim objFSO As Object
Dim objFolder As Object
Dim objFile As Object

sửa cho code hết báo lỗi thôi chứ còn chạy có đúng hay không là chuyện ... hên xui **~****~**
 
Upvote 0
Cảm ơn bạn HieuCD mình chạy thử và thấy code chạy rất nhanh nhưng khi copy chỉ có tệp cuối cùng là không bị mất dòng cuối. Bạn xem và chỉnh lại code hộ mình nhé.
Bạn dùng code mới, đã bẩy các lỗi
Mã:
Sub GhepFile()
Dim WB As Workbook, MainWB As Workbook, FSO As Object, FileItem As Object, Arr, Farr
Dim ir As Long, irF As Long, FistR As Long
Application.ScreenUpdating = False
irF = Range("A65000").End(xlUp).Row
If irF > Range("B65000").End(xlUp).Row + 4 Then
    Range("A" & irF - 6 & ":AD" & irF).Copy Range("A65100")
End If
Range("A9:AD65000").Clear
FistR = 7
Set MainWB = ThisWorkbook
On Error Resume Next
Set FSO = CreateObject("Scripting.FileSystemObject")
For Each FileItem In FSO.GetFolder(ThisWorkbook.Path).Files
    If FileItem.Name <> MainWB.Name And Left(FileItem.Name, 1) <> "~" _
        And FileItem.Name <> "x.xlsx" And FileItem.Name Like "*.xls*" Then
        Set WB = Workbooks.Open(FileItem.Path)
        Err.Clear
        ir = WB.Sheets("Data").Range("B65000").End(xlUp).Row
        If Err.Number > 0 Then
            WB.Close False:   GoTo thoat
        End If
        If Not IsError(ir) Then
            Arr = WB.Sheets("Data").Range("A8:Ad" & ir)
            WB.Close False
            If ir >= 8 Then
                Range("A" & FistR + 1).Resize(UBound(Arr), 30) = Arr
                FistR = FistR + UBound(Arr)
            End If
        End If
    End If
thoat:
Next FileItem
irF = Range("B65000").End(xlUp).Row
Range("A8:AD8").Copy
Range("A8:AD" & irF).PasteSpecial Paste:=xlPasteFormats
Application.CutCopyMode = False
Range("A65100:AD65106").Copy Range("A" & irF).Offset(2, 0)
Application.CutCopyMode = False
Range("A65100:AD65106").Clear
Set FileItem = Nothing
Set FSO = Nothing
Application.ScreenUpdating = True
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn các bạn và HieuCD đã nhiệt tình giúp đỡ. Mình đã chạy thử với dữ liệu thực tế thì code của HieuCD chạy khá chậm do phải mở từng tệp lên để copy. Mình nghe nói có cách nào đó lấy dữ liệu mà không cần mở tệp lên đúng không. các bạn hộ mình code như vậy được không? Cảm ơn các bạn.
 
Upvote 0
Cảm ơn các bạn và HieuCD đã nhiệt tình giúp đỡ. Mình đã chạy thử với dữ liệu thực tế thì code của HieuCD chạy khá chậm do phải mở từng tệp lên để copy. Mình nghe nói có cách nào đó lấy dữ liệu mà không cần mở tệp lên đúng không. các bạn hộ mình code như vậy được không? Cảm ơn các bạn.

bùn ghê lun đó bạn....huhuhhuhu
 
Upvote 0
Cảm ơn các bạn và HieuCD đã nhiệt tình giúp đỡ. Mình đã chạy thử với dữ liệu thực tế thì code của HieuCD chạy khá chậm do phải mở từng tệp lên để copy. Mình nghe nói có cách nào đó lấy dữ liệu mà không cần mở tệp lên đúng không. các bạn hộ mình code như vậy được không? Cảm ơn các bạn.
Là bài #4 đó bạn. ADO không thấy mở file nhưng vẫn có mở ngầm.
 
Upvote 0
Mình đã thử code của Let'GâuGâu nhưng lỗi ở dòng Dim objFSO As FileSystemObject
Bạn có thể xem lại được không.
 
Upvote 0
dùng hàm 4macro của sư tổ AN_DU
Mã:
Dim iR As Long
Function GetData(sFile As String, sSheet As String, sAddr As String)
  Dim pLink As String, iC As Long, Arr
  If Len(Dir(sFile)) Then
    Arr = Range(sAddr)
    pLink = "'" & Replace(sFile, Dir(sFile), "[" & Dir(sFile) & "]") & sSheet & "'!"
    For iR = 1 To Range(sAddr).Rows.Count
      For iC = 1 To Range(sAddr).Columns.Count
        Arr(iR, iC) = ExecuteExcel4Macro(pLink & Range(sAddr).Cells(iR, iC).Address(, , 2))
      Next iC
      If Arr(iR, 1) = 0 Then Exit For
    Next iR
    GetData = Arr
  End If
End Function

Sub ListFiles()
On Error GoTo thoat
    'Declare the variables
    Dim objFSO, objFolder, objFile As Object
    Dim myfile As String
    'clearcontent
    [A8:AC60000].ClearContents
    'Create an instance of the FileSystemObject
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    
    'Get the folder
    Set objFolder = objFSO.GetFolder(ThisWorkbook.Path)
    
    'Loop through each file in the folder
    For Each objFile In objFolder.Files
        If objFile <> ThisWorkbook.Path & "\" & ThisWorkbook.Name Then
            myfile = objFile
            [a60000].End(3).Offset(1).Resize(iR - 1, 30).Value = GetData(myfile, "Data", "A8:AC70")
        End If
    Next objFile
thoat:
End Sub
nhưng hình như chạy chậm hơn ADO
có mấy chục dòng, sao mà nó cứ quay mồng mồng riết
 
Upvote 0
Cảm ơn Let'GâuGâu đã giúp đỡ. Mình sẽ chạy thử với dữ liệu thực xem có nhanh hơn không. Bạn có thể chỉnh lại code ADO ở #4 được không mình đã chỉnh theo bài #9 cũng chạy được báo lỗi hoài.
 
Upvote 0
Cảm ơn Let'GâuGâu đã giúp đỡ. Mình sẽ chạy thử với dữ liệu thực xem có nhanh hơn không. Bạn có thể chỉnh lại code ADO ở #4 được không mình đã chỉnh theo bài #9 cũng chạy được báo lỗi hoài.

Theo bạn "Do" nói thì khái báo thành object thì khỏi phải cài là trong reference
tuy nhiên nếu vẫn bị lổi thì bạn thử làm cái này (trong bài #4 tôi cũng đã nói, không biết bạn có làm chưa)
===
nhớ mở vba Alt F11==>Tools > References check vào 2 mục
"Microsoft Scripting Runtime"
"Microsoft ActiveX Data Objects 2.5 Library"
===
Mã:
Option Explicit

Sub ListFiles()

'Tools > References in the Visual Basic Editor (Alt+F11)
    'Set a reference to
    '"Microsoft Scripting Runtime"
    '"Microsoft ActiveX Data Objects 2.5 Library"
    
    'Declare the variables
    Dim objFSO, objFolder, objFile As Object
    
    
    Dim rsCon As Object
    Dim rsData As Object
    Dim szConnect, SourceFile, SourceSheet, SourceRange As String
    Dim szSQL As String
    
    'clearcontent
    [A8:AC60000].ClearContents
    'Create an instance of the FileSystemObject
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    
    'Get the folder
    Set objFolder = objFSO.GetFolder(ThisWorkbook.Path)
    
    'Loop through each file in the folder
    For Each objFile In objFolder.Files
        If objFile <> ThisWorkbook.Path & "\" & ThisWorkbook.Name Then
        
        SourceFile = objFile
        SourceSheet = "Data"
        SourceRange = "A8:AC60000"
    
        szConnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                        "Data Source=" & SourceFile & ";" & _
                        "Extended Properties=""Excel 12.0;HDR=No"";"
        szSQL = "SELECT * FROM [" & SourceSheet & "$" & SourceRange$ & "]"
    
        Set rsCon = CreateObject("ADODB.Connection")
        Set rsData = CreateObject("ADODB.Recordset")
        rsCon.Open szConnect
        rsData.Open szSQL, rsCon, 0, 1, 1

        If Not rsData.EOF Then
                [a60000].End(3).Offset(1).CopyFromRecordset rsData
        End If

        rsData.Close
        Set rsData = Nothing
        rsCon.Close
        Set rsCon = Nothing
        End If
    Next objFile
End Sub
 
Upvote 0
Chào các bạn.
Mình có một tình huống cần các bạn giúp đỡ, cụ thể thế này: Mình có nhiều tệp dữ liệu A, B, C, D,... (số lượng không biết trước) có số sheet và cấu trúc dữ liệu giống nhau ở trong cùng một thư mục. Mình cần phải copy và dán dữ liệu từ sheet Data của các tệp A, B, C, D,... vào tệp Tổng hợp. Copy và paste thủ công lâu quá, mình nhờ các bạn viết hộ code giúp làm việc trên. Cảm ơn các bạn. (tệp dữ liệu mẫu mình gửi kèm ở dưới).

Thêm một cách sử dụng ADO kết hợp với Fso nữa cho Bạn tham khảo thêm ...lâu lắm ko ngó tới ADO sợ quên
Viết hơi dài dòng một chút nhưng Office 2003 hay 2010 chạy tốt ....

Mã:
Private Sub ListFileName(strPath As String, sArr())
    Dim ObjFile As Object, x As Long
    With CreateObject("Scripting.FileSystemObject")
       For Each ObjFile In .GetFolder(strPath).Files
          If .GetExtensionName(ObjFile) Like "xls*" Then
             If Left(ObjFile.Name, 2) <> "~$" Then
                If ObjFile.Name <> ThisWorkbook.Name Then
                   x = x + 1
                   ReDim Preserve sArr(1 To x)
                   sArr(x) = ObjFile
                End If
             End If
          End If
       Next
    End With
End Sub


Private Sub GetConnection(ListFiles(), ByVal SheetName$, ByVal DataRange$, ByVal Target As Range)
    Dim Cnn As Object, Rs As Object, Sql$, AppOld$, AppNew$, x As Long
    Dim Data$: Data = SheetName & "$" & DataRange
    For x = 1 To UBound(ListFiles)
        AppOld = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _
            & ListFiles(x) & ";Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";"
        AppNew = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
            & ListFiles(x) & ";Extended Properties=""Excel 12.0;HDR=No;IMEX=1"";"
        Set Cnn = CreateObject("ADODB.Connection")
        Set Rs = CreateObject("ADODB.Recordset")
        If Application.Version < 12 Then Cnn = AppOld Else Cnn = AppNew
        Cnn.Open
        Sql = "SELECT * From " & "[" & Data & "]"
        Rs.Open Sql, Cnn, 3, 1
        Target.End(3)(2).CopyFromRecordset Rs
        Rs.Close
    Next
    Set Cnn = Nothing: Set Rs = Nothing
End Sub


Public Sub Main()
    Dim Sht As String, Data As String, Path As String, MyFile()
    Path = ThisWorkbook.Path
    Sht = "Data"
    Data = ("A8:AD")
    ActiveSheet.UsedRange.ClearContents
    
    ListFileName Path, MyFile()
    GetConnection MyFile(), Sht, Data, [A65536]
End Sub
 
Upvote 0
Khi chạy báo lỗi ở dòng Cnn.Open sửa thế nào bạn?
 
Upvote 0
Khi chạy báo lỗi ở dòng Cnn.Open sửa thế nào bạn?

Chào bạn,
Mình nghĩ rất có thể là bạn chưa check vào 2 mục:
"Microsoft Scripting Runtime"
"Microsoft ActiveX Data Objects 2.5 Library"

Trong b
ài #20 bạn ấy đã hướng dẫ kỹ cho bạn rồi mà, nếu check 2 mục này thì có thể code sẽ không bị lỗi bạn ạ, còn code có thực hiện theo đúng mong muốn của bạn không thì mình không biết nữa, hihi.
Nếu bạn chưa biết cách check vào 2 mục trên thì bạn làm như sau nhé:

1.
1.jpg

2.
3.jpg

3.
2.jpg

Đây là file mình đã tích trong đó mình đã copy code của bài #20 và bài #21 vào file này rồi đó bạn ah.
Nếu bạn sử dụng file mình up lên thì bạn không cần phải tích thêm gì nữa, còn nếu bạn sử dụng file của bạn thì bạn tích các mục theo hình ảnh trên nhé.

Hic,rất xin lỗi các bạn thực sự là mình không biết 1 chút gì về lập trình cả , nếu có gì không phải mong các bạn chỉ dẫn ạ.. -+*/
Cảm ơn các bạn thật nhiều
 

File đính kèm

Upvote 0


Nếu bạn sử dụng file mình up lên thì bạn không cần phải tích thêm gì nữa, còn nếu bạn sử dụng file của bạn thì bạn tích các mục theo hình ảnh trên nhé.

Tôi nghĩ là nếu mình check vào các mục trong reference thì nó chỉ có tác dụng đối với máy đó thôi chứ???chứ nó đi theo file hả???
cái dzụ này mình không biết!!! (cũng mới tò mò với ADO thôi,....hihihi)
 
Upvote 0
Tôi nghĩ là nếu mình check vào các mục trong reference thì nó chỉ có tác dụng đối với máy đó thôi chứ???chứ nó đi theo file hả???
cái dzụ này mình không biết!!! (cũng mới tò mò với ADO thôi,....hihihi)
Cái đó sẽ theo File. Tuy nhiên, do lo lắng về vụ ở trên mỗi máy tính khác nhau (phiên bản office khác nhau) thì phiên bản thư viện đó khác nhau.
Không tin thì hủy check trong file ở máy tính của mình, sau đó tải file ở bài #23 về mở kiểm tra xem.
Vấn đề này cũng có nói ở đây: Tổng quan về Scripting.Dictionary
Cách 1 sẽ cho tốc độ nhanh hơn cách 2. Tuy nhiên, cách 2 lại thuận tiện hơn cách 1 khi chia sẻ file cho người sử dụng khác, do với máy tính khác nhau sẽ có nhiều người sử dụng các phiên bản khác nhau. Cách 1 chỉ phù hợp khi chính bạn sử dụng, còn cách 2 phù hợp hơn cho việc chia sẻ
 
Upvote 0
Chắc không phải do khai báo thư viện đầu. Mình đã khai báo như trên và thử cả 2 cách vẫn bị lỗi. Nhờ các bạ gỡ giúp.
Untitled3.jpg
Untitled1.png
Untitled2.jpg
Untitled.jpg
 
Upvote 0
Chắc không phải do khai báo thư viện đầu. Mình đã khai báo như trên và thử cả 2 cách vẫn bị lỗi. Nhờ các bạ gỡ giúp.
Do bạn sử dụng Excel 2003 còn code Let'GâuGâu sử dụng Excel 2007 trở lên sử dụng code Kieu Manh có dùng 2 phiên bản nếu không sửa đoạn szConnect = này lại thành

Mã:
szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _
            & SourceFile & ";Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";"
 
Upvote 0
Chào các ac e trên diễn đàn,

Mình cũng có nhu cầu tổng hợp số liệu các ngày trong tháng từ các file vào 1 file Tổng hợp, nhưng mình không muốn copy hết mà chỉ muốn copy số liệu ở dòng Tổng cộng dưới cùng ở các file vào File Tổng hợp.

mình cần nữa là ví dụ file chi tiết ngày 09/11/2016 thì khi copy số liệu dòng tổng cộng vào file Tổng hợp thì dữ liệu đó phải nhảy vào dòng ngày Thứ 4 trên file TỔng hợp, Tương tự nếu copy file chi tiết ngày 10/11 thì nhảy vào dòng ngày thứ 5.

File mình cần làm đính kèm email này, rất mon được các anh/ chị trên diễn đàn giúp đỡ ^^
 

File đính kèm

Upvote 0

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

Back
Top Bottom