Tổng hợp dữ liệu vào 1 file (1 người xem)

Liên hệ QC

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

tathangtb

Thành viên mới
Tham gia
22/1/17
Bài viết
9
Được thích
1
Mình lúc nào một ngày cũng sẽ có nhiều file dữ liệu (mỗi file khoảng 80-1500 dòng dữ liệu), download trực tiếp hàng ngày từ server với định dạng định sẵn dưới định dạng .xls (số cột và vị trí cột định sẵn theo mẫu đính kèm, không đổi như nhau).

Mình cần tổng hợp lại các file vào 1 file duy nhất trong đó cần lấy thông tin từ các file bao gồm: Số lượng sản phẩm mua của khách hàng ( Tổng số dòng trong mỗi file excel); Tên khách hàng (lấy sẵn trên tên file excel); tổng tiền (lấy sẵn trên tên file excel); Ngày mua (lấy sẵn trên tên file excel). Một ngày khách hàng có thể mua nhiều lần, nếu trùng tên khách hàng thì gộp chung một dòng và tính tổng tiền, số lượng sản phẩm

Mong mọi người giúp đỡ với
 

File đính kèm

Mình lúc nào một ngày cũng sẽ có nhiều file dữ liệu (mỗi file khoảng 80-1500 dòng dữ liệu), download trực tiếp hàng ngày từ server với định dạng định sẵn dưới định dạng .xls (số cột và vị trí cột định sẵn theo mẫu đính kèm, không đổi như nhau).

Mình cần tổng hợp lại các file vào 1 file duy nhất trong đó cần lấy thông tin từ các file bao gồm: Số lượng sản phẩm mua của khách hàng ( Tổng số dòng trong mỗi file excel); Tên khách hàng (lấy sẵn trên tên file excel); tổng tiền (lấy sẵn trên tên file excel); Ngày mua (lấy sẵn trên tên file excel). Một ngày khách hàng có thể mua nhiều lần, nếu trùng tên khách hàng thì gộp chung một dòng và tính tổng tiền, số lượng sản phẩm

Mong mọi người giúp đỡ với
Buồn buồn ngồi làm thử, nếu bạn dùng được thì dùng nhé.

upload_2018-3-29_13-2-36.png

Code trong form:

Mã:
 Public fPath As String

Private Sub CheckBox1_Click()
    Dim lItem As Long
    If CheckBox1.Value = True Then
        For lItem = 0 To Me.ListBox1.ListCount - 1
            ListBox1.Selected(lItem) = True
        Next
    Else
        For lItem = 0 To Me.ListBox1.ListCount - 1
            ListBox1.Selected(lItem) = False
        Next
    End If
End Sub

Sub SelectAll()
    Dim lItem As Long
    For lItem = 0 To Me.ListBox1.ListCount - 1
            ListBox1.Selected(lItem) = True
       
    Next

End Sub


Private Sub CommandButton1_Click()
    ListBox1.Clear
    fPath = BrowseForFolder & "\"
    Fill_List
End Sub

Sub Fill_List()
    Dim fileList() As String
    Dim fName As String
    Dim I As Integer
    fName = Dir(fPath)
    While fName <> ""
        I = I + 1
        ReDim Preserve fileList(1 To I)
        fileList(I) = fName
        fName = Dir()
    Wend
    If I = 0 Then
        MsgBox "No files found"
        Exit Sub
    End If
    For I = 1 To UBound(fileList)
        If fileList(I) Like "*.xl*" Then
           Me.ListBox1.AddItem fileList(I)
        End If
    Next
End Sub


Function BrowseForFolder(Optional OpenAt As Variant) As Variant
    'Function purpose:  To Browser for a user selected folder.
    'If the "OpenAt" path is provided, open the browser at that directory
    'NOTE:  If invalid, it will open at the Desktop level

    Dim ShellApp As Object
  
    'Create a file browser window at the default folder
    Set ShellApp = CreateObject("Shell.Application"). _
        BrowseForFolder(0, "Please choose a folder", 0, OpenAt)
  
    'Set the folder to that selected.  (On error in case cancelled)
    On Error Resume Next
        BrowseForFolder = ShellApp.self.Path
    On Error GoTo 0
  
    'Destroy the Shell Application
    Set ShellApp = Nothing
  
    'Check for invalid or non-entries and send to the Invalid error
    'handler if found
    'Valid selections can begin L: (where L is a letter) or
    '\\ (as in \\servername\sharename.  All others are invalid
    Select Case Mid(BrowseForFolder, 2, 1)
        Case Is = ":"
            If Left(BrowseForFolder, 1) = ":" Then GoTo Invalid
        Case Is = "\"
            If Not Left(BrowseForFolder, 1) = "\" Then GoTo Invalid
        Case Else
            GoTo Invalid
    End Select
  
    Exit Function

Invalid:
'If it was determined that the selection was invalid, set to False
    BrowseForFolder = False

End Function


Private Sub CommandButton2_Click()
    Dim lItem As Long
    Dim cn As Object
    Dim strSQL As String
    Set cn = CreateObject("ADODB.Connection")
    For lItem = 0 To Me.ListBox1.ListCount - 1
        If Me.ListBox1.Selected(lItem) Then
            strSQL = strSQL & IIf(Len(strSQL) = 0, "select ", " union all select") & " '" & Me.ListBox1.List(lItem) & "' as Ten,F2,F3,F6 from [EXCEL 12.0;HDR=No;Database=" & fPath & Me.ListBox1.List(lItem) & "].[Sheet1$A2:J] where F1 is not null"
            ListBox1.Selected(lItem) = False
        End If
    Next
    strSQL = "select F2,F3,count(F3),sum(F6) from (" & strSQL & ") group by F2,F3"
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=No"""
    Sheet1.Range("A2").CopyFromRecordset cn.Execute(strSQL)
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Em cảm ơn.
Xin lỗi anh Hai Lúa Miền Tây. Em đưa nhầm bài toán.
Ý của em là tổng hợp trong 1 tháng có bao nhiêu đơn vị mua; số lượng cán bộ trong đơn vị đó mua; tổng số tiền mua; mua ở phòng ban nào và ngày nào.
VD: em có 3 file excel:
SEL36098128032018001_MANH HA_3.002.000; SEL36098128032018001_MANH HA_4.320.000; SEL36098128032018001_MANH SON_3.002.000
Lúc này sẽ có 2 đơn vị mua hàng là MANH HA và MANH SON
MANH HA mua 2 lần là 3.002.000 và 4.320.000; có 4 cán bộ mua và mua ở phòng ban 36098 và 36033
MANH SON mua 1 lần là 3.002.000; có 4 cán bộ mua và mua ở phòng ban 36033
Những thông tin này đc tổng hợp vào 1 file excel khác. (như em gửi file đính kém).
Mong anh Hai Lúa Miền Tây giúp đỡ ạ.
Em cảm ơn.
 

File đính kèm

Upvote 0
Em cảm ơn.
Xin lỗi anh Hai Lúa Miền Tây. Em đưa nhầm bài toán.
Ý của em là tổng hợp trong 1 tháng có bao nhiêu đơn vị mua; số lượng cán bộ trong đơn vị đó mua; tổng số tiền mua; mua ở phòng ban nào và ngày nào.
VD: em có 3 file excel:
SEL36098128032018001_MANH HA_3.002.000; SEL36098128032018001_MANH HA_4.320.000; SEL36098128032018001_MANH SON_3.002.000
Lúc này sẽ có 2 đơn vị mua hàng là MANH HA và MANH SON
MANH HA mua 2 lần là 3.002.000 và 4.320.000; có 4 cán bộ mua và mua ở phòng ban 36098 và 36033
MANH SON mua 1 lần là 3.002.000; có 4 cán bộ mua và mua ở phòng ban 36033
Những thông tin này đc tổng hợp vào 1 file excel khác. (như em gửi file đính kém).
Mong anh Hai Lúa Miền Tây giúp đỡ ạ.
Em cảm ơn.
Trong file bạn chỗ nào quy định phòng ban cho mỗi cán bộ? Nếu dữ liệu của các file giống nhau không cần cộng lại, chỉ cộng dữ liệu trong 1 file?

upload_2018-3-30_10-53-3.png
 
Upvote 0
Trong file bạn chỗ nào quy định phòng ban cho mỗi cán bộ? Nếu dữ liệu của các file giống nhau không cần cộng lại, chỉ cộng dữ liệu trong 1 file?

View attachment 193142
36098 được lấy từ tên file em có chú thích trong ảnh
Trong cùng 1 ngày 1 đơn vị có thể mua nhiều lần, em không gộp để tiện kiểm tra mỗi lần đơn vị đó có bao nhiêu can bộ mua và tổng tiên lần mua đó là bao nhiêu. Sau đó em tự tổng hợp sâu ạ
 

File đính kèm

  • File can tong hop.JPG
    File can tong hop.JPG
    151.1 KB · Đọc: 5
Upvote 0
Có lẻ bạn dựa vào tên File excel để tổng hợp vào file tổng? Nội dung trong file thì lại khác kết quả mô tả của bạn?
Có 1 số thông tin có thể lấy trên tên file luôn đc anh ạ. Nếu lấy được trong file luôn thì tốt quá ạ.
Nội dung tên file được lấy dựa theo nội dung trong file anh ạ. Em vội nên nhầm
 
Upvote 0
36098 được lấy từ tên file em có chú thích trong ảnh
Trong cùng 1 ngày 1 đơn vị có thể mua nhiều lần, em không gộp để tiện kiểm tra mỗi lần đơn vị đó có bao nhiêu can bộ mua và tổng tiên lần mua đó là bao nhiêu. Sau đó em tự tổng hợp sâu ạ
Tôi thấy dữ liệu sau khi tôi chạy code ra nó khác với dữ liệu bạn yêu cầu, bạn kiểm tra lại xem coi như thế nào nhé.

upload_2018-3-27_21-18-14.png
 
Upvote 0

File đính kèm

Upvote 0
Của anh chuẩn rồi ạ. File ví dụ em nhập tay nhầm
Bạn chỉnh code của Private Sub CommandButton2_Click bài trên tôi gửi như sau:

Mã:
Private Sub CommandButton2_Click()
    Dim lItem As Long
    Dim cn As Object
    Dim strSQL As String
    Set cn = CreateObject("ADODB.Connection")
    For lItem = 0 To Me.ListBox1.ListCount - 1
        If Me.ListBox1.Selected(lItem) Then
            strSQL = strSQL & IIf(Len(strSQL) = 0, "select ", " union all select") & " F2, '" & Mid(Me.ListBox1.List(lItem), 4, 5) & "' as Ten,'" & Mid(Me.ListBox1.List(lItem), 22, InStr(22, Me.ListBox1.List(lItem), "_") - 22) & "' as DonVi,F6 from [EXCEL 12.0;HDR=No;Database=" & fPath & Me.ListBox1.List(lItem) & "].[Sheet1$A2:J] where F1 is not null and F5=0 "
            ListBox1.Selected(lItem) = False
        End If
    Next
    strSQL = "select F2,Ten, DonVi,count(Ten) as SoLuong,sum(F6) as Tong from (" & strSQL & ") group by Ten, F2,DonVi"
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=No"""
    Sheet1.Range("A3").CopyFromRecordset cn.Execute(strSQL)
End Sub
 
Upvote 0
Bạn chỉnh code của Private Sub CommandButton2_Click bài trên tôi gửi như sau:

Mã:
Private Sub CommandButton2_Click()
    Dim lItem As Long
    Dim cn As Object
    Dim strSQL As String
    Set cn = CreateObject("ADODB.Connection")
    For lItem = 0 To Me.ListBox1.ListCount - 1
        If Me.ListBox1.Selected(lItem) Then
            strSQL = strSQL & IIf(Len(strSQL) = 0, "select ", " union all select") & " F2, '" & Mid(Me.ListBox1.List(lItem), 4, 5) & "' as Ten,'" & Mid(Me.ListBox1.List(lItem), 22, InStr(22, Me.ListBox1.List(lItem), "_") - 22) & "' as DonVi,F6 from [EXCEL 12.0;HDR=No;Database=" & fPath & Me.ListBox1.List(lItem) & "].[Sheet1$A2:J] where F1 is not null and F5=0 "
            ListBox1.Selected(lItem) = False
        End If
    Next
    strSQL = "select F2,Ten, DonVi,count(Ten) as SoLuong,sum(F6) as Tong from (" & strSQL & ") group by Ten, F2,DonVi"
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=No"""
    Sheet1.Range("A3").CopyFromRecordset cn.Execute(strSQL)
End Sub

Lục lại bài cũ mong anh Hai Lúa Miền Tây thông cảm.
Nhờ anh mà công việc em đơn giản hơn hẳn.
Có điều trước giờ KH em dưới 40 file, mấy ngày nay tăng cường gần 100 file. Khi em tổng hợp file excel dưới 40 file vẫn chạy bình thường. Nhưng khi em tổng hợp hơn 40 file bắt đầu báo lỗi không chạy được.
Mong anh hỗ trợ em ạ.
Em cảm ơn!
 
Upvote 0
Lục lại bài cũ mong anh Hai Lúa Miền Tây thông cảm.
Nhờ anh mà công việc em đơn giản hơn hẳn.
Có điều trước giờ KH em dưới 40 file, mấy ngày nay tăng cường gần 100 file. Khi em tổng hợp file excel dưới 40 file vẫn chạy bình thường. Nhưng khi em tổng hợp hơn 40 file bắt đầu báo lỗi không chạy được.
Mong anh hỗ trợ em ạ.
Em cảm ơn!
Dùng Union sẽ có giới hạn như thế, trường hợp của bạn có thể chia nhỏ ra từng phần để làm nhé.
 
Upvote 0
Web KT

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

Back
Top Bottom