Tổng hợ dữ liệu theo nhiều điều kiện từ nhiều file .CSV

Liên hệ QC

BuiQuangThuan

❆❆❆❆❆❆❆❆❆❆❆❆
Tham gia
17/12/10
Bài viết
2,475
Được thích
2,931
Giới tính
Nam
Em chào các thầy cô, anh chị diễn đàn.

Hiện tại em có gặp phải vấn đề khó khăn về tổng hợp dữ liệu từ nhiều file CSV từ nhiều foder theo điều kiện ạ.

Em có các forder theo máy/tháng/tuần/SMP0000.CSV
Em xin gửi đính kèm 1 file SMP0000.CVS đại điện như đính kèm Links tải
File tổng hợp:

Về cách làm thủ công hiện tại thì em sẽ phải mở từng file CSV lên và lọc theo các điều kiện như hình
B1: Lọc cột B theo mã hàng cần tìm bên file tổng hợp
B2: Lọc cột C để tìm số LOT
B3: Lọc cột F lấy các giá trị 1,2,3,4,5 tương đương với giá trị điện trở 1,2,3,4,5
B4: Nhặt các giá tương ứng từ cột L trả vào từ cột C:G file tổng hợp

1612789273878.png
Và kết quả mẫu 1 dòng như này ạ
1612791856630.png

Do em muốn tìm cùng nhiều mã sản phẩm 1 lúc.

Nếu tìm đủ 30 Số LOT thì sẽ tìm tiếp mã sản phẩm tiếp theo và trải dài xuống dưới sheet TH ạ

Em xin cám ơn thầy cô nhiều ạ
Links file CSV : SMP0000
Xin lỗi mọi người vì em đính kèm nhầm file. Em đã cập nhật lại
 

File đính kèm

  • TongHop.xlsb
    13.2 KB · Đọc: 7
Lần chỉnh sửa cuối:
OT cũng thử làm mò vì chưa hiểu ý của Bạn, Bạn chạy sub 'TongHopDienTro' nhé:
Mã:
Option Explicit

Dim dicOpenBook As New Scripting.Dictionary

Public Function TangTocCode(TanToc As Boolean)
    With Application
        .ScreenUpdating = Not (TanToc)
        .EnableEvents = Not (TanToc)
        .Calculation = IIf(TanToc, xlCalculationManual, xlCalculationAutomatic)
    End With
End Function

Public Function SheetExists(book As Workbook, sheetName As String) As Boolean
    Dim sht As Worksheet
    SheetExists = False
    For Each sht In book.Worksheets
        If sheetName = sht.Name Then
            SheetExists = True
            Exit Function
        End If
    Next
End Function

Public Function BookExists(bookName As String) As Boolean
    Dim book As Workbook
    BookExists = False
    For Each book In Workbooks
        If bookName = book.Name Then
            BookExists = True
            Exit Function
        End If
    Next
End Function

Public Function OpenSheet(book As Workbook, sheetName As String) As Worksheet
    Set OpenSheet = Nothing
    If SheetExists(book, sheetName) Then
        Set OpenSheet = book.Worksheets(sheetName)
    End If
End Function

Public Sub CloseBookIfOpenByMe(book As Workbook, Optional saveMe As Boolean = False)
    If dicOpenBook.Exists(book.Name) Then
        Exit Sub
    End If
    CloseBook book, saveMe
End Sub

Public Sub CloseBook(book As Workbook, Optional saveMe As Boolean = False)
    Application.DisplayAlerts = False
    If saveMe Then
        book.Save
    End If
    book.Close
    Set book = Nothing
    Application.DisplayAlerts = True
End Sub

Public Function OpenBook(bookPath As String, bookFile As String, Optional text As Boolean = False) As Workbook

    Set OpenBook = Nothing
    If BookExists(bookFile) Then
        Set OpenBook = Workbooks(bookFile)
        If Not dicOpenBook.Exists(bookFile) Then dicOpenBook.Add bookFile, True
        Exit Function
    End If
    If dicOpenBook.Exists(bookFile) Then dicOpenBook.Remove bookFile
   
On Error GoTo End_

    If text Then
        Call Workbooks.OpenText(bookPath & "\" & bookFile, Origin:=65001, Tab:=True, Comma:=False, Semicolon:=False)
        Set OpenBook = Workbooks(Workbooks.count)
    Else
        Set OpenBook = Workbooks.Open(bookPath & "\" & bookFile & ".xlsx")
    End If
   
    ThisWorkbook.Activate
   
End_:

End Function

Sub TongHopDienTro()
    
    Dim opBook As Workbook, opSht As Worksheet, book As Workbook, sht As Worksheet
    Dim r As Long, k As Long, c As Long, n As Long
    Dim Data() As Variant, Res() As Variant, sKey As Variant, DienTro As String
    Dim Cac_forder_theo_May_Thang_Tuan As String 'Em có các forder theo máy/tháng/tu?n/SMP0000.CSV
    
    On Error GoTo End_sub
    
    TangTocCode True
    
    Set book = ThisWorkbook
    Set sht = book.Worksheets("TH")
    
    Const sFile As String = "SMP0000.CSV"
    Cac_forder_theo_May_Thang_Tuan = ThisWorkbook.Path
    
    DienTro = "Gi" & ChrW(225) & " tr" & ChrW(7883) & " " & ChrW(273) & "i" & ChrW(7879) & "n tr" & ChrW(7903)
    
    Const ConSoMax As Integer = 6
    
    Set opBook = OpenBook(Cac_forder_theo_May_Thang_Tuan, sFile, True)
    If opBook Is Nothing Then
        MsgBox "CSV file is invalid!", vbCritical
        GoTo End_sub
    End If
    
    Set opSht = OpenSheet(opBook, "SMP0000")
    If opSht Is Nothing Then
        MsgBox "SMP0000 sheet is invalid!", vbCritical
        GoTo End_sub
    End If
    
    With opSht
        r = .Cells(.Rows.count, "A").End(xlUp).Row
        If r < 2 Then Exit Sub
        Data = .Range("A2").Resize(r - 1, 26)
    End With
    
    Call CloseBookIfOpenByMe(opBook, False)
    
    ReDim Res(1 To UBound(Data, 1), 1 To ConSoMax + 2)
    
    Dim Dic As New Scripting.Dictionary
    
    k = 2
    For r = 1 To UBound(Data, 1)
        If Data(r, 6) < ConSoMax Then
            sKey = Data(r, 6)
            If Not Dic.Exists(sKey) Then
                k = k + 1
                Dic.Add sKey, k
                Res(1, k) = DienTro & " " & sKey
            End If
        End If
    Next r
    
    k = 1
    For r = 1 To UBound(Data, 1)
        sKey = Data(r, 2) & "|" & Data(r, 3)
        c = Dic.Item(Data(r, 6))
        If c Then
            If Not Dic.Exists(sKey) Then
                k = k + 1
                Dic.Add sKey, k
                Res(k, 1) = Data(r, 2)
                Res(k, 2) = Data(r, 3)
                Res(k, c) = Data(r, 12)
            Else
                n = Dic.Item(sKey)
                If Data(r, 12) > Res(n, c) Then
                    Res(n, c) = Data(r, 12)
                End If
            End If
        End If
    Next r
    
    sht.Cells.ClearContents
    
    sht.Range("A1").Resize(UBound(Data, 1), ConSoMax + 2).Value = Res
    
    TangTocCode False
    
    MsgBox "Done!", vbInformation
    GoTo Exit_Sub
    
End_sub:

    TangTocCode False
    
    If Err <> 0 Then
        MsgBox "Error: " & Err.Description, vbCritical
    End If

Exit_Sub:

End Sub
 

File đính kèm

  • TH.xlsb
    27.9 KB · Đọc: 5
Lần chỉnh sửa cuối:
Upvote 0
OT cũng thử làm mò vì chưa hiểu ý của Bạn, Bạn chạy sub 'TongHopDienTro' nhé:
Cám ơn OT nhiều vì đã quan tâm chủ đề này. Xin phép cho mình hỏi thêm 1 chút vài thông tin khác được không ạ?
1. Khi mình để chung với nhiều file csv khác nó có tổng hợp nhiều file lại với nhau không ạ
2. Mình thấy sub tổng hợp của bạn đáp ứng được yêu cầu ban đầu rồi. Xin lỗi vì mình trình bày thiếu lúc ban đầu
Các giá trị điện trở sẽ lấy theo điều kiện ở cột M là "OK" thì sửa code như thế nào ạ?
1612841690898.png
Phiền OT chỉ giúp ạ.
Xin cám ơn nhiều
 
Upvote 0
Cám ơn OT nhiều vì đã quan tâm chủ đề này. Xin phép cho mình hỏi thêm 1 chút vài thông tin khác được không ạ?
1. Khi mình để chung với nhiều file csv khác nó có tổng hợp nhiều file lại với nhau không ạ
2. Mình thấy sub tổng hợp của bạn đáp ứng được yêu cầu ban đầu rồi. Xin lỗi vì mình trình bày thiếu lúc ban đầu
Các giá trị điện trở sẽ lấy theo điều kiện ở cột M là "OK" thì sửa code như thế nào ạ?
View attachment 254089
Phiền OT chỉ giúp ạ.
Xin cám ơn nhiều
Mục 1 , OT nghĩ là được. Bạn thử đính kèm thêm ví dụ 1 vài tập tin khác lên xem.. OT không làm được thì có rất rất nhiều Bạn khác làm được ạ.
Mục 2 , Bạn thử thay lại sub 'TongHopDienTro' bắng sub bên dưới xem:

Mã:
Sub TongHopDienTro()
    
    Dim opBook As Workbook, opSht As Worksheet, book As Workbook, sht As Worksheet
    Dim r As Long, k As Long, c As Long, n As Long, sCSV As String
    Dim Data() As Variant, Res() As Variant, sKey As Variant, DienTro As String
    Dim Cac_forder_theo_May_Thang_Tuan As String 'Em có các forder theo máy/tháng/tu?n/SMP0000.CSV
    
    On Error GoTo End_sub
    
    TangTocCode True
    
    Set book = ThisWorkbook
    Set sht = book.Worksheets("TH")
    
    Const sFile As String = "SMP0000.CSV"
    Cac_forder_theo_May_Thang_Tuan = ThisWorkbook.Path
    
    DienTro = "Gi" & ChrW(225) & " tr" & ChrW(7883) & " " & ChrW(273) & "i" & ChrW(7879) & "n tr" & ChrW(7903)
    
    Const ConSoMax As Integer = 6
    Const sCol As Integer = 4
    
    Set opBook = OpenBook(Cac_forder_theo_May_Thang_Tuan, sFile, True)
    If opBook Is Nothing Then
        MsgBox "CSV file is invalid!", vbCritical
        GoTo End_sub
    End If
    
    Set opSht = OpenSheet(opBook, "SMP0000")
    If opSht Is Nothing Then
        MsgBox "SMP0000 sheet is invalid!", vbCritical
        GoTo End_sub
    End If
    sCSV = opBook.FullName
    With opSht
        r = .Cells(.Rows.count, "A").End(xlUp).Row
        If r < 2 Then Exit Sub
        Data = .Range("A2").Resize(r - 1, 26)
    End With
    
    Call CloseBookIfOpenByMe(opBook, False)
    
    ReDim Res(1 To UBound(Data, 1), 1 To ConSoMax + sCol)
    
    Dim Dic As New Scripting.Dictionary
    
    k = sCol
    For r = 1 To UBound(Data, 1)
        If Data(r, 6) < ConSoMax Then
            sKey = Data(r, 6)
            If Not Dic.Exists(sKey) Then
                k = k + 1
                Dic.Add sKey, k
                Res(1, k) = DienTro & " " & sKey
            End If
        End If
    Next r
    Res(1, 1) = "Du lieu lay tu duong dan/tap tin"
    Res(1, 2) = "Stt"
    Res(1, 3) = "Ma Sp"
    Res(1, 4) = "So Lot"
    k = 1
    For r = 1 To UBound(Data, 1)
        sKey = Data(r, 2) & "|" & Data(r, 3)
        c = Dic.Item(Data(r, 6))
        If Data(r, 13) = "OK" Then
            If c Then
                If Not Dic.Exists(sKey) Then
                    k = k + 1
                    Dic.Add sKey, k
                    Res(k, 1) = sCSV
                    Res(k, 2) = k - 1
                    Res(k, 3) = Data(r, 2)
                    Res(k, 4) = Data(r, 3)
                    Res(k, c) = Data(r, 12)
                Else
                    n = Dic.Item(sKey)
                    Res(n, c) = Data(r, 12)
                End If
            End If
        End If
    Next r
    
    sht.Cells.ClearContents
    sht.Range("A1").Resize(UBound(Data, 1), ConSoMax + sCol).Value = Res
    
    TangTocCode False
    
    MsgBox "Done!", vbInformation
    
    GoTo Exit_Sub
    
End_sub:

    TangTocCode False
    
    If Err <> 0 Then
        MsgBox "Error: " & Err.Description, vbCritical
    End If

Exit_Sub:

End Sub
 
Upvote 0
1.
Dim Data() As Variant, Res() As Variant, sKey As Variant
Đổi lại thành

Dim Data As Variant, Res As Variant, sKey As String

tốc độ tăng lên vài phần / 10

2. Khi số lượng key nhiều, công việc add key vào Dictionary tốn rất nhiều thời gian).

3.
Dim Cac_forder_theo_May_Thang_Tuan As String
Khai báo là String thì được Một thôi, chứ "Các" sao được?
 
Upvote 0
OT cũng thử làm mò vì chưa hiểu ý của Bạn, Bạn chạy sub 'TongHopDienTro' nhé:
Mã:
Option Explicit

Dim dicOpenBook As New Scripting.Dictionary

Public Function TangTocCode(TanToc As Boolean)
    With Application
        .ScreenUpdating = Not (TanToc)
        .EnableEvents = Not (TanToc)
        .Calculation = IIf(TanToc, xlCalculationManual, xlCalculationAutomatic)
    End With
End Function

Public Function SheetExists(book As Workbook, sheetName As String) As Boolean
    Dim sht As Worksheet
    SheetExists = False
    For Each sht In book.Worksheets
        If sheetName = sht.Name Then
            SheetExists = True
            Exit Function
        End If
    Next
End Function

Public Function BookExists(bookName As String) As Boolean
    Dim book As Workbook
    BookExists = False
    For Each book In Workbooks
        If bookName = book.Name Then
            BookExists = True
            Exit Function
        End If
    Next
End Function

Public Function OpenSheet(book As Workbook, sheetName As String) As Worksheet
    Set OpenSheet = Nothing
    If SheetExists(book, sheetName) Then
        Set OpenSheet = book.Worksheets(sheetName)
    End If
End Function

Public Sub CloseBookIfOpenByMe(book As Workbook, Optional saveMe As Boolean = False)
    If dicOpenBook.Exists(book.Name) Then
        Exit Sub
    End If
    CloseBook book, saveMe
End Sub

Public Sub CloseBook(book As Workbook, Optional saveMe As Boolean = False)
    Application.DisplayAlerts = False
    If saveMe Then
        book.Save
    End If
    book.Close
    Set book = Nothing
    Application.DisplayAlerts = True
End Sub

Public Function OpenBook(bookPath As String, bookFile As String, Optional text As Boolean = False) As Workbook

    Set OpenBook = Nothing
    If BookExists(bookFile) Then
        Set OpenBook = Workbooks(bookFile)
        If Not dicOpenBook.Exists(bookFile) Then dicOpenBook.Add bookFile, True
        Exit Function
    End If
    If dicOpenBook.Exists(bookFile) Then dicOpenBook.Remove bookFile
  
On Error GoTo End_

    If text Then
        Call Workbooks.OpenText(bookPath & "\" & bookFile, Origin:=65001, Tab:=True, Comma:=False, Semicolon:=False)
        Set OpenBook = Workbooks(Workbooks.count)
    Else
        Set OpenBook = Workbooks.Open(bookPath & "\" & bookFile & ".xlsx")
    End If
  
    ThisWorkbook.Activate
  
End_:

End Function

Sub TongHopDienTro()
   
    Dim opBook As Workbook, opSht As Worksheet, book As Workbook, sht As Worksheet
    Dim r As Long, k As Long, c As Long, n As Long
    Dim Data() As Variant, Res() As Variant, sKey As Variant, DienTro As String
    Dim Cac_forder_theo_May_Thang_Tuan As String 'Em có các forder theo máy/tháng/tu?n/SMP0000.CSV
   
    On Error GoTo End_sub
   
    TangTocCode True
   
    Set book = ThisWorkbook
    Set sht = book.Worksheets("TH")
   
    Const sFile As String = "SMP0000.CSV"
    Cac_forder_theo_May_Thang_Tuan = ThisWorkbook.Path
   
    DienTro = "Gi" & ChrW(225) & " tr" & ChrW(7883) & " " & ChrW(273) & "i" & ChrW(7879) & "n tr" & ChrW(7903)
   
    Const ConSoMax As Integer = 6
   
    Set opBook = OpenBook(Cac_forder_theo_May_Thang_Tuan, sFile, True)
    If opBook Is Nothing Then
        MsgBox "CSV file is invalid!", vbCritical
        GoTo End_sub
    End If
   
    Set opSht = OpenSheet(opBook, "SMP0000")
    If opSht Is Nothing Then
        MsgBox "SMP0000 sheet is invalid!", vbCritical
        GoTo End_sub
    End If
   
    With opSht
        r = .Cells(.Rows.count, "A").End(xlUp).Row
        If r < 2 Then Exit Sub
        Data = .Range("A2").Resize(r - 1, 26)
    End With
   
    Call CloseBookIfOpenByMe(opBook, False)
   
    ReDim Res(1 To UBound(Data, 1), 1 To ConSoMax + 2)
   
    Dim Dic As New Scripting.Dictionary
   
    k = 2
    For r = 1 To UBound(Data, 1)
        If Data(r, 6) < ConSoMax Then
            sKey = Data(r, 6)
            If Not Dic.Exists(sKey) Then
                k = k + 1
                Dic.Add sKey, k
                Res(1, k) = DienTro & " " & sKey
            End If
        End If
    Next r
   
    k = 1
    For r = 1 To UBound(Data, 1)
        sKey = Data(r, 2) & "|" & Data(r, 3)
        c = Dic.Item(Data(r, 6))
        If c Then
            If Not Dic.Exists(sKey) Then
                k = k + 1
                Dic.Add sKey, k
                Res(k, 1) = Data(r, 2)
                Res(k, 2) = Data(r, 3)
                Res(k, c) = Data(r, 12)
            Else
                n = Dic.Item(sKey)
                If Data(r, 12) > Res(n, c) Then
                    Res(n, c) = Data(r, 12)
                End If
            End If
        End If
    Next r
   
    sht.Cells.ClearContents
   
    sht.Range("A1").Resize(UBound(Data, 1), ConSoMax + 2).Value = Res
   
    TangTocCode False
   
    MsgBox "Done!", vbInformation
    GoTo Exit_Sub
   
End_sub:

    TangTocCode False
   
    If Err <> 0 Then
        MsgBox "Error: " & Err.Description, vbCritical
    End If

Exit_Sub:

End Sub
Dùng ADO tốc độ sẽ nhanh hơn
 
Upvote 0
1.

Đổi lại thành

Dim Data As Variant, Res As Variant, sKey As String

tốc độ tăng lên vài phần / 10

2. Khi số lượng key nhiều, công việc add key vào Dictionary tốn rất nhiều thời gian).

3.

Khai báo là String thì được Một thôi, chứ "Các" sao được?
Cảm ơn @befaint đã chỉ dẫn, đúng là không thể các được ạ :"'
Dùng ADO tốc độ sẽ nhanh hơn
Dạ Bác, cái này con cũng có nghĩ đến nhưng với câu lệnh truy vấn con quen thử trong môi trường SQL thôi (khi có dữ liệu) còn trong Excel con chưa viết vì lỗi xảy ra là con mù tịt không biết lỗi ở đâu để sửa ạ. Nếu Bác có thời gian & hứng thú thì xin mời Bác cho con thêm một cách để tham khảo ạ.
 
Upvote 0
OT cũng thử làm mò vì chưa hiểu ý của Bạn, Bạn chạy sub 'TongHopDienTro' nhé:
Mã:
Option Explicit

Dim dicOpenBook As New Scripting.Dictionary

Public Function TangTocCode(TanToc As Boolean)
    With Application
        .ScreenUpdating = Not (TanToc)
        .EnableEvents = Not (TanToc)
        .Calculation = IIf(TanToc, xlCalculationManual, xlCalculationAutomatic)
    End With
End Function

Public Function SheetExists(book As Workbook, sheetName As String) As Boolean
    Dim sht As Worksheet
    SheetExists = False
    For Each sht In book.Worksheets
        If sheetName = sht.Name Then
            SheetExists = True
            Exit Function
        End If
    Next
End Function

Public Function BookExists(bookName As String) As Boolean
    Dim book As Workbook
    BookExists = False
    For Each book In Workbooks
        If bookName = book.Name Then
            BookExists = True
            Exit Function
        End If
    Next
End Function

Public Function OpenSheet(book As Workbook, sheetName As String) As Worksheet
    Set OpenSheet = Nothing
    If SheetExists(book, sheetName) Then
        Set OpenSheet = book.Worksheets(sheetName)
    End If
End Function

Public Sub CloseBookIfOpenByMe(book As Workbook, Optional saveMe As Boolean = False)
    If dicOpenBook.Exists(book.Name) Then
        Exit Sub
    End If
    CloseBook book, saveMe
End Sub

Public Sub CloseBook(book As Workbook, Optional saveMe As Boolean = False)
    Application.DisplayAlerts = False
    If saveMe Then
        book.Save
    End If
    book.Close
    Set book = Nothing
    Application.DisplayAlerts = True
End Sub

Public Function OpenBook(bookPath As String, bookFile As String, Optional text As Boolean = False) As Workbook

    Set OpenBook = Nothing
    If BookExists(bookFile) Then
        Set OpenBook = Workbooks(bookFile)
        If Not dicOpenBook.Exists(bookFile) Then dicOpenBook.Add bookFile, True
        Exit Function
    End If
    If dicOpenBook.Exists(bookFile) Then dicOpenBook.Remove bookFile
  
On Error GoTo End_

    If text Then
        Call Workbooks.OpenText(bookPath & "\" & bookFile, Origin:=65001, Tab:=True, Comma:=False, Semicolon:=False)
        Set OpenBook = Workbooks(Workbooks.count)
    Else
        Set OpenBook = Workbooks.Open(bookPath & "\" & bookFile & ".xlsx")
    End If
  
    ThisWorkbook.Activate
  
End_:

End Function

Sub TongHopDienTro()
   
    Dim opBook As Workbook, opSht As Worksheet, book As Workbook, sht As Worksheet
    Dim r As Long, k As Long, c As Long, n As Long
    Dim Data() As Variant, Res() As Variant, sKey As Variant, DienTro As String
    Dim Cac_forder_theo_May_Thang_Tuan As String 'Em có các forder theo máy/tháng/tu?n/SMP0000.CSV
   
    On Error GoTo End_sub
   
    TangTocCode True
   
    Set book = ThisWorkbook
    Set sht = book.Worksheets("TH")
   
    Const sFile As String = "SMP0000.CSV"
    Cac_forder_theo_May_Thang_Tuan = ThisWorkbook.Path
   
    DienTro = "Gi" & ChrW(225) & " tr" & ChrW(7883) & " " & ChrW(273) & "i" & ChrW(7879) & "n tr" & ChrW(7903)
   
    Const ConSoMax As Integer = 6
   
    Set opBook = OpenBook(Cac_forder_theo_May_Thang_Tuan, sFile, True)
    If opBook Is Nothing Then
        MsgBox "CSV file is invalid!", vbCritical
        GoTo End_sub
    End If
   
    Set opSht = OpenSheet(opBook, "SMP0000")
    If opSht Is Nothing Then
        MsgBox "SMP0000 sheet is invalid!", vbCritical
        GoTo End_sub
    End If
   
    With opSht
        r = .Cells(.Rows.count, "A").End(xlUp).Row
        If r < 2 Then Exit Sub
        Data = .Range("A2").Resize(r - 1, 26)
    End With
   
    Call CloseBookIfOpenByMe(opBook, False)
   
    ReDim Res(1 To UBound(Data, 1), 1 To ConSoMax + 2)
   
    Dim Dic As New Scripting.Dictionary
   
    k = 2
    For r = 1 To UBound(Data, 1)
        If Data(r, 6) < ConSoMax Then
            sKey = Data(r, 6)
            If Not Dic.Exists(sKey) Then
                k = k + 1
                Dic.Add sKey, k
                Res(1, k) = DienTro & " " & sKey
            End If
        End If
    Next r
   
    k = 1
    For r = 1 To UBound(Data, 1)
        sKey = Data(r, 2) & "|" & Data(r, 3)
        c = Dic.Item(Data(r, 6))
        If c Then
            If Not Dic.Exists(sKey) Then
                k = k + 1
                Dic.Add sKey, k
                Res(k, 1) = Data(r, 2)
                Res(k, 2) = Data(r, 3)
                Res(k, c) = Data(r, 12)
            Else
                n = Dic.Item(sKey)
                If Data(r, 12) > Res(n, c) Then
                    Res(n, c) = Data(r, 12)
                End If
            End If
        End If
    Next r
   
    sht.Cells.ClearContents
   
    sht.Range("A1").Resize(UBound(Data, 1), ConSoMax + 2).Value = Res
   
    TangTocCode False
   
    MsgBox "Done!", vbInformation
    GoTo Exit_Sub
   
End_sub:

    TangTocCode False
   
    If Err <> 0 Then
        MsgBox "Error: " & Err.Description, vbCritical
    End If

Exit_Sub:

End Sub
Thử dùng ADO sẽ ngắn gọn hơn nhiều.
 
Upvote 0
Dùng ADO tốc độ sẽ nhanh hơn
1.

Đổi lại thành

Dim Data As Variant, Res As Variant, sKey As String
Mục 1 , OT nghĩ là được. Bạn thử đính kèm thêm ví dụ 1 vài tập tin khác lên xem.. OT không làm được thì có rất rất nhiều Bạn khác làm được ạ.
Mục 2 , Bạn thử thay lại sub 'TongHopDienTro' bắng sub bên dưới xem:
Em có thử bằng sub này
Mã:
Sub ABC()
  Dim cn As Object, rs As Object
  Dim eRow&, includeList$, excludeList$, Sql$
  With Application.FileDialog(msoFileDialogFilePicker)
    .Filters.Add "All Excel", "*.cs*"
    .AllowMultiSelect = False
    .Show
    If .SelectedItems.Count < 1 Then MsgBox ("Ban khong chon file nao"): Exit Sub
    If .SelectedItems.Count Then
   
      On Error Resume Next
      Set cn = CreateObject("adodb.connection")
      cn.Open ("provider=Microsoft.ACE.OLEDB.12.0;data source=" & .SelectedItems(1) & ";mode=Read;extended properties=""Excel 12.0;hdr=no"";")
      Sql = "SELECT * FROM [SMP0000$A1:AC65000] WHERE f1 is not Null"
      Set rs = cn.Execute(Sql)
      If Not rs.EOF Then Sheets("Data").Range("A1").CopyFromRecordset rs
      rs.Close:      cn.Close
      Set rs = Nothing: Set cn = Nothing
      On Error GoTo 0
    End If
  End With
End Sub
Mà nó cứ im re. Không biết đang sai chỗ nào ạ. Nhờ anh @befaint@HieuCD có thể chỉ giúp em sai chỗ nào không ạ
 
Upvote 0
Thử dùng ADO sẽ ngắn gọn hơn nhiều.
Uây, 'Đại ca' đây rồi, em đang cũng đang chờ 'Đại ca' ghé qua đây đó ạ --=0
Bài đã được tự động gộp:

Em có thử bằng sub này
Mã:
S..
      Sql = "SELECT * FROM [SMP0000$A1:AC65000] WHERE f1 is not Null"
...
Mà nó cứ im re. Không biết đang sai chỗ nào ạ. Nhờ anh @befaint@HieuCD có thể chỉ giúp em sai chỗ nào không ạ
Cái này nếu có chạy được chưa đủ đáp ứng được yêu cầu của Bạn đâu ạ, câu lệnh truy vấn còn dài dài lắm :"'
 
Upvote 0
Uây, 'Đại ca' đây rồi, em đang cũng đang chờ 'Đại ca' ghé qua đây đó ạ --=0
Anh thử code với 1 file như sau:
Mã:
Sub CongDon_HLMT()
    With CreateObject("ADODB.Recordset")
        .Open "TRANSFORM First(F12) Select F2,F3,F6 from [SMP0000.CSV] Where F2 Like '%SP4733V-02' AND F13='OK' GROUP BY F2, F3 PIVOT F6 IN (1,2,3,4,5)", ("Provider=Microsoft.ACE.OLEDB.12.0;Data source=" & ThisWorkbook.Path & ";Extended Properties=""Text;HDR=No;FORMAT=Delimited""")
         Sheet1.Range("A3").CopyFromRecordset .DataSource
    End With
End Sub
 
Upvote 0
Cái này nếu có chạy được chưa đủ đáp ứng được yêu cầu của Bạn đâu ạ, câu lệnh truy vấn còn dài dài lắm :"'
Thấy nó im re. nên chẳng biết sai chỗ nào. Chứ thực ra em cứ đang kiểu làm từng bước 1 vì không có khả năng.
Mục đích cuối cùng là em muốn tìm 1 mã hàng trong nhiều file CSV nằm ở nhiều forder khác nhau.
Bài đã được tự động gộp:

Anh thử code với 1 file như sau:
Mã:
Sub CongDon_HLMT()
    With CreateObject("ADODB.Recordset")
        .Open "TRANSFORM First(F12) Select F2,F3,F6 from [SMP0000.CSV] Where F2 Like '%SP4733V-02' AND F13='OK' GROUP BY F2, F3 PIVOT F6 IN (1,2,3,4,5)", ("Provider=Microsoft.ACE.OLEDB.12.0;Data source=" & ThisWorkbook.Path & ";Extended Properties=""Text;HDR=No;FORMAT=Delimited""")
         Sheet1.Range("A3").CopyFromRecordset .DataSource
    End With
End Sub
Òa. thấy nhát ra luôn.
Nếu em muốn tìm mã khác thì cứ thay chỗ này ạ anh?
Mã:
 '%SP4733V-02'
Và cho em hỏi 1 chút nữa. em có thể đưa nhiều file CSV khác về chung chỗ này được không ạ
 
Upvote 0
Thấy nó im re. nên chẳng biết sai chỗ nào. Chứ thực ra em cứ đang kiểu làm từng bước 1 vì không có khả năng.
Mục đích cuối cùng là em muốn tìm 1 mã hàng trong nhiều file CSV nằm ở nhiều forder khác nhau.
Bài đã được tự động gộp:


Òa. thấy nhát ra luôn.
Nếu em muốn tìm mã khác thì cứ thay chỗ này ạ anh?
1.
Mã:
 '%SP4733V-02'
2. Và cho em hỏi 1 chút nữa. em có thể đưa nhiều file CSV khác về chung chỗ này được không ạ
1. Bạn có thể thay đổi tùy thích.
2. Dùng vòng lặp duyệt từng tên file đưa vào là được.
 
Upvote 0
Anh thử code với 1 file như sau:
Mã:
Sub CongDon_HLMT()
    With CreateObject("ADODB.Recordset")
        .Open "TRANSFORM First(F12) Select F2,F3,F6 from [SMP0000.CSV] Where F2 Like '%SP4733V-02' AND F13='OK' GROUP BY F2, F3 PIVOT F6 IN (1,2,3,4,5)", ("Provider=Microsoft.ACE.OLEDB.12.0;Data source=" & ThisWorkbook.Path & ";Extended Properties=""Text;HDR=No;FORMAT=Delimited""")
         Sheet1.Range("A3").CopyFromRecordset .DataSource
    End With
End Sub
Tuyệt vời quá anh Hai Lúa, 'PIVOT' hay thật đó :D
 
Upvote 0
Upvote 0
Web KT
Back
Top Bottom