Nhờ sửa code tính tổng khi gộp dữ liệu bằng ADO

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

nguyenkar

Thành viên mới
Tham gia
6/3/22
Bài viết
26
Được thích
6
Mình cần anh chị em giúp đỡ sửa đoạn code trong file tổng kết (code này mót từ Mr.DBA) hoặc viết giúp đoạn code mới giống vậy, để có thể vừa gom được dữ liệu từ các file con (chọn được file nào muốn gom dữ liệu), vừa tính tổng điểm của những người trùng như trong sheet tên PowerQuery. Rất cảm ơn anh chị giúp đỡ ạ.
 

File đính kèm

  • TongKet.zip
    92.8 KB · Đọc: 26
Giải pháp
Mình cần anh chị em giúp đỡ sửa đoạn code trong file tổng kết (code này mót từ Mr.DBA) hoặc viết giúp đoạn code mới giống vậy, để có thể vừa gom được dữ liệu từ các file con (chọn được file nào muốn gom dữ liệu), vừa tính tổng điểm của những người trùng như trong sheet tên PowerQuery. Rất cảm ơn anh chị giúp đỡ ạ.
Bạn thử code sau nhé:
Mã:
Sub TongHop_HLMT()
    Dim strPath As Variant, strSQL As String
    With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = True
        .Filters.Add "Excel Files", "*.xls*", 1
        If Not .Show = -1 Then
            MsgBox "Ban da khong chon tong hop", vbInformation, "Thông Báo"
            Exit Sub
        End If
        For Each strPath In .SelectedItems...
Mình cần anh chị em giúp đỡ sửa đoạn code trong file tổng kết (code này mót từ Mr.DBA) hoặc viết giúp đoạn code mới giống vậy, để có thể vừa gom được dữ liệu từ các file con (chọn được file nào muốn gom dữ liệu), vừa tính tổng điểm của những người trùng như trong sheet tên PowerQuery. Rất cảm ơn anh chị giúp đỡ ạ.
Thử code này nhé.
Mã:
Sub TongHop()
    Dim cn As Object, SQL As String, duonglinh, arr, dic As Object
    Dim ketqua(1 To 10000, 1 To 2), b As Long, a As Long, i As Long, lr As Long, dk As String
    Set dic = CreateObject("scripting.dictionary")
    Set cn = CreateObject("ADODB.Connection")  'khai báo cho ADO
    Application.ScreenUpdating = False 'Tat cap nhap man hinh
    With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = True 'cho chon nhieu file
        .Filters.Add "Microsoft Excel Files", "*.xls; *.xlsx; *.xlsb; *.xlsm", 1 'chi hien cac duoi excel
        If Not .Show = -1 Then  'Kiêm tra xem da chon file chua
            MsgBox "Ban da khong chon tong hop", vbInformation, "Thông Báo"
            Exit Sub
        End If
        For Each duonglinh In .SelectedItems
            cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & duonglinh & ";Extended Properties=""Excel 12.0;HDR=No"";" ' mo file excel
            SQL = "SELECT * FROM [Tongket$C3:D10000] where f1 is not null"
            arr = chuyenmang(cn.Execute(SQL).GetRows)
            For i = 1 To UBound(arr)
                dk = arr(i, 1)
                If Not dic.exists(dk) Then
                    a = a + 1
                    dic.Add dk, a
                    ketqua(a, 1) = arr(i, 1)
                    ketqua(a, 2) = arr(i, 2)
                Else
                   b = dic.Item(dk)
                   ketqua(b, 2) = ketqua(b, 2) + arr(i, 2)
                End If
            Next i
            cn.Close 'dong file
        Next
    End With
    With Sheets("baocao")
        lr = .Range("A" & Rows.Count).End(xlUp).Row 'xác dinh dong cuoi cua bang tong hop
        If lr > 1 Then .Range("A2:B" & lr).ClearContents 'neu dong cuoi lon hon 15 thi xoa
        If a Then .Range("A2:B2").Resize(a).Value = ketqua
    End With
    Application.ScreenUpdating = True 'bat cap nhap man hinh
    Set cn = Nothing
    Set dic = Nothing
End Sub
Private Function chuyenmang(ByVal arr) As Variant
    Dim kq(), i As Long, j As Long
    ReDim kq(1 To UBound(arr, 2) + 1, 1 To UBound(arr, 1) + 1)
    For i = LBound(arr, 2) To UBound(arr, 2)
        For j = LBound(arr, 1) To UBound(arr, 1)
            kq(i + 1, j + 1) = arr(j, i)
        Next j
    Next i
    chuyenmang = kq
End Function
 
Upvote 0
Thử code này nhé.
Mã:
Sub TongHop()
    Dim cn As Object, SQL As String, duonglinh, arr, dic As Object
    Dim ketqua(1 To 10000, 1 To 2), b As Long, a As Long, i As Long, lr As Long, dk As String
    Set dic = CreateObject("scripting.dictionary")
    Set cn = CreateObject("ADODB.Connection")  'khai báo cho ADO
    Application.ScreenUpdating = False 'Tat cap nhap man hinh
    With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = True 'cho chon nhieu file
        .Filters.Add "Microsoft Excel Files", "*.xls; *.xlsx; *.xlsb; *.xlsm", 1 'chi hien cac duoi excel
        If Not .Show = -1 Then  'Kiêm tra xem da chon file chua
            MsgBox "Ban da khong chon tong hop", vbInformation, "Thông Báo"
            Exit Sub
        End If
        For Each duonglinh In .SelectedItems
            cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & duonglinh & ";Extended Properties=""Excel 12.0;HDR=No"";" ' mo file excel
            SQL = "SELECT * FROM [Tongket$C3:D10000] where f1 is not null"
            arr = chuyenmang(cn.Execute(SQL).GetRows)
            For i = 1 To UBound(arr)
                dk = arr(i, 1)
                If Not dic.exists(dk) Then
                    a = a + 1
                    dic.Add dk, a
                    ketqua(a, 1) = arr(i, 1)
                    ketqua(a, 2) = arr(i, 2)
                Else
                   b = dic.Item(dk)
                   ketqua(b, 2) = ketqua(b, 2) + arr(i, 2)
                End If
            Next i
            cn.Close 'dong file
        Next
    End With
    With Sheets("baocao")
        lr = .Range("A" & Rows.Count).End(xlUp).Row 'xác dinh dong cuoi cua bang tong hop
        If lr > 1 Then .Range("A2:B" & lr).ClearContents 'neu dong cuoi lon hon 15 thi xoa
        If a Then .Range("A2:B2").Resize(a).Value = ketqua
    End With
    Application.ScreenUpdating = True 'bat cap nhap man hinh
    Set cn = Nothing
    Set dic = Nothing
End Sub
Private Function chuyenmang(ByVal arr) As Variant
    Dim kq(), i As Long, j As Long
    ReDim kq(1 To UBound(arr, 2) + 1, 1 To UBound(arr, 1) + 1)
    For i = LBound(arr, 2) To UBound(arr, 2)
        For j = LBound(arr, 1) To UBound(arr, 1)
            kq(i + 1, j + 1) = arr(j, i)
        Next j
    Next i
    chuyenmang = kq
End Function
Code chạy đúng ý em, cảm ơn bác đã giúp ạ. Mấy bữa trước em cũng có mò mẫm code trên mà làm ko ra, ko nghĩ tới phải có dic để lọc (nếu em không nhầm thì kênh yt của bác là tin học Phong An ạ). Em cứ tưởng là chỉ cần thêm 1 vòng lặp nữa để sum đè lên recodset thì không cần gọi thêm dic. Cảm ơn bác nhiều ạ.
 
Upvote 0
Lý do tại sao đã Ai-Đi-Ở rồi còn phải Đít-Sần nữa?

Access SQl có thể Union nhiều bảng lại. Chỉ là số bảng chỉ lên tới 15.
Nhưng tôi đã từng chỉ cho cách dùng trên 15 bảng.
 
Upvote 0
Lý do tại sao đã Ai-Đi-Ở rồi còn phải Đít-Sần nữa?

Access SQl có thể Union nhiều bảng lại. Chỉ là số bảng chỉ lên tới 15.
Nhưng tôi đã từng chỉ cho cách dùng trên 15 bảng.
Vì không biết anh ơi.Anh cho tài liệu tham khảo ạ.
 
Upvote 0
Bác @snow25 giúp em phát nữa, cho em cái bảng thông báo lỗi khi 1 trong những bảng con chưa có dữ liệu, em thử fl is null nhưng ko được ạ.
Bài đã được tự động gộp:

Lý do tại sao đã Ai-Đi-Ở rồi còn phải Đít-Sần nữa?

Access SQl có thể Union nhiều bảng lại. Chỉ là số bảng chỉ lên tới 15.
Nhưng tôi đã từng chỉ cho cách dùng trên 15 bảng.
Bác giúp em cái đường link bài cũ được không ạ, em cũng muốn xem để sau này có lúc dùng tới ạ.
 
Lần chỉnh sửa cuối:
Upvote 0
...

Bác giúp em cái đường link bài cũ được không ạ, em cũng muốn xem để sau này có lúc dùng tới ạ.
Học cách mò tìm "sau này có nhiều lúc dùng" hơn.

Bước 1: Tìm bạn nào có nhiều bài "chiến" về ADO ở đây.
Bước 3: Tìm những bài của bạn ấy có liên quan đến lấy dữ liệu từ nhiều files.
Bước 2: Tìm những bài có tôi phê bình.
 
Upvote 0
Bác @snow25 giúp em phát nữa, cho em cái bảng thông báo lỗi khi 1 trong những bảng con chưa có dữ liệu, em thử fl is null nhưng ko được ạ.
Bạn thử code này.Ở trong câu lệnh SQL đã có câu lệnh bỏ Null rồi mà.
Mã:
Sub TongHop()
    Dim cn As Object, SQL As String, duonglinh, arr, dic As Object
    Dim ketqua(1 To 10000, 1 To 2), b As Long, a As Long, i As Long, lr As Long, dk As String
    Set dic = CreateObject("scripting.dictionary")
    Set cn = CreateObject("ADODB.Connection")  'khai báo cho ADO
    Application.ScreenUpdating = False 'Tat cap nhap man hinh
    With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = True 'cho chon nhieu file
        .Filters.Add "Microsoft Excel Files", "*.xls; *.xlsx; *.xlsb; *.xlsm", 1 'chi hien cac duoi excel
        If Not .Show = -1 Then  'Kiêm tra xem da chon file chua
            MsgBox "Ban da khong chon tong hop", vbInformation, "Thông Báo"
            Exit Sub
        End If
        For Each duonglinh In .SelectedItems
            cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & duonglinh & ";Extended Properties=""Excel 12.0;HDR=No"";" ' mo file excel
            SQL = "SELECT * FROM [Tongket$C2:D10000] where f1 is not null"
            arr = chuyenmang(cn.Execute(SQL).GetRows)
            For i = 2 To UBound(arr)
                dk = arr(i, 1)
                If Not dic.exists(dk) Then
                    a = a + 1
                    dic.Add dk, a
                    ketqua(a, 1) = arr(i, 1)
                    ketqua(a, 2) = arr(i, 2)
                Else
                   b = dic.Item(dk)
                   ketqua(b, 2) = ketqua(b, 2) + arr(i, 2)
                End If
            Next i
            cn.Close 'dong file
        Next
    End With
    With Sheets("baocao")
        lr = .Range("A" & Rows.Count).End(xlUp).Row 'xác dinh dong cuoi cua bang tong hop
        If lr > 1 Then .Range("A2:B" & lr).ClearContents 'neu dong cuoi lon hon 15 thi xoa
        If a Then .Range("A2:B2").Resize(a).Value = ketqua
    End With
    Application.ScreenUpdating = True 'bat cap nhap man hinh
    Set cn = Nothing
    Set dic = Nothing
End Sub
Private Function chuyenmang(ByVal arr) As Variant
    Dim kq(), i As Long, j As Long
    ReDim kq(1 To UBound(arr, 2) + 1, 1 To UBound(arr, 1) + 1)
    For i = LBound(arr, 2) To UBound(arr, 2)
        For j = LBound(arr, 1) To UBound(arr, 1)
            kq(i + 1, j + 1) = arr(j, i)
        Next j
    Next i
    chuyenmang = kq
End Function
 
Upvote 0
Mình cần anh chị em giúp đỡ sửa đoạn code trong file tổng kết (code này mót từ Mr.DBA) hoặc viết giúp đoạn code mới giống vậy, để có thể vừa gom được dữ liệu từ các file con (chọn được file nào muốn gom dữ liệu), vừa tính tổng điểm của những người trùng như trong sheet tên PowerQuery. Rất cảm ơn anh chị giúp đỡ ạ.
Bạn thử code sau nhé:
Mã:
Sub TongHop_HLMT()
    Dim strPath As Variant, strSQL As String
    With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = True
        .Filters.Add "Excel Files", "*.xls*", 1
        If Not .Show = -1 Then
            MsgBox "Ban da khong chon tong hop", vbInformation, "Thông Báo"
            Exit Sub
        End If
        For Each strPath In .SelectedItems
            strSQL = strSQL & " Union All Select [Name],[SubTotal] From [EXCEL 12.0;Database=" & strPath & "].[TongKet$] Where [Name] Is Not Null"
        Next
    End With
    With CreateObject("ADODB.Connection")
        .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 12.0 Xml;"
        Sheet5.Range("E2").CopyFromRecordset .Execute("Select [Name], Sum(SubTotal) From (" & Right(strSQL, Len(strSQL) - 10) & ") Group By [Name]")
    End With
    
End Sub
 
Upvote 0
Giải pháp
Bạn thử code sau nhé:
Mã:
Sub TongHop_HLMT()
    Dim strPath As Variant, strSQL As String
    With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = True
        .Filters.Add "Excel Files", "*.xls*", 1
        If Not .Show = -1 Then
            MsgBox "Ban da khong chon tong hop", vbInformation, "Thông Báo"
            Exit Sub
        End If
        For Each strPath In .SelectedItems
            strSQL = strSQL & " Union All Select [Name],[SubTotal] From [EXCEL 12.0;Database=" & strPath & "].[TongKet$] Where [Name] Is Not Null"
        Next
    End With
    With CreateObject("ADODB.Connection")
        .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 12.0 Xml;"
        Sheet5.Range("E2").CopyFromRecordset .Execute("Select [Name], Sum(SubTotal) From (" & Right(strSQL, Len(strSQL) - 10) & ") Group By [Name]")
    End With
   
End Sub
Code này hay quá, nhờ anh admin xử lý giúp em nếu trong các file nguồn em thêm 2 cột màu vàng này nữa thì code của anh sẽ sửa như thế nào ạ.
 

File đính kèm

  • A.xlsx
    9.6 KB · Đọc: 5
Upvote 0
Code này hay quá, nhờ anh admin xử lý giúp em nếu trong các file nguồn em thêm 2 cột màu vàng này nữa thì code của anh sẽ sửa như thế nào ạ.
Thêm 2 cột đó vào ở file nguồn nhưng kết quả của bạn vẫn không đổi hay là kết quả của bạn có thêm 2 cột đó nữa vậy bạn?
 
Upvote 0
Code này hay quá, nhờ anh admin xử lý giúp em nếu trong các file nguồn em thêm 2 cột màu vàng này nữa thì code của anh sẽ sửa như thế nào ạ.
Nịnh quá đi thôi.
Nếu bạn có đủ khả năng để nhìn ra code hay thì cũng đủ khả năng tự sửa lấy.
Còn phải nhờ cái đơn giản như vậy là do đọc code chả hiểu gì cả.
 
Upvote 0
nếu dùng ADODB thì từng bước bỏ cái hàm chuyển Array đi mà thay vào đó là CopyFromRecordset Rst

Vì nếu dữ liệu nhiều chuyển tốn kém thời gian lắm ... ít chơi chơi hay vì lý do xx thì tạm ok

còn dữ liệu lắm lắm chạy code xong ra pha cafe rồi hóng quá ... tôi lui á :p ...àơi tí vậy
 
Upvote 0
Dạ anh kết quả có thêm 2 cột màu vàng nữa ạ.
Bạn thử code sửa lại như sau nhé:

Mã:
Sub TongHop_HLMT()
    Dim strPath As Variant, strSQL As String
    With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = True
        .Filters.Add "Excel Files", "*.xls*", 1
        If Not .Show = -1 Then
            MsgBox "Ban da khong chon tong hop", vbInformation, "Thông Báo"
            Exit Sub
        End If
        For Each strPath In .SelectedItems
            strSQL = strSQL & " Union All Select [Code],[Name],[Group],[SubTotal] From [EXCEL 12.0;Database=" & strPath & "].[TongKet$] Where [Name] Is Not Null"
        Next
    End With
    With CreateObject("ADODB.Connection")
        .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 12.0 Xml;"
        Sheet5.Range("E2").CopyFromRecordset .Execute("Select [Code],[Name],[Group],Sum(SubTotal) From (" & Right(strSQL, Len(strSQL) - 10) & ") Group By [Code],[Name],[Group]")
    End With
  
End Sub
 
Upvote 0
Bạn thử code sửa lại như sau nhé:

Mã:
Sub TongHop_HLMT()
    Dim strPath As Variant, strSQL As String
    With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = True
        .Filters.Add "Excel Files", "*.xls*", 1
        If Not .Show = -1 Then
            MsgBox "Ban da khong chon tong hop", vbInformation, "Thông Báo"
            Exit Sub
        End If
        For Each strPath In .SelectedItems
            strSQL = strSQL & " Union All Select [Code],[Name],[SubTotal],[Group] From [EXCEL 12.0;Database=" & strPath & "].[TongKet$] Where [Name] Is Not Null"
        Next
    End With
    With CreateObject("ADODB.Connection")
        .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 12.0 Xml;"
        Sheet5.Range("E2").CopyFromRecordset .Execute("Select [Code],[Name],Sum(SubTotal),[Group] From (" & Right(strSQL, Len(strSQL) - 10) & ") Group By [Code],[Name],[Group]")
    End With
   
End Sub
Cảm ơn anh admin nhiều, em hiểu cách làm rồi.
Như vậy muốn tính tổng bao nhiêu cột và ghi ra thì cũng phải Group By bấy nhiêu cột.
Giả sử bảng dữ liệu em có 20 cột mà em muốn tính tổng theo 2 điều kiện (2 cột) nào thôi, nhưng nếu muốn ghi ra cả 20 cột thì bắt buộc phải Group By 20 cột lại (có nghĩa tính tổng theo 20 điều kiện) thì không thể được phải không anh?
 
Upvote 0
Cảm ơn anh admin nhiều, em hiểu cách làm rồi.
Như vậy muốn tính tổng bao nhiêu cột và ghi ra thì cũng phải Group By bấy nhiêu cột.
Giả sử bảng dữ liệu em có 20 cột mà em muốn tính tổng theo 2 điều kiện (2 cột) nào thôi, nhưng nếu muốn ghi ra cả 20 cột thì bắt buộc phải Group By 20 cột lại (có nghĩa tính tổng theo 20 điều kiện) thì không thể được phải không anh?
Bạn lấy bao nhiêu cột mà không phải cột tính toán thì bắt buộc phải gom nhóm (Group By) bấy nhiêu cột đó. Có nghĩa là điều kiện gom nhóm phải ít nhất là các cột không tính toán được lấy ra.
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn thử code này.Ở trong câu lệnh SQL đã có câu lệnh bỏ Null rồi mà.
Mã:
Sub TongHop()
    Dim cn As Object, SQL As String, duonglinh, arr, dic As Object
    Dim ketqua(1 To 10000, 1 To 2), b As Long, a As Long, i As Long, lr As Long, dk As String
    Set dic = CreateObject("scripting.dictionary")
    Set cn = CreateObject("ADODB.Connection")  'khai báo cho ADO
    Application.ScreenUpdating = False 'Tat cap nhap man hinh
    With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = True 'cho chon nhieu file
        .Filters.Add "Microsoft Excel Files", "*.xls; *.xlsx; *.xlsb; *.xlsm", 1 'chi hien cac duoi excel
        If Not .Show = -1 Then  'Kiêm tra xem da chon file chua
            MsgBox "Ban da khong chon tong hop", vbInformation, "Thông Báo"
            Exit Sub
        End If
        For Each duonglinh In .SelectedItems
            cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & duonglinh & ";Extended Properties=""Excel 12.0;HDR=No"";" ' mo file excel
            SQL = "SELECT * FROM [Tongket$C2:D10000] where f1 is not null"
            arr = chuyenmang(cn.Execute(SQL).GetRows)
            For i = 2 To UBound(arr)
                dk = arr(i, 1)
                If Not dic.exists(dk) Then
                    a = a + 1
                    dic.Add dk, a
                    ketqua(a, 1) = arr(i, 1)
                    ketqua(a, 2) = arr(i, 2)
                Else
                   b = dic.Item(dk)
                   ketqua(b, 2) = ketqua(b, 2) + arr(i, 2)
                End If
            Next i
            cn.Close 'dong file
        Next
    End With
    With Sheets("baocao")
        lr = .Range("A" & Rows.Count).End(xlUp).Row 'xác dinh dong cuoi cua bang tong hop
        If lr > 1 Then .Range("A2:B" & lr).ClearContents 'neu dong cuoi lon hon 15 thi xoa
        If a Then .Range("A2:B2").Resize(a).Value = ketqua
    End With
    Application.ScreenUpdating = True 'bat cap nhap man hinh
    Set cn = Nothing
    Set dic = Nothing
End Sub
Private Function chuyenmang(ByVal arr) As Variant
    Dim kq(), i As Long, j As Long
    ReDim kq(1 To UBound(arr, 2) + 1, 1 To UBound(arr, 1) + 1)
    For i = LBound(arr, 2) To UBound(arr, 2)
        For j = LBound(arr, 1) To UBound(arr, 1)
            kq(i + 1, j + 1) = arr(j, i)
        Next j
    Next i
    chuyenmang = kq
End Function
Vâng ạ, e thấy trong câu lệnh đã có check null rồi, nhưng không hiểu sao khi em gán thông báo if f1 is null then msgbox .... thì lại không hiện lên.
Vì code trước sẽ báo lỗi như hình khi 1 trong những file em chọn bị trống. Mà muốn kiểm tra file trống phải mở lên từng file nên mất khá nhiều thời gian. Ý e muốn là trong khi chọn file, nếu trống thì hiện thông báo file nào trống để mình biết mà xử nó.
Còn code bác mới sửa giúp em, chạy bỏ qua phần file trống luôn, nên cho dù em có chọn file trống thì cũng không biết là đã chọn trống hay có dữ liệu ạ.
Với bác cho em hỏi, mình muốn xác định folder mặc định khi fso mở cửa sổ chọn lên là thisworkbook path được không ạ, mỗi lần chạy code em lại phải chọn từ ngoài vào... đuối ạ.
Em cảm ơn, chúc bác và mọi người có ngày làm việc vui vẻ, và sức khỏe ạ.
Bài đã được tự động gộp:

Bạn thử code sau nhé:
Mã:
Sub TongHop_HLMT()
    Dim strPath As Variant, strSQL As String
    With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = True
        .Filters.Add "Excel Files", "*.xls*", 1
        If Not .Show = -1 Then
            MsgBox "Ban da khong chon tong hop", vbInformation, "Thông Báo"
            Exit Sub
        End If
        For Each strPath In .SelectedItems
            strSQL = strSQL & " Union All Select [Name],[SubTotal] From [EXCEL 12.0;Database=" & strPath & "].[TongKet$] Where [Name] Is Not Null"
        Next
    End With
    With CreateObject("ADODB.Connection")
        .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 12.0 Xml;"
        Sheet5.Range("E2").CopyFromRecordset .Execute("Select [Name], Sum(SubTotal) From (" & Right(strSQL, Len(strSQL) - 10) & ") Group By [Name]")
    End With
   
End Sub
Code của admin hay quá hay, bữa giờ em cứ loay hoay hết sum rồi lại group trong strSQL, xong hết mới thực thi câu CopyFormRecordset. Thậm chí làm 2-3 cái vòng lặp cho strSQL để nó ra kết quả hoàn chỉnh mà không được. Không hề biết có cách xử lý sau khi CopyFromRecordset. Cảm ơn admin, đoạn group sau CopyFromRecordset quả thực làm em mở mang.
 

File đính kèm

  • Background1.png
    Background1.png
    6.6 KB · Đọc: 7
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Không phải là xử lý sau khi CopyFromRecordset mà là cái CopyFromRecordset đó được lấy dữ liệu xuống sheet từ chỗ chứa dữ liệu sau khi truy vấn nhé bạn.
Vậy theo em hiểu là, sau khi mở kết nối thì sẽ truy vấn lần 1 để lấy dữ liệu, sau đó sẽ tiếp tục truy vấn để sum và group vào cái dữ liệu đã lấy ( câu .Execute sẽ chạy trước) rồi mới CopyFromRecordset ra sheet đúng không ạ?
 
Upvote 0
Web KT

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

Back
Top Bottom