Tính tổng các giá trị trùng nhau trong bảng

Liên hệ QC

ads_ads

Thành viên mới
Tham gia
15/1/13
Bài viết
21
Được thích
5
Em cần tính tổng các giá trị giống nhau trong sheet1 rồi chuyển qua sheet "Process" kiểu như file đính kèm. Làm bằng VBA nhé :)
 

File đính kèm

  • test.xlsb
    9.1 KB · Đọc: 68
Em cần tính tổng các giá trị giống nhau trong sheet1 rồi chuyển qua sheet "Process" kiểu như file đính kèm. Làm bằng VBA nhé :)
Áp dụng code ADO (tác giả Hai Lúa Miền Tây), bạn tham khảo:
[gpecode=vb]
Sub TongHop()
Dim lsSQL As String, cnn As Object, lrs As Object, i As Long
Set cnn = CreateObject("ADODB.Connection")
Set lrs = CreateObject("ADODB.Recordset")
With cnn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.FullName & _
";Extended Properties=""Excel 8.0;HDR=No;"";"
.Open
End With
lsSQL = "select F1, F2, sum(F3), sum(F4), sum(F5), sum(F6), sum(F7), sum(F8) from " & _
"(SELECT F1, F2, F3, F4, F5, F6, F7, F8 FROM [Sheet1$A2:H100]) " & _
"group by F2, F1"
lrs.Open lsSQL, cnn
With Sheet2
.[A2:H100].ClearContents
.[A2].CopyFromRecordset lrs
End With
lrs.Close: Set lrs = Nothing
cnn.Close: Set cnn = Nothing
End Sub
[/gpecode]
Còn vướng 1 chút về Account ID (Cột A): Dữ liệu Text nằm sau (Other) bị trả về rỗng, cái này mình cũng chưa hiểu, nhờ mọi người xem dùm.
 

File đính kèm

  • test.xls
    42.5 KB · Đọc: 63
Lần chỉnh sửa cuối:
Upvote 0
Em cần tính tổng các giá trị giống nhau trong sheet1 rồi chuyển qua sheet "Process" kiểu như file đính kèm. Làm bằng VBA nhé :)

Muốn VBA thì tặng bạn Sub này tuỳ nghi sử dụng.
PHP:
Public Sub GPE()
Dim Dic As Object, sArr(), dArr(), I As Long, J As Long, K As Long, Tem As Variant
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("Sheet1")
    sArr = .Range(.[A2], .[A1048576].End(xlUp)).Resize(, 8).Value
End With
ReDim dArr(1 To UBound(sArr, 1), 1 To 8)
For I = 1 To UBound(sArr, 1)
    Tem = sArr(I, 1)
    If Not Dic.Exists(Tem) Then
        K = K + 1
        Dic.Add Tem, K
        For J = 1 To 8
            dArr(K, J) = sArr(I, J)
        Next J
    Else
        For J = 3 To 8
            dArr(Dic.Item(Tem), J) = dArr(Dic.Item(Tem), J) + sArr(I, J)
        Next J
    End If
Next I
With Sheets("Process")
    .[A2:H10000].ClearContents
    If K Then .[A2].Resize(K, 8).Value = dArr
End With
Set Dic = Nothing
End Sub
------------------------------
Ố là la
Là đụng hàng!
Leo giờ xài ADO,
Chạy tẹt pô !
Ủa! Mà file .xlsb code nó chạy ở đâu ta?
 
Lần chỉnh sửa cuối:
Upvote 0
Muốn VBA thì tặng bạn Sub này tuỳ nghi sử dụng.
...
Ố là la
Là đụng hàng!
Leo giờ xài ADO,
Chạy tẹt pô !
Ủa! Mà file .xlsb code nó chạy ở đâu ta?
Hình như bác vẫn xài Excel 2003 :)
ADO em chưa nghiên cứu, chỉ là tập sửa code ADO của anh Hai Lúa thôi bác ạ.
 
Upvote 0
Em xin cảm ơn các anh. Giờ em xin thêm 1 yêu cầu nữa, là file của em có thêm cột ngày tháng. Em muốn tính tổng dữ liệu trùng nhau theo ngày tháng nào đó đuwocj không ạ?

Em xin gửi lại file đính kèm có bổ xung
 

File đính kèm

  • test.xlsb
    9.1 KB · Đọc: 28
Upvote 0
Em xin cảm ơn các anh. Giờ em xin thêm 1 yêu cầu nữa, là file của em có thêm cột ngày tháng. Em muốn tính tổng dữ liệu trùng nhau theo ngày tháng nào đó đuwocj không ạ?

Em xin gửi lại file đính kèm có bổ xung

Không hiểu ý bạn lắm.

Xin hỏi bạn là: Tổng dữ liệu trùng nhau là tổng ở cột nào ? Và cho kết quả tính đc đó vào đâu ?

Hay bạn muốn đếm số ngày trùng nhau trong cột ngày tháng ?
 
Upvote 0
Không hiểu ý bạn lắm.

Xin hỏi bạn là: Tổng dữ liệu trùng nhau là tổng ở cột nào ? Và cho kết quả tính đc đó vào đâu ?

Hay bạn muốn đếm số ngày trùng nhau trong cột ngày tháng ?

Em cần tính tổng các giá trị giống nhau trong sheet1 rồi chuyển qua sheet "Process" kiểu như file đính kèm. Làm bằng VBA nhé :)

Em đã làm theo cách của Ba Tê và ok được 1 vấn đề rồi, còn "yêu cầu" thứ 2 như em đã trình bày, thêm cái ngày tháng nữa. Hix
 
Upvote 0

Em đã làm theo cách của Ba Tê và ok được 1 vấn đề rồi, còn "yêu cầu" thứ 2 như em đã trình bày,
thêm cái ngày tháng nữa. Hix
Sử dụng Dic thì chờ bác Ba Tê thôi.
Sử dụng ADO thì bạn sửa chút xíu trong code:
[gpecode=vb]
Sub TongHop()
Dim lsSQL As String, cnn As Object, lrs As Object, i As Long
Set cnn = CreateObject("ADODB.Connection")
Set lrs = CreateObject("ADODB.Recordset")
With cnn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.FullName & _
";Extended Properties=""Excel 8.0;HDR=No;"";"
.Open
End With
lsSQL = "select F1, F2, sum(F3), sum(F4), sum(F5), sum(F6), sum(F7), sum(F8), F9 from " & _
"(SELECT F1, F2, F3, F4, F5, F6, F7, F8, F9 FROM [Sheet1$A2:I100]) " & _
"group by F1, F2, F9"
lrs.Open lsSQL, cnn
With Sheet2
.[A2:I100].ClearContents
.[A2].CopyFromRecordset lrs
End With
lrs.Close: Set lrs = Nothing
cnn.Close: Set cnn = Nothing
End Sub
[/gpecode]
 

File đính kèm

  • test.xlsb
    19.4 KB · Đọc: 38
Upvote 0



Em đã làm theo cách của Ba Tê và ok được 1 vấn đề rồi, còn "yêu cầu" thứ 2 như em đã trình bày, thêm cái ngày tháng nữa. Hix

Hỏi kiểu "nhấp nhá nhấp nhữ" như vầy không biết đã đủ chưa.
Thêm cái ngày là 1 ngày, hay là lại muốn từ ngày này đến ngày kia?
Tôi làm cho bạn từ ngày đến ngày luôn nè, nếu muốn lọc ra 1 ngày thì từ ngày và đến ngày gõ giống nhau.
 

File đính kèm

  • Test_2.rar
    26.6 KB · Đọc: 64
Upvote 0
Sử dụng Dic thì chờ bác Ba Tê thôi.
Sử dụng ADO thì ...

Bạn sử dụng ADO thì phải coi chừng. Khi kết nối với một file bằng ADO, VBA sẽ dùng một cái cache chứa trong bộ nhớ. Lúc dùng xong, cắt kết nối. Nếu là file đóng thì cache này sẽ được giải phóng. Nếu file đang mở thì VBA không giải phóng được cache. Một vài lần không sao nhưng nếu code chạy nhiều lần thì sẽ xảy ra lỗi sập bộ nhớ.

Lỗi này người sử dụng ADO với VBA đều biết. Lục từ khoá "VBA ADO memory leak" (chảy bộ nhớ) sẽ thấy.

Khi bị chảy bộ nhớ, đóng file lại cũng không giải quyết được. Phải đóng phần mềm Excel lại mới hết.

Vì lý do này, gần như người ta luôn luôn tránh kết nối với file đang mở. Tức là bạn chỉ nên chạy code trong 1 file và kết nối với file khác. Không nên tự kết nối với file chạy code.
 
Upvote 0
Hỏi kiểu "nhấp nhá nhấp nhữ" như vầy không biết đã đủ chưa.
Thêm cái ngày là 1 ngày, hay là lại muốn từ ngày này đến ngày kia?
Tôi làm cho bạn từ ngày đến ngày luôn nè, nếu muốn lọc ra 1 ngày thì từ ngày và đến ngày gõ giống nhau.

Cảm ơn bác Ba Tê nhiều, bữa trước là do yêu cầu công việc, sau lại phát sinh nên mới lại phải quấy quả. Giờ thì ok rồi. Em mới chập chững với VBA nên có nhiều bài toán chẳng biết phải làm ntn. :)
 
Upvote 0
Sử dụng Dic thì chờ bác Ba Tê thôi.
Sử dụng ADO thì bạn sửa chút xíu trong code:
[gpecode=vb]
Sub TongHop()
Dim lsSQL As String, cnn As Object, lrs As Object, i As Long
Set cnn = CreateObject("ADODB.Connection")
Set lrs = CreateObject("ADODB.Recordset")
With cnn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.FullName & _
";Extended Properties=""Excel 8.0;HDR=No;"";"
.Open
End With
lsSQL = "select F1, F2, sum(F3), sum(F4), sum(F5), sum(F6), sum(F7), sum(F8), F9 from " & _
"(SELECT F1, F2, F3, F4, F5, F6, F7, F8, F9 FROM [Sheet1$A2:I100]) " & _
"group by F1, F2, F9"
lrs.Open lsSQL, cnn
With Sheet2
.[A2:I100].ClearContents
.[A2].CopyFromRecordset lrs
End With
lrs.Close: Set lrs = Nothing
cnn.Close: Set cnn = Nothing
End Sub
[/gpecode]
 
Upvote 0
TÔI CHÉP VÀO SAO NÓ KHÔNG CHẠY NHỈ sheet2 sang sheet 3
 
Lần chỉnh sửa cuối:
Upvote 0
Em cần tính tổng các giá trị giống nhau trong sheet1 rồi chuyển qua sheet "Process" kiểu như file đính kèm. Làm bằng VBA nhé :)
Sử dụng cái có sẳn là PivotTable của bác Bill vừa nhanh lẹ, chính xác với dữ liệu lớn thì nhanh hơn VBA.
 

File đính kèm

  • Tổng.xlsb
    12.8 KB · Đọc: 15
Upvote 0
Web KT
Back
Top Bottom