Cách gộp nhiều file excel, lọc và tính tổng dữ liệu (1 người xem)

  • Thread starter Thread starter Higabana
  • Ngày gửi Ngày gửi
Liên hệ QC

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

Higabana

Thành viên mới
Tham gia
21/6/17
Bài viết
16
Được thích
0
Giới tính
Nam
em mới mò mẫm về VBA nên còn rất rất nhiều điều chưa biết mong mọi người chỉ giáo!
Yêu cầu của sếp là lọc ra KH cho báo cáo tổng,tính tổng số KH của từng đại lý, KH nào là KH mua lẻ, KH nào là KH mua sỉ, tính tổng số KH của mỗi loại! mẫu kết quả báo cáo tổng là file Book1

mỗi KH sẽ có 1 mã KH cố định, mỗi ĐL có 1 mã ĐL cố định, một KH có thể phát sinh nhiều lần mua, nhưng chỉ tính là 1 - Advanced là lọc không trùng!

sẽ có khoảng 14 đại lý, e chỉ lấy mãu khoảng 9 đại lý!

nhờ mọi người giúp e nối 14 file lại, mỗi file khoảng 50k+ dòng , lọc và đếm tổng số KH của từng ĐL, tổng KH mua lẻ, tổng KH mua sỉ và kết quả sẽ nằm ở 1 file excel khác hay ít nhất là sẽ nằm ở 1 sheet khác!

em làm bằng Advanced thì rất lâu!

Rất mong được sự giúp đỡ của mọi người!!!
 

File đính kèm

Lần chỉnh sửa cuối:
dạ, em đã đọc lại nội quy!
Nếu đã đọc lại nội quy thì sửa tiêu đề đâu có cái vụ Nhờ trợ giúp, vì bài vi phạm nội quy thì sẽ không được các thành viên trả lời.

Tiêu đề vầy mới đúng: Cách gộp nhiều File trong Folder vào một File rồi tính tổng từng đại lý.
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu đã đọc lại nội quy thì sửa tiêu đề đâu có cái vụ Nhờ trợ giúp, vì bài vi phạm nội quy thì sẽ không được các thành viên trả lời.

Tiêu đề vầy mới đúng: Cách gộp nhiều File trong Folder vào một File rồi tính tổng từng đại lý.
em đọc rồi mà! tại em thấy "Tiêu đề cần được ghi rõ nghĩa, không được đặt những tiêu đề như: "Chỉ cho tôi với", "Help me", "Quan trọng đây!!!????", "Vào đây coi này", "Hay lắm", "Giúp mình với", "Admin ơi", v.v..." nên nghĩ là cái kia không nằm trong số này :p:p:p
 
Upvote 0
Chiều qua bận đến đêm. Lỗi hẹn.
Tôi gửi file. Chạy SUB saochep thì nó xóa từ hàng 2 của sheet2, rồi chép mọi nội dung của sheet1 các file có tên <> "Book1.xlsm"

Tôi cũng làm luôn Pivot ở bên cạnh dữ liệu. Chú ý mỗi khi chạy lại ct thì phải refresh Pivot (kích chuột phải vô bảng Pivot và nháy Refresh)
 

File đính kèm

Upvote 0
Chiều qua bận đến đêm. Lỗi hẹn.
Tôi gửi file. Chạy SUB saochep thì nó xóa từ hàng 2 của sheet2, rồi chép mọi nội dung của sheet1 các file có tên <> "Book1.xlsm"

Tôi cũng làm luôn Pivot ở bên cạnh dữ liệu. Chú ý mỗi khi chạy lại ct thì phải refresh Pivot (kích chuột phải vô bảng Pivot và nháy Refresh)
anh ơi, e chạy nó trắng màn hình thôi!

em có xem bài viết ở trên - em có để link - thì khá giống yêu cầu của bên em! có nghĩa là có thể từ 1 file excel bất kì, mình có thể chạy code nối các file excel khác có cùng cấu trúc và xuất ra 1 file excel tổng hợp tất cả dữ liệu trong đó!
bên em có 1 cái add-in làm được chuyện này nhưng em không có source để xem được code như thế nào! cái add-in này chạy khá ổn nhưng chỉ giới hạn ở 1 file excel 2003 (khoảng 65k dòng), nếu muốn thêm thì phải làm lại từ đầu qua 1 file khác! như em có dữ liệu 14 đại lý thì phải làm 3 lần để nối file, nối được 3 file, sau đó lưu lại file đầu tiên thành 2007 hay 2010 để lên được 1 triệu dòng, copy dữ liệu từ 2 file còn lại qua để xử lý!

em mong được giúp cái code tạo giống cái add-in đó mà file xuất ra được 2007 hay 2010 để số dòng đủ đế có thể nối được hết 1 lần 14 đại lý!

sau đó là xử lý yêu cầu về tính tổng KH như đã nêu ở trên!

ảnh đính kèm về cái add-in của bên em!Untitled.png Untitled.png Untitled.png
 

File đính kèm

  • Untitled1.png
    Untitled1.png
    236.5 KB · Đọc: 2
  • Untitled2.png
    Untitled2.png
    278.5 KB · Đọc: 2
Upvote 0
em ngồi lục lọi lại tài nguyên diễn đàn thì tìm được cái Add-in ghép file chạy tạm ổn! gần giống cái add-in của bên em...

bây giờ thì chỉ còn tính toán trên file tổng hợp, mình ko dùng pivot mà dùng code VBA thì như thế nào ah?

cảm ơn diễn đàn!
 
Upvote 0
em ngồi lục lọi lại tài nguyên diễn đàn thì tìm được cái Add-in ghép file chạy tạm ổn! gần giống cái add-in của bên em...

bây giờ thì chỉ còn tính toán trên file tổng hợp, mình ko dùng pivot mà dùng code VBA thì như thế nào ah?

cảm ơn diễn đàn!
Thì thử dùng File này.
Nhấn nút Gộp nhiều File vào 1 sheet, sau khi lấy dữ liệu xong thì nhấn nút Tổng hợp Đại lý để xem kết quả.

Lưu ý:
- Nếu có Insert thêm sheet mới thì di chuyển sheet đó sang phải sheet TH_DaiLy (nếu không di chuyển khi chạy code kết quả không chính xác).
- Thay đường dẫn nơi Folder chứa tất các File Excel cần lấy dữ liệu tại dòng này (chữ màu xanh):

Set TimFoder = GopFile.GetFolder("C:\Users\admin\Desktop\a")
 

File đính kèm

Upvote 0
Thì thử dùng File này.
Nhấn nút Gộp nhiều File vào 1 sheet, sau khi lấy dữ liệu xong thì nhấn nút Tổng hợp Đại lý để xem kết quả.

Lưu ý:
- Nếu có Insert thêm sheet mới thì di chuyển sheet đó sang phải sheet TH_DaiLy (nếu không di chuyển khi chạy code kết quả không chính xác).
- Thay đường dẫn nơi Folder chứa tất các File Excel cần lấy dữ liệu tại dòng này (chữ màu xanh):

Set TimFoder = GopFile.GetFolder("C:\Users\admin\Desktop\a")
cái chữ admin là phải sửa lại nhé anh
không phải máy nào cũng đặt là admin đâu nhé
 
Upvote 0
cái chữ admin là phải sửa lại nhé anh
không phải máy nào cũng đặt là admin đâu nhé
Thì bài 12 ở trên anh có nêu như vầy:
- Thay đường dẫn nơi Folder chứa tất các File Excel cần lấy dữ liệu tại dòng này (chữ màu xanh):

Set TimFoder = GopFile.GetFolder("C:\Users\admin\Desktop\a")
Vậy thì giải thích thêm cho rõ, nếu Folder chứa tất các File Excel cần lấy dữ liệu có tên là THEO DOI KHACH HANG nằm trong ổ D thì thay bằng dòng này:

Set TimFoder = GopFile.GetFolder("D:\THEO DOI KHACH HANG")
 
Upvote 0
Vấn đề này nếu tổ chức CSDL đúng thì chỉ cần 1 câu lệnh SQL mà thôi. Bạn nên học SQL để làm các bài toán liên quan đến CSDL. Các phần mềm quản lý hiện nay đều phải dùng SQL đó. Hãy tìm những giải pháp tổng thể và sáng để nâng cao tính ứng dụng.
 
Upvote 0
Vấn đề này nếu tổ chức CSDL đúng thì chỉ cần 1 câu lệnh SQL mà thôi. Bạn nên học SQL để làm các bài toán liên quan đến CSDL. Các phần mềm quản lý hiện nay đều phải dùng SQL đó. Hãy tìm những giải pháp tổng thể và sáng để nâng cao tính ứng dụng.

Học SQL không đủ đâu bác ơi. Muốn dễ làm việc thì phải hiểu căn bản CSDL Liên Hệ (tuy nhiên, chỉ cần biết tới chuẩn bậc 1 thôi, các bậc khác không cần). Muốn truy vấn rắc rối thì phải có căn bản toán đại số tập hợp.

Tuy nhiên, nếu biết tổ chức CSDL thì chỉ cần học PowerQuery và dùng Excel 2016 là được.
 
Upvote 0
Học SQL không đủ đâu bác ơi. Muốn dễ làm việc thì phải hiểu căn bản CSDL Liên Hệ (tuy nhiên, chỉ cần biết tới chuẩn bậc 1 thôi, các bậc khác không cần). Muốn truy vấn rắc rối thì phải có căn bản toán đại số tập hợp.

Tuy nhiên, nếu biết tổ chức CSDL thì chỉ cần học PowerQuery và dùng Excel 2016 là được.

Trong học SQL thì đã học và có kiến thức về tổ chức CSDL rồi. Không cần to tát và quá bài bản đâu, cách học nhanh với dân Excel - Không chuyên về IT thì vẫn OK. Mình đã giúp rất nhiều người làm theo cách này và thấy rất nhẹ nhàng không có khăn gì. CÓ công cụ thực thi SQL không cứ phải là Excel 2016.
 
Upvote 0
PowwerQuery được đưa vào 2016 với mục đích hổ trợ làm việc với nhiều nguồn dữ liệu.
Ngày xưa, máy tính lẫn Excel còn nhiều giới hạn cho nên VBA là công cụ hỗ trợ quan trọng.
Ngày nay thì nên làm quen với tài nguyên của Excel trước khi mò mẫm qua VBA.
 
Upvote 0
Thì thử dùng File này.
Nhấn nút Gộp nhiều File vào 1 sheet, sau khi lấy dữ liệu xong thì nhấn nút Tổng hợp Đại lý để xem kết quả.

Lưu ý:
- Nếu có Insert thêm sheet mới thì di chuyển sheet đó sang phải sheet TH_DaiLy (nếu không di chuyển khi chạy code kết quả không chính xác).
- Thay đường dẫn nơi Folder chứa tất các File Excel cần lấy dữ liệu tại dòng này (chữ màu xanh):

Set TimFoder = GopFile.GetFolder("C:\Users\admin\Desktop\a")

- dạ, code chạy ổn! có điều là mình ko thể chọn file theo ý như menu mà phải cho file vào cùng 1 forder và trỏ về địa chỉ forder đó!
- thêm nữa là giới hạn file xuất ra chỉ .xls nên sẽ bị giới hạn khi số lượng dòng của file tổng hợp bên em là trên 150k dòng!
- phần gộp file em đã có code add-in của 1 tiền bối post lên diễn đàn từ 2015, e show code phía dưới mong mọi người vào chỉ giáo thêm để e hiểu hết phần code!

PHP:
Option Explicit

Private Const HCBT_ACTIVATE = 5
Private Const WM_SETFONT = &H30
Private Const FONT_FACE = "Tahoma"
Public Const SWP_HiDEWiNDOW = &H80

Public Declare Function GetCurrentThreadId Lib "kernel32" Alias "GetCurrentThreadid" () As Long
Public Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hMod As Long, ByVal dwThreadId As Long) As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Declare Function CreateFont Lib "gdi32" Alias "CreateFontA" (ByVal h As Long, ByVal w As Long, ByVal E As Long, ByVal O As Long, ByVal w As Long, ByVal i As Long, ByVal U As Long, ByVal S As Long, ByVal c As Long, ByVal OP As Long, ByVal CP As Long, ByVal q As Long, ByVal PAF As Long, ByVal F As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal ParenthWnd As Long, ByVal ChildhWnd As Long, ByVal ClassName As String, ByVal Caption As String) As Long
Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function SetWindowTextW Lib "user32" (ByVal hwnd As Long, ByVal lpString As Long) As Long
Private Declare Function SetTimer& Lib "user32" (ByVal hwnd&, ByVal niDEvent&, ByVal uElapse&, ByVal lpTimerFunc&)
Private Declare Function KillTimer& Lib "user32" (ByVal hwnd&, ByVal niDEvent&)
Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameW" (pOpenfilename As OPENFiLENAME) As Long
Public m_DialogTitle As String
Public hDialogHook As Long

Public sFileName As String

Private Type OPENFiLENAME
    lStructSize         As Long
    hwndOwner           As Long
    hinstance           As Long
    lpstrFilter         As Long
    lpstrCustomFilter   As String
    nMaxCustFilter      As Long
    nFilterindex        As Long
    lpstrFile           As Long
    nMaxFile            As Long
    lpstrFileTitle      As Long
    nMaxFileTitle       As Long
    lpstrinitialDir     As Long
    lpstrTitle          As Long
    flags               As Long
    nFileOffset         As Integer
    nFileExtension      As Integer
    lpstrDefExt         As Long
    lCustData           As Long
    lpfnHook            As Long
    lpTemplateName      As String
End Type

Public Enum OpenSaveflags
    OFN_ALLOWMULTiSELECT = &H200
    OFN_CREATEPROMPT = &H2000
    OFN_ENABLESiZiNG = &H800000
    OFN_EXTENSiONDiFFERENT = &H400
    OFN_FiLEMUSTEXiST = &H1000
    OFN_HiDEREADONLY = &H4
    OFN_NOCHANGEDiR = &H8
    OFN_NODEREFERENCELiNKS = &H100000
    OFN_NONETWORKBUTTON = &H20000
    OFN_NOREADONLYRETURN = &H8000
    OFN_OVERWRiTEPROMPT = &H2
    OFN_PATHMUSTEXiST = &H800
    OFN_READONLY = &H1
    OFN_SHOWHELP = &H10
    OFN_ENABLEHOOK = &H20&
    OFN_EXPLORER = &H80000
End Enum
Private Const WH_CBT = 5

Public Function ShowOpen(Optional ByRef m_FileNameinit As String = "", Optional m_initDir As String = "", Optional ByRef m_Filter As String = "", Optional ByVal m_Filterindex As Long = 1, Optional ByVal m_def_DefaultExt As String = "", Optional ByVal m_MaxFileSize As Long = 10000, Optional ByVal hOwner As Long = 0, Optional ByVal m_Flags As OpenSaveflags = OFN_EXPLORER) As Boolean
    On Error GoTo Err
    Dim OFName As OPENFiLENAME, sTemp As String
    With OFName
        .lStructSize = Len(OFName)
        .flags = m_Flags
        .hwndOwner = hOwner
        .lpstrDefExt = StrPtr(m_def_DefaultExt)
        Dim file As String
        
        If m_MaxFileSize <= 0 Then m_MaxFileSize = 20000
        sTemp = String(m_MaxFileSize - Len(m_FileNameinit), vbNullChar)
        m_FileNameinit = m_FileNameinit & sTemp
        
        .lpstrFile = StrPtr(m_FileNameinit)
        
        If Len(m_Filter) <= 0 Then m_Filter = "All files|*.*"
        m_Filter = Replace(m_Filter, "|", vbNullChar) & vbNullChar & vbNullChar
        .lpstrFilter = StrPtr(m_Filter)
        
        m_initDir = m_initDir
        .lpstrinitialDir = StrPtr(m_initDir)
        
        If Len(m_DialogTitle) <= 0 Then m_DialogTitle = "Select a file(s)"
        .lpstrTitle = StrPtr(m_DialogTitle)
        
        .nFilterindex = m_Filterindex
        .nMaxFile = m_MaxFileSize
        .nMaxFileTitle = 260
        .lpstrDefExt = StrPtr(m_def_DefaultExt)
        
        If GetOpenFileName(OFName) Then
            While Right(m_FileNameinit, 1) = vbNullChar
                m_FileNameinit = Left(m_FileNameinit, Len(m_FileNameinit) - 1)
            Wend
            m_FileNameinit = Replace(m_FileNameinit, vbNullChar, "|")
            ShowOpen = True
        Else
            m_FileNameinit = ""
            ShowOpen = False
        End If
    End With
    Exit Function
Err:
    MsgBox Err.Description, , Err.Number
End Function

Sub GhepExcelFile(Control As IRibbonControl)
    Dim sFileName As String
    Dim ArrFile() As String
    Dim i As Integer
    Dim DirLog As String
    Dim MaxCol As Long
    Dim MaxRow As Long
    Dim bHeader As Boolean
    Dim OutputFile As String
    bHeader = False
    
    If ShowOpen(sFileName, , "Excel Files (*.xls;*.xlsx)|*.xls;*.xlsx", , , , , OFN_ALLOWMULTiSELECT Or OFN_EXPLORER) = True Then
        ArrFile = Split(sFileName, "|")
        DirLog = ArrFile(LBound(ArrFile)) & "\"
        If UBound(ArrFile) > 0 Then
            OutputFile = "Tong hop " & Format(Now(), "ddmmyyyy hhmmss") & ".xlsx"
            Workbooks.Add
            ChDir DirLog
            ActiveWorkbook.SaveAs Filename:=DirLog & OutputFile
            For i = LBound(ArrFile) + 1 To UBound(ArrFile)
                Workbooks.Open DirLog & ArrFile(i)
                MaxRow = ActiveSheet.UsedRange.Rows.Count
                MaxCol = ActiveSheet.UsedRange.Columns.Count
                If bHeader = False Then
                    Range(Cells(1, 1).Address & ":" & Cells(MaxRow, MaxCol).Address).Select
                    bHeader = True
                Else
                    Range(Cells(2, 1).Address & ":" & Cells(MaxRow, MaxCol).Address).Select
                End If
                Selection.Copy
                Windows(OutputFile).Activate
                MaxRow = ActiveSheet.UsedRange.Rows.Count
                If MaxRow = 1 Then
                    Range("A1").Select
                Else
                    Range("A" & (MaxRow + 1)).Select
                End If
                ActiveSheet.Paste
                Application.CutCopyMode = False
                Workbooks(ArrFile(i)).Close
            Next i
            Range("B2").Select
            ActiveWindow.FreezePanes = True
            ActiveWorkbook.Save
        End If
    End If
End Sub

bây giờ em nghiên cứu phần tính tổng của anh đã...:D:D:D
 
Upvote 0
Thì thử dùng File này.
Nhấn nút Gộp nhiều File vào 1 sheet, sau khi lấy dữ liệu xong thì nhấn nút Tổng hợp Đại lý để xem kết quả.

Lưu ý:
- Nếu có Insert thêm sheet mới thì di chuyển sheet đó sang phải sheet TH_DaiLy (nếu không di chuyển khi chạy code kết quả không chính xác).
- Thay đường dẫn nơi Folder chứa tất các File Excel cần lấy dữ liệu tại dòng này (chữ màu xanh):

Set TimFoder = GopFile.GetFolder("C:\Users\admin\Desktop\a")

- cho em hỏi, với code này mà em muốn chuyển file xuất ra thành .xlsm để tăng giới hạn dòng lên thì làm sao ah?

- phần này:

PHP:
Set GopFile = CreateObject("Scripting.FileSystemObject")
Rows("6:50000").Delete
Set TimFoder = GopFile.GetFolder("C:\Users\admin\Desktop\a")

em tăng lên 6:150000 thì nó báo lỗi, em nghĩ là do định dạng file ko tương thích, giúp em phần này để e có thể xuất được file tổng hợp như ý ah!

thanks mọi người!
 
Upvote 0
Web KT

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

Back
Top Bottom