Giúp mình code VBA lọc dữ liệu có điều kiện và tổng hợp (1 người xem)

Liên hệ QC

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

nguyenkhoadng

Thành viên hoạt động
Tham gia
15/6/11
Bài viết
179
Được thích
30
Nhờ các bạn giúp mình đoạn code VBA lọc dữ liệu có điều kiện, sau đó tổng hợp chúng lại. cụ thể như sau:
- ở sheet THONG-KE mình có 2 cấu kiện AA1 Và AA2, dữ liệu thống kê như trong file ví dụ đính kèm.
Mình muốn nhờ các bạn giúp mình đoạn vba tạo 1 sheet PHAN-TICH, trong đó có 2 bảng (BẢNG LỌC DỮ LIỆU và BẢNG TỔNG HỢP) cụ thể:
- ở bảng LỌC DỮ LIỆU sẽ lọc tất cả dữ liệu bên sheet THONG-KE dựa vào điều kiện là cột D và E. dữ liệu nào có cột D và E giống nhau thì cộng lại, còn lại khác nhau thì giữ nguyên. và vẫn giữ lại 2 cấu kiện AA1, AA2 như trong file ví dụ đính kèm.
- ở bảng TỔNG HỢP sẽ tổng hợp lại từ bảng LỌC DỮ LIỆU.

Nhờ các bạn giúp cho.
Cụ thể mình có ghi trong file đính kèm.
Mình cảm ơn!
 

File đính kèm

Nhờ các bạn giúp mình đoạn code VBA lọc dữ liệu có điều kiện, sau đó tổng hợp chúng lại. cụ thể như sau:
- ở sheet THONG-KE mình có 2 cấu kiện AA1 Và AA2, dữ liệu thống kê như trong file ví dụ đính kèm.
Mình muốn nhờ các bạn giúp mình đoạn vba tạo 1 sheet PHAN-TICH, trong đó có 2 bảng (BẢNG LỌC DỮ LIỆU và BẢNG TỔNG HỢP) cụ thể:
- ở bảng LỌC DỮ LIỆU sẽ lọc tất cả dữ liệu bên sheet THONG-KE dựa vào điều kiện là cột D và E. dữ liệu nào có cột D và E giống nhau thì cộng lại, còn lại khác nhau thì giữ nguyên. và vẫn giữ lại 2 cấu kiện AA1, AA2 như trong file ví dụ đính kèm.
- ở bảng TỔNG HỢP sẽ tổng hợp lại từ bảng LỌC DỮ LIỆU.

Nhờ các bạn giúp cho.
Cụ thể mình có ghi trong file đính kèm.
Mình cảm ơn!
Nếu bạn muốn sắp xếp dữ liệu lại như file đính kèm của mình thì mình sẽ có cách giúp bạn.
 

File đính kèm

Upvote 0
vậy nhờ bạn Hai Lúa Miền Tây giúp mình theo file mình đính kèm được không vậy?
mình cảm ơn trước!

Bạn dùng code sau nhé:

[GPECODE=sql]Sub LocTong_HLMT()
Dim adoConn As Object, adoRS As Object
Set adoConn = CreateObject("ADODB.Connection")
Set adoRS = CreateObject("ADODB.Recordset")
With adoConn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.FullName & _
";Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";"
.Open
End With
With adoRS
.ActiveConnection = adoConn
.Open "select f1,'',f4,f5,sum(f16),sum(f17),sum(f11) " _
& "from [THONG-KE$A5:R100] " _
& "group by f1,f4,f5 " _
& "having f1 is not null"
End With
With Sheet2
.[A5:G100].ClearContents
.[A5].CopyFromRecordset adoRS
End With
adoRS.Close
With adoRS
.ActiveConnection = adoConn
.Open "select f4,f5,sum(f16),sum(f17),sum(f11) " _
& "from [THONG-KE$A5:R100] " _
& "group by f4,f5 " _
& "having f4 is not null " _
& "order by right(f5,1),f5"
End With
With Sheet2
.[J5:N100].ClearContents
.[J5].CopyFromRecordset adoRS
End With
adoRS.Close
Set adoRS = Nothing
adoConn.Close: Set adoConn = Nothing

End Sub
[/GPECODE]
 

File đính kèm

Upvote 0
Cảm ơn bạn!
Mình muốn lúc ban đầu chưa có sheet PHAN-TICH, tạo xong BẢNG THỐNG KÊ thì ta tiến hành chạy macro sẽ tự tạo ra sheet PHAN-TICH và tính toán như code của bạn. kết hợp với kẻ và định dạng 2 bảng LỌC DỮ LIỆU và TỔNG HỢP.
và mình có thay đổi chút ở bảng TỔNG HỢP.
Nhờ bạn Hai Lúa Miền Tây xem giúp mình với.
Mình cảm ơn!
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bạn!
Mình muốn lúc ban đầu chưa có sheet PHAN-TICH, tạo xong BẢNG THỐNG KÊ thì ta tiến hành chạy macro sẽ tự tạo ra sheet PHAN-TICH và tính toán như code của bạn. kết hợp với kẻ và định dạng 2 bảng LỌC DỮ LIỆU và TỔNG HỢP.
và mình có thay đổi chút ở bảng TỔNG HỢP như file mình đính kèm.
Nhờ bạn Hai Lúa Miền Tây xem giúp mình với.
Mình cảm ơn!
Làm cho bạn phần chuyển dữ liệu, còn phần định dạng bạn tự làm nhé.
(Lưu ý là có điều chỉnh tiêu đề cột cho hợp lý)

[GPECODE=sql]Sub LocTong_HLMT()
On Error Resume Next
Dim adoConn As Object, adoRS As Object, fld, i As Integer, eR As Integer
Set adoConn = CreateObject("ADODB.Connection")
Set adoRS = CreateObject("ADODB.Recordset")
Application.DisplayAlerts = False
Sheets("PHAN-TICH").Delete
Sheets.Add
ActiveSheet.Name = "PHAN-TICH"
Application.DisplayAlerts = True
With adoConn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.FullName & _
";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
.Open
End With
With adoRS
.ActiveConnection = adoConn
.Open "select CK,'' as STT,QCT,SP,sum(CD) as [Tong CD],sum(TL) as [Tong TL],sum(DTS) as [Tong DTS] " _
& "from [THONG-KE$A4:R100] " _
& "group by CK,QCT,SP " _
& "having CK is not null"
End With
With Sheets("PHAN-TICH")
For Each fld In adoRS.Fields
i = i + 1
.Cells(4, i) = fld.Name
Next
.[A5].CopyFromRecordset adoRS
End With
adoRS.Close
With adoRS
.ActiveConnection = adoConn
.Open "select QCT,SP,sum(CD) as [Tong CD],sum(TL) as [Tong TL] " _
& "from [THONG-KE$A4:R100] " _
& "group by QCT,SP " _
& "having QCT is not null " _
& "order by right(SP,1),QCT"
End With
i = 0
With Sheets("PHAN-TICH")
For Each fld In adoRS.Fields
i = i + 1
.Cells(4, i + 9) = fld.Name
Next
.[J5].CopyFromRecordset adoRS
End With
adoRS.Close
With adoRS
.ActiveConnection = adoConn
.Open "select sum(DTS) as [Tong DTS] " _
& "from [THONG-KE$A4:R100]"
End With
With Sheets("PHAN-TICH")
eR = .Range("J65000").End(xlUp).Row + 1
.Range("K" & eR) = "Tong Cong"
.Range("K" & eR + 1) = "Tong DTS"
.Range("M" & eR).FormulaR1C1 = "=SUM(R[-" & eR - 5 & "]C:R[-1]C)"
.Range("L" & eR).FormulaR1C1 = "=SUM(R[-" & eR - 5 & "]C:R[-1]C)"
.Range("L" & eR + 1).CopyFromRecordset adoRS
.Cells.EntireColumn.AutoFit
End With
adoRS.Close: Set adoRS = Nothing
adoConn.Close: Set adoConn = Nothing

End Sub

[/GPECODE]
 

File đính kèm

Upvote 0
phần định dạng mình sẽ tự mày mò.
Mình cảm ơn nhiều!
 
Upvote 0
Em có 1 câu hỏi ngoài lề xíu : e đang nguyên cứu mảng, nhưng toàn để ý thấy là thầy Hai Lúa Miền Tây viết bằng ADO( Thầy Nu toàn dùng mảng ) , vậy cho e hỏi là giữa 2 thằng này thì ADO và mảng thì thằng nào cho tốc độ ngon hơn ạ, và học ADO có khó không ?( vì e nhìn vào code nó như 1 cái rừng - e có đọc ADO căn bản của Thầy Lê Văn Duyệt mà nó khó hiểu và nản nản sao sao ah )
 
Upvote 0
Em có 1 câu hỏi ngoài lề xíu : e đang nguyên cứu mảng, nhưng toàn để ý thấy là thầy Hai Lúa Miền Tây viết bằng ADO( Thầy Nu toàn dùng mảng ) , vậy cho e hỏi là giữa 2 thằng này thì ADO và mảng thì thằng nào cho tốc độ ngon hơn ạ, và học ADO có khó không ?( vì e nhìn vào code nó như 1 cái rừng - e có đọc ADO căn bản của Thầy Lê Văn Duyệt mà nó khó hiểu và nản nản sao sao ah )
Cũng còn tùy vào tình huống mỗi loại đều có thế mạnh riêng, ado kết hợp với arr sẽ cho ra kết quả tuyệt vời. Học ado không khó, nó còn dể hơn vba, nhưng nó không linh hoạt bằng vba. NẾu bạn biết kết hợp giữa vba và ado thì bạn sẽ giải quyết được nhiều việc lắm đó.
Bạn xem bài Bài tập về ADO căn bản. để hiểu thêm về ado nhé.
 
Upvote 0
Nhờ bạn Hai Lúa Miền Tây xem giúp, tất cả mình có viết trong file đính kèm.
Mình cảm ơn!
Bạn chỉnh lại code như sau, riêng phần định dạng bạn tự làm nhé.

[GPECODE=sql]Sub ModTongHopThepHinh()
On Error Resume Next
Dim adoConn As Object, adoRS As Object, fld, i As Integer, eR As Integer
Set adoConn = CreateObject("ADODB.Connection")
Set adoRS = CreateObject("ADODB.Recordset")
With adoConn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.FullName & _
";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
.Open
End With
With adoRS
.ActiveConnection = adoConn
.Open "select CK,CLT,QCT,sum(CD) as [TCD],sum(TL) as [TTL],sum(DTS) as [TDTS] " _
& "from [" & Sheet4.Name & "$A10:R500] " _
& "group by CK,CLT,QCT " _
& "having CK is not null"
End With
With Sheet4
.Range("U11:AF500").ClearContents
For Each fld In adoRS.Fields
i = i + 1
.Cells(10, i + 20) = fld.Name
Next
.[U11].CopyFromRecordset adoRS
End With
adoRS.Close
With adoRS
.ActiveConnection = adoConn
.Open "select '' as STT,CLT,QCT,sum(CD) as [TCD],sum(TL) as [TTL] " _
& "from [" & Sheet4.Name & "$A10:R500] " _
& "group by CLT,QCT " _
& "having CLT is not null " _
& "order by right(QCT,1),CLT"
End With
i = 0
With Sheet4
For Each fld In adoRS.Fields
i = i + 1
.Cells(10, i + 27) = fld.Name
Next
.[AB11].CopyFromRecordset adoRS
End With
adoRS.Close
With adoRS
.ActiveConnection = adoConn
.Open "select sum(DTS) as [TDTS] " _
& "from [" & Sheet4.Name & "$A10:R500]"
End With
With Sheet4
eR = .Range("AC65000").End(xlUp).Row + 1
.Range("AC" & eR) = "T" & ChrW(7892) & "NG C" & ChrW(7896) & "NG"
.Range("AC" & eR + 1) = "T" & ChrW(7892) & "NG DI" & ChrW(7878) & "N TÍCH S" & ChrW(416) & "N"
.Range("AE" & eR).FormulaR1C1 = "=SUM(R[-" & eR - 10 & "]C:R[-1]C)"
.Range("AF" & eR).FormulaR1C1 = "=SUM(R[-" & eR - 10 & "]C:R[-1]C)"
.Range("AE" & eR + 1).CopyFromRecordset adoRS
.Cells.EntireColumn.AutoFit
.Range("AB11:AB" & eR - 1).FormulaR1C1 = "=ROW()-10"
End With
adoRS.Close: Set adoRS = Nothing
adoConn.Close: Set adoConn = Nothing

End Sub
[/GPECODE]

P/S: Mai mốt đừng gọi đích danh mình để nhờ giúp nhé vì trên GPE có rất nhiều cao thủ, rủi mình không giúp được người khác biết được sẽ không giúp bạn đâu nhé.
 

File đính kèm

Upvote 0
Mình sẽ rút kinh nghiệm.
Cảm ơn bạn đã giúp và góp ý!
CHúc vui!

Mã:
                & "from ["& Sheet4.Name& "$A10:R500]"

Mình muốn code chạy trên sheet hiện hành thì thay đổi đoạn code trên như thế nào vậy bạn?
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Mình sẽ rút kinh nghiệm.
Cảm ơn bạn đã giúp và góp ý!
CHúc vui!

Mã:
                & "from ["& Sheet4.Name& "$A10:R500]"

Mình muốn code chạy trên sheet hiện hành thì thay đổi đoạn code trên như thế nào vậy bạn?

Bạn chỉnh lại thành:

Mã:
& "from [" & [B][COLOR=#ff0000]ActiveSheet.Name[/COLOR][/B] & "$A10:R500] " _
 
Upvote 0
Bạn chỉnh lại code như sau, riêng phần định dạng bạn tự làm nhé.

Cho mình hỏi với đoạn code này khi mình chuyển file thống kê của mình thành add-ins để dùng thì đoạn code ko phân tích được.
Có phải muốn chuyển sang add-ins thì cần thêm bớt gì ko vậy?
nhờ các bạn giúp.
Mình cảm ơn!
 
Upvote 0
Cho mình hỏi với đoạn code này khi mình chuyển file thống kê của mình thành add-ins để dùng thì đoạn code ko phân tích được.
Có phải muốn chuyển sang add-ins thì cần thêm bớt gì ko vậy?
nhờ các bạn giúp.
Mình cảm ơn!
Bạn thử code sau, xin lỗi vì chưa test thử.

[GPECODE=sql]Sub ModTongHopThepHinh()
On Error Resume Next
Dim adoConn As Object, adoRS As Object, fld, i As Integer, eR As Integer
Set adoConn = CreateObject("ADODB.Connection")
Set adoRS = CreateObject("ADODB.Recordset")
With adoConn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ActiveWorkbook.FullName & _
";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
.Open
End With
With adoRS
.ActiveConnection = adoConn
.Open "select CK,CLT,QCT,sum(CD) as [TCD],sum(TL) as [TTL],sum(DTS) as [TDTS] " _
& "from [" & ActiveSheet.Name & "$A10:R500] " _
& "group by CK,CLT,QCT " _
& "having CK is not null"
End With
With ActiveSheet
.Range("U11:AF500").ClearContents
For Each fld In adoRS.Fields
i = i + 1
.Cells(10, i + 20) = fld.Name
Next
.[U11].CopyFromRecordset adoRS
End With
adoRS.Close
With adoRS
.ActiveConnection = adoConn
.Open "select '' as STT,CLT,QCT,sum(CD) as [TCD],sum(TL) as [TTL] " _
& "from [" & ActiveSheet.Name & "$A10:R500] " _
& "group by CLT,QCT " _
& "having CLT is not null " _
& "order by right(QCT,1),CLT"
End With
i = 0
With ActiveSheet
For Each fld In adoRS.Fields
i = i + 1
.Cells(10, i + 27) = fld.Name
Next
.[AB11].CopyFromRecordset adoRS
End With
adoRS.Close
With adoRS
.ActiveConnection = adoConn
.Open "select sum(DTS) as [TDTS] " _
& "from [" & ActiveSheet.Name & "$A10:R500]"
End With
With ActiveSheet
eR = .Range("AC65000").End(xlUp).Row + 1
.Range("AC" & eR) = "T" & ChrW(7892) & "NG C" & ChrW(7896) & "NG"
.Range("AC" & eR + 1) = "T" & ChrW(7892) & "NG DI" & ChrW(7878) & "N TÍCH S" & ChrW(416) & "N"
.Range("AE" & eR).FormulaR1C1 = "=SUM(R[-" & eR - 10 & "]C:R[-1]C)"
.Range("AF" & eR).FormulaR1C1 = "=SUM(R[-" & eR - 10 & "]C:R[-1]C)"
.Range("AE" & eR + 1).CopyFromRecordset adoRS
.Cells.EntireColumn.AutoFit
.Range("AB11:AB" & eR - 1).FormulaR1C1 = "=ROW()-10"
End With
adoRS.Close: Set adoRS = Nothing
adoConn.Close: Set adoConn = Nothing

End Sub



[/GPECODE]
 
Upvote 0
Cả 2 đoạn code trước và sau đều sử dụng tốt ở file excel. còn khi mình chuyển thành add-ins thì sử dụng bị lỗi.
 
Lần chỉnh sửa cuối:
Upvote 0
Cả 2 đoạn code trước và sau đều sử dụng tốt ở file excel. còn khi mình chuyển thành add-ins thì sử dụng bị lỗi.

mình gửi file đính kèm.
ở add-ins thì chạy code tạo 1 bảng thống kê mới rồi sau đó chạy code tong hop.

Bạn bỏ dòng On Error Resume Next đi rồi test coi báo lỗi chổ nào nhé.
 
Upvote 0
Tôi test trên máy tôi chẳng có lỗi gì hết, hình bạn gửi nhỏ xíu tôi chẳng thấy gì.

Bạn sử dụng cái add-ins để test hay cái file excel?
Mình dùng sử dụng file excel thì chạy tốt còn với cái add-ins thì báo lỗi như trong hình trên.
Mình gửi lại hình bạn xem:
7c279810-3302-46c3-a7b1-f196033cb728_zpsaf52e151.jpg
 
Upvote 0
Có phải bạn chưa lưu file? Bạn nên lưu cái file Book1 đó vào ổ đĩa nó mới chạy được.
 
Upvote 0
Đúng là chưa lưu file nên ko chạy được code.
vậy để chạy code mà ko phải lưu file thì làm như thế nào?

ADO sẽ không chạy được nếu như bạn không lưu file, còn muốn chạy được mà không cần lưu file thì bạn dùng VBA, các cao thủ VBA khác sẽ giúp bạn.
 
Upvote 0
ADO sẽ không chạy được nếu như bạn không lưu file, còn muốn chạy được mà không cần lưu file thì bạn dùng VBA, các cao thủ VBA khác sẽ giúp bạn.

Mình hiểu rồi, vậy mình sẽ tạo thêm cho nó chức năng báo lưu file khi tạo file thống kê mới là ổn. :)
Chúc bạn vui vẻ!
 
Upvote 0
ADO sẽ không chạy được nếu như bạn không lưu file, còn muốn chạy được mà không cần lưu file thì bạn dùng VBA, các cao thủ VBA khác sẽ giúp bạn.

Thì Hai Lúa viết thêm 1 code Save tạm file ở đâu đó
Để kiểm tra xem đó có phải là file trắng mới tạo hay không, có thể dùng Activeworkbook.Path ---> Kết quả này = rổng nghĩa là file chưa lưu
 
Upvote 0
Thì Hai Lúa viết thêm 1 code Save tạm file ở đâu đó
Để kiểm tra xem đó có phải là file trắng mới tạo hay không, có thể dùng Activeworkbook.Path ---> Kết quả này = rổng nghĩa là file chưa lưu

Mình đang dùng tạm code sau để lưu khi tao file mới. có như vậy thì khi chạy tổng hợp sẽ ko bị báo lỗi chưa lưu file.

Mã:
Sub ModBTK_moi()Dim Num As Integer
Dim Sh As Worksheet
For Each Sh In ActiveWorkbook.Worksheets
   If InStr(1, Sh.Name, "BTK") Then
      Num = Num + 1
   End If
Next
ThisWorkbook.Sheets("BTK").Copy Before:=ActiveWorkbook.ActiveSheet
With ActiveWorkbook.ActiveSheet
  .Name = "BTK-" & Format(Num + 1, "00")
  .Visible = True
End With
    WbN = ThisWorkbook.Name
    anser = MsgBox("Kich 'OK' = Luu BTK moi")
    FileSaveAs = Application.GetSaveAsFilename("BTK moi.xls", "ExcelFiles (*.xls), *.xls", , "Chon thu muc va ten tap tin")
    If FileSaveAs = False Then 'neu kich 'Cancel'
        MsgBox "Ban vua huy bo.", , "!!!"
        ActiveWorkbook.Close False
        Exit Sub
    End If
    ActiveWorkbook.SaveAs FileSaveAs
    ActiveWorkbook.Save
    MsgBox "Da co the bat dau thong ke thep !", , "OK"
End Sub

hơi bất tiện chút vì nó bắt lưu ngay lúc ban đầu. nếu như khi chạy tổng hợp mới bắt lưu với bảng thông báo "Để đảm bảo an toàn, Bạn nên lưu bảng thống kê trước khi tiếp tục công việc" thì hay hơn.
 
Lần chỉnh sửa cuối:
Upvote 0
Với đoạn code của bạn Hai Lúa thì hôm nay mình dùng khá ổn. có điều mình chuyển bảng thống kê của mình sang add-ins để dùng nên mỗi lần tạo 1 bảng thống kê mới lại phải lưu mới chạy được nên hơi bất tiện.
Nên mình lại tiếp tục lên topic này để nhờ các bạn nào có thể giúp hiệu chỉnh lại đoạn code tổng hợp thép ở #5 sao cho khi chạy code thì sẽ hiện thông báo "Để đảm bảo an toàn, Bạn nên lưu bảng thống kê trước khi tiếp tục công việc" và tiến hành save lại. công tác save chỉ 1 lần đầu thôi, lần tạo bảng thống kê mới tiếp theo nếu kiểm tra save rồi thì thôi, nếu chưa save thì lại hiện thông báo như lúc ban đầu.
- Nếu bạn nào có thể giúp mình mà lại chuyên bên mảng VBA hơn thì nhờ giúp mình đoạn code VBA với nội dung như đoạn code ADO ở bài #5 với. (Vì nghe bạn Hai Lúa nói nếu dùng VBA thì sẽ bỏ qua đc bước save)
Mình cảm ơn!
 
Upvote 0
Với đoạn code của bạn Hai Lúa thì hôm nay mình dùng khá ổn. có điều mình chuyển bảng thống kê của mình sang add-ins để dùng nên mỗi lần tạo 1 bảng thống kê mới lại phải lưu mới chạy được nên hơi bất tiện.
Nên mình lại tiếp tục lên topic này để nhờ các bạn nào có thể giúp hiệu chỉnh lại đoạn code tổng hợp thép ở #5 sao cho khi chạy code thì sẽ hiện thông báo "Để đảm bảo an toàn, Bạn nên lưu bảng thống kê trước khi tiếp tục công việc" và tiến hành save lại. công tác save chỉ 1 lần đầu thôi, lần tạo bảng thống kê mới tiếp theo nếu kiểm tra save rồi thì thôi, nếu chưa save thì lại hiện thông báo như lúc ban đầu.
- Nếu bạn nào có thể giúp mình mà lại chuyên bên mảng VBA hơn thì nhờ giúp mình đoạn code VBA với nội dung như đoạn code ADO ở bài #5 với. (Vì nghe bạn Hai Lúa nói nếu dùng VBA thì sẽ bỏ qua đc bước save)
Mình cảm ơn!
Kiểm tra nếu file chưa được lưu vào ổ đĩa thì lưu vào ổ C với tên tương ứng của WB đó, ngược lại sẽ lưu file rồi mới chạy code.

[GPECODE=sql]Sub ModTongHopThepHinh()
On Error Resume Next
Dim adoConn As Object, adoRS As Object, fld, i As Integer, eR As Integer
Set adoConn = CreateObject("ADODB.Connection")
Set adoRS = CreateObject("ADODB.Recordset")
If InStr(ActiveWorkbook.FullName, ":\") = 0 Then
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs "C:\" & ActiveWorkbook.Name
Else
ActiveWorkbook.Save
Application.DisplayAlerts = True
End If
With adoConn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ActiveWorkbook.FullName & _
";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
.Open
End With
With adoRS
.ActiveConnection = adoConn
.Open "select CK,CLT,QCT,sum(CD) as [TCD],sum(TL) as [TTL],sum(DTS) as [TDTS] " _
& "from [" & ActiveSheet.Name & "$A10:R500] " _
& "group by CK,CLT,QCT " _
& "having CK is not null"
End With
With ActiveSheet
.Range("U11:AF500").ClearContents
For Each fld In adoRS.Fields
i = i + 1
.Cells(10, i + 20) = fld.Name
Next
.[U11].CopyFromRecordset adoRS
End With
adoRS.Close
With adoRS
.ActiveConnection = adoConn
.Open "select '' as STT,CLT,QCT,sum(CD) as [TCD],sum(TL) as [TTL] " _
& "from [" & ActiveSheet.Name & "$A10:R500] " _
& "group by CLT,QCT " _
& "having CLT is not null " _
& "order by right(QCT,1),CLT"
End With
i = 0
With ActiveSheet
For Each fld In adoRS.Fields
i = i + 1
.Cells(10, i + 27) = fld.Name
Next
.[AB11].CopyFromRecordset adoRS
End With
adoRS.Close
With adoRS
.ActiveConnection = adoConn
.Open "select sum(DTS) as [TDTS] " _
& "from [" & ActiveSheet.Name & "$A10:R500]"
End With
With ActiveSheet
eR = .Range("AC65000").End(xlUp).Row + 1
.Range("AC" & eR) = "T" & ChrW(7892) & "NG C" & ChrW(7896) & "NG"
.Range("AC" & eR + 1) = "T" & ChrW(7892) & "NG DI" & ChrW(7878) & "N TÍCH S" & ChrW(416) & "N"
.Range("AE" & eR).FormulaR1C1 = "=SUM(R[-" & eR - 11 & "]C:R[-1]C)"
.Range("AF" & eR).FormulaR1C1 = "=SUM(R[-" & eR - 11 & "]C:R[-1]C)"
.Range("AE" & eR + 1).CopyFromRecordset adoRS
' .Cells.EntireColumn.AutoFit
.Range("AB11:AB" & eR - 1).FormulaR1C1 = "=ROW()-10"
End With
adoRS.Close: Set adoRS = Nothing
adoConn.Close: Set adoConn = Nothing

End Sub

[/GPECODE]

Em làm theo cách này mà ko được bác ạ
bác có yahoo ko ạ
Bạn làm như thế nào mà không được?
 
Upvote 0
Chán vãi mấy chứ này
Làm gần hết cả rồi, chỉ còn có tí xíu ---> Nhìn vào cái dòng báo lỗi màu vàng cũng đoán được chứ

Những thành viên lên diễn đàn để hỏi hoặc để nhờ sự giúp đỡ gồm có 3 phần:
1. Biết nhiều (Dĩ nhiên những thành viên này thì ít khi hỏi mà chủ yếu là hỗ trợ các thành viên khác)
1. Biết ít
2. Không biết (và Dĩ nhiên đây là phần hỏi cực kỳ nhiều và đếm đến ko ít phiền toái, vì đơn giản họ không biết gì về cái họ muốn tìm hiểu, nhưng được cái họ rất muốn tìm hiểu)
Nếu như một người không biết chút gì về code thử hỏi họ có thể can thiệp vào được không? vì trước mắt họ như 1 đám rừng.
Hy vọng bạn hiểu.
Cảm ơn vì góp ý của bạn!
Chúc vui!
 
Upvote 0
Những thành viên lên diễn đàn để hỏi hoặc để nhờ sự giúp đỡ gồm có 3 phần:
1. Biết nhiều (Dĩ nhiên những thành viên này thì ít khi hỏi mà chủ yếu là hỗ trợ các thành viên khác)
1. Biết ít
2. Không biết (và Dĩ nhiên đây là phần hỏi cực kỳ nhiều và đếm đến ko ít phiền toái, vì đơn giản họ không biết gì về cái họ muốn tìm hiểu, nhưng được cái họ rất muốn tìm hiểu)
Nếu như một người không biết chút gì về code thử hỏi họ có thể can thiệp vào được không? vì trước mắt họ như 1 đám rừng.
Hy vọng bạn hiểu.
Cảm ơn vì góp ý của bạn!
Chúc vui!

Tôi học VBA cũng bắt đầu từ con số 0... Tôi kém thông minh nhưng được cái tôi "chịu cày"
Những cái nhỏ nhỏ thì cứ tự nghiên cứu ---> Suy đoán, chính sửa, thí nghiệm và rút ra kết luận
Visual Basic được cái là thân thiện với người dùng, lỗi ở đâu nó chỉ chính xác tại đó, đồng thời có câu thông báo lỗi ----> Đọc xem nó nói gì để mà sửa. Thế thôi
Cái quỷ gì cũng hỏi thì đến kiếp nào mới mong tự mình làm được đây
-------------
Tôi nói thế không có ý phê phán gì bạn mà để bạn rút kinh nghiệm... Bạn cứ tự mình chỉnh sửa code, chỉnh lung tung gì đó (theo suy đoán) dù chẳng chạy được thì ít ra bạn cũng không thẹn với lòng vì mình đã làm hết khả năng... Thêm nữa, nếu tự sửa mà chưa chạy thì vẫn còn các thành viên khác trợ giúp
(oải nhất là cái gì lỗi cũng la làng)
 
Upvote 0
Tôi học VBA cũng bắt đầu từ con số 0... Tôi kém thông minh nhưng được cái tôi "chịu cày"
Những cái nhỏ nhỏ thì cứ tự nghiên cứu ---> Suy đoán, chính sửa, thí nghiệm và rút ra kết luận
Visual Basic được cái là thân thiện với người dùng, lỗi ở đâu nó chỉ chính xác tại đó, đồng thời có câu thông báo lỗi ----> Đọc xem nó nói gì để mà sửa. Thế thôi
Cái quỷ gì cũng hỏi thì đến kiếp nào mới mong tự mình làm được đây
-------------
Tôi nói thế không có ý phê phán gì bạn mà để bạn rút kinh nghiệm... Bạn cứ tự mình chỉnh sửa code, chỉnh lung tung gì đó (theo suy đoán) dù chẳng chạy được thì ít ra bạn cũng không thẹn với lòng vì mình đã làm hết khả năng... Thêm nữa, nếu tự sửa mà chưa chạy thì vẫn còn các thành viên khác trợ giúp
(oải nhất là cái gì lỗi cũng la làng)

Cảm ơn bạn!
Mình sẽ rút kinh nghiệm.
 
Upvote 0
Kiểm tra nếu file chưa được lưu vào ổ đĩa thì lưu vào ổ C với tên tương ứng của WB đó, ngược lại sẽ lưu file rồi mới chạy code.

[GPECODE=sql]Sub ModTongHopThepHinh()
On Error Resume Next
Dim adoConn As Object, adoRS As Object, fld, i As Integer, eR As Integer
Set adoConn = CreateObject("ADODB.Connection")
Set adoRS = CreateObject("ADODB.Recordset")
If InStr(ActiveWorkbook.FullName, ":\") = 0 Then
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs "C:\" & ActiveWorkbook.Name
Else
ActiveWorkbook.Save
Application.DisplayAlerts = True
End If
With adoConn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ActiveWorkbook.FullName & _
";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
.Open
End With
With adoRS
.ActiveConnection = adoConn
.Open "select CK,CLT,QCT,sum(CD) as [TCD],sum(TL) as [TTL],sum(DTS) as [TDTS] " _
& "from [" & ActiveSheet.Name & "$A10:R500] " _
& "group by CK,CLT,QCT " _
& "having CK is not null"
End With
With ActiveSheet
.Range("U11:AF500").ClearContents
For Each fld In adoRS.Fields
i = i + 1
.Cells(10, i + 20) = fld.Name
Next
.[U11].CopyFromRecordset adoRS
End With
adoRS.Close
With adoRS
.ActiveConnection = adoConn
.Open "select '' as STT,CLT,QCT,sum(CD) as [TCD],sum(TL) as [TTL] " _
& "from [" & ActiveSheet.Name & "$A10:R500] " _
& "group by CLT,QCT " _
& "having CLT is not null " _
& "order by right(QCT,1),CLT"
End With
i = 0
With ActiveSheet
For Each fld In adoRS.Fields
i = i + 1
.Cells(10, i + 27) = fld.Name
Next
.[AB11].CopyFromRecordset adoRS
End With
adoRS.Close
With adoRS
.ActiveConnection = adoConn
.Open "select sum(DTS) as [TDTS] " _
& "from [" & ActiveSheet.Name & "$A10:R500]"
End With

With ActiveSheet
eR = .Range("AC65000").End(xlUp).Row + 1
.Range("AC" & eR) = "T" & ChrW(7892) & "NG C" & ChrW(7896) & "NG"
.Range("AC" & eR + 1) = "T" & ChrW(7892) & "NG DI" & ChrW(7878) & "N TÍCH S" & ChrW(416) & "N"
.Range("AE" & eR).FormulaR1C1 = "=SUM(R[-" & eR - 11 & "]C:R[-1]C)"
.Range("AF" & eR).FormulaR1C1 = "=SUM(R[-" & eR - 11 & "]C:R[-1]C)"
.Range("AE" & eR + 1).CopyFromRecordset adoRS
' .Cells.EntireColumn.AutoFit
.Range("AB11:AB" & eR - 1).FormulaR1C1 = "=ROW()-10"
End With
adoRS.Close: Set adoRS = Nothing
adoConn.Close: Set adoConn = Nothing

End Sub

[/GPECODE]

E mò mẫm phân tích đoạn code của a Hai Lúa, người biết nhìn qua là rõ ngay, còn e ko biết ngồi mò cái đoạn code này hơn nữa giờ mới rõ được chút chút :)
e có 2 vấn đề nhờ các a nào biết giúp e:
1. Vấn đề là ở phần code tô màu đỏ là đoạn tính tổng diện tích sơn, vậy cho e hỏi giờ e muốn khai báo thêm phần tính tổng khối lượng que hàn (ví dụ cột que hàn nằm ở cột L bên bảng thống kê, còn diện tích sơn nằm ở cột M) thì e phải thêm đoạn code như thế nào?
2. Khi chạy đoạn code này nếu bên bảng thống kê ko có dữ liệu thì nó sẽ báo lỗi, nhờ các a sửa lại giúp e nếu chạy đoạn code này mà bên bảng thống kê ko có dữ liệu thì vẫn không báo lỗi và hiện ra 1 bảng thông báo "Chưa có dữ liệu ở bảng thống kê"
e cảm ơn!
 
Lần chỉnh sửa cuối:
Upvote 0
E mò mẫm phân tích đoạn code của a Hai Lúa, người biết nhìn qua là rõ ngay, còn e ko biết ngồi mò cái đoạn code này hơn nữa giờ mới rõ được chút chút :)
e có 2 vấn đề nhờ các a nào biết giúp e:
1. Vấn đề là ở phần code tô màu đỏ là đoạn tính tổng diện tích sơn, vậy cho e hỏi giờ e muốn khai báo thêm phần tính tổng khối lượng que hàn (ví dụ cột que hàn nằm ở cột L bên bảng thống kê, còn diện tích sơn nằm ở cột M) thì e phải thêm đoạn code như thế nào?
2. Khi chạy đoạn code này nếu bên bảng thống kê ko có dữ liệu thì nó sẽ báo lỗi, nhờ các a sửa lại giúp e nếu chạy đoạn code này mà bên bảng thống kê ko có dữ liệu thì vẫn không báo lỗi và hiện ra 1 bảng thông báo "Chưa có dữ liệu ở bảng thống kê"
e cảm ơn!

Cho cái file mới + kèm với code của bạn lên mình test thử nhé.
 
Upvote 0
Phần ô màu vàng là phần e muốn bổ sung thêm, và có phần comment kèm theo để a dễ hình dung
a xem giúp e
e cảm ơn!
Bạn dùng code sau thử nhé.

[GPECODE=sql]Sub ModTongHopThepHinh()
On Error Resume Next
Dim adoConn As Object, adoRS As Object, fld, i As Integer, eR As Integer
Set adoConn = CreateObject("ADODB.Connection")
Set adoRS = CreateObject("ADODB.Recordset")
With adoConn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ActiveWorkbook.FullName & _
";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
.Open
End With
With adoRS
.ActiveConnection = adoConn
.Open "select CK,CLT,QCT,sum(CD) as [TCD],sum(TL) as [TTL],sum(qh) as TQH,sum(DTS) as [TDTS] " _
& "from [" & ActiveSheet.Name & "$A10:T500] " _
& "group by CK,CLT,QCT " _
& "having CK is not null"
End With
With ActiveSheet
.Range("U11:AF500").ClearContents
For Each fld In adoRS.Fields
i = i + 1
.Cells(10, i + 20) = fld.Name
Next
.[U11].CopyFromRecordset adoRS
End With
adoRS.Close
With adoRS
.ActiveConnection = adoConn
.Open "select '' as STT,CLT,QCT,sum(CD) as [TCD],sum(TL) as [TTL] " _
& "from [" & ActiveSheet.Name & "$A10:T500] " _
& "group by CLT,QCT " _
& "having CLT is not null " _
& "order by right(QCT,1),CLT"
End With
i = 0
With ActiveSheet
For Each fld In adoRS.Fields
i = i + 1
.Cells(10, i + 27) = fld.Name
Next
.[AB11].CopyFromRecordset adoRS
End With
adoRS.Close
With adoRS
.ActiveConnection = adoConn
.Open "select sum(DTS) as [TDTS] " _
& "from [" & ActiveSheet.Name & "$A10:T500]"
End With

With ActiveSheet
eR = .Range("AC65000").End(xlUp).Row + 1
.Range("AC" & eR) = "T" & ChrW(7892) & "NG C" & ChrW(7896) & "NG"
.Range("AC" & eR + 1) = "T" & ChrW(7892) & "NG DI" & ChrW(7878) & "N TÍCH S" & ChrW(416) & "N"
.Range("AC" & eR + 2) = "T" & ChrW(7892) & "NG C" & ChrW(7896) & "NG QUE HÀN"
.Range("AE" & eR).FormulaR1C1 = "=SUM(R[-" & eR - 11 & "]C:R[-1]C)"
.Range("AF" & eR).FormulaR1C1 = "=SUM(R[-" & eR - 11 & "]C:R[-1]C)"
.Range("AE" & eR + 1).CopyFromRecordset adoRS
' .Cells.EntireColumn.AutoFit
.Range("AB11:AB" & eR - 1).FormulaR1C1 = "=ROW()-10"
adoRS.Close
With adoRS
.ActiveConnection = adoConn
.Open "select sum(QH) as [TQH] " _
& "from [" & ActiveSheet.Name & "$A10:T500]"
End With
.Range("AE" & eR + 2).CopyFromRecordset adoRS
End With
adoRS.Close: Set adoRS = Nothing
adoConn.Close: Set adoConn = Nothing

End Sub

[/GPECODE]
 
Upvote 0
Lúc đầu e thử copy thêm đoạn code từ [TDTS] xuống bên dưới và thay bằng [TQH] thì chạy ko được. hóa ra phải thêm "adoRS.Close" ở trước thì mới được hả a?
a có thể giúp e hiểu hơn cái đoạn "adoRS.Close" có tác dụng gì ko a? e chỉ biết là nó đóng thôi :)
Cảm ơn a!
 
Lần chỉnh sửa cuối:
Upvote 0
Lúc đầu e thử copy thêm đoạn code từ [TDTS] xuống bên dưới và thay bằng [TQH] thì chạy ko được. hóa ra phải thêm "adoRS.Close" ở trước thì mới được hả a?
a có thể giúp e hiểu hơn cái đoạn "adoRS.Close" có tác dụng gì ko a? e chỉ biết là nó đóng thôi :)

E có file đính kèm nhờ a xem giúp e.
Cảm ơn a!

Bạn test thử code sau:

[GPECODE=sql]Sub ModTongHopThepHinh()
'On Error Resume Next
Dim adoConn As Object, adoRS As Object, fld, i As Integer, eR As Integer
Set adoConn = CreateObject("ADODB.Connection")
Set adoRS = CreateObject("ADODB.Recordset")
If InStr(ActiveWorkbook.FullName, ":\") = 0 Then
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs "F:\" & ActiveWorkbook.Name
Else
ActiveWorkbook.Save
Application.DisplayAlerts = True
End If
With adoConn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ActiveWorkbook.FullName & _
";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
.Open
End With
With adoRS
.ActiveConnection = adoConn
.Open "select CK,CLT,QCT,sum(CD) as [TCD],sum(TL) as [TTL],sum(QH) as [TQH],sum(DTS) as [TDTS] " _
& "from [" & ActiveSheet.Name & "$A10:S500] " _
& "group by CK,CLT,QCT " _
& "having CK is not null"
End With
With ActiveSheet
.Range("V11:AH500").UnMerge
.Range("V11:AH500").Delete xlUp
For Each fld In adoRS.Fields
i = i + 1
.Cells(10, i + 21) = fld.Name
Next
.[V11].CopyFromRecordset adoRS
End With
adoRS.Close
With adoRS
.ActiveConnection = adoConn
.Open "select '' as STT,CLT,QCT,sum(CD) as [TCD],sum(TL) as [TTL] " _
& "from [" & ActiveSheet.Name & "$A10:S500] " _
& "group by CLT,QCT " _
& "having CLT is not null " _
& "order by left(CLT,1),CLT,right(QCT,1),right(QCT,2),right(QCT,3)"
End With
If adoRS.EOF Then
MsgBox "Khong co du lieu o BTK, vui long kiem tra lai", vbCritical
ActiveWorkbook.Close (True)
End If
i = 0
With ActiveSheet
For Each fld In adoRS.Fields
i = i + 1
.Cells(10, i + 29) = fld.Name
Next
.[AD11].CopyFromRecordset adoRS
End With
adoRS.Close
With adoRS
.ActiveConnection = adoConn
.Open "select CLT,sum(TL) as [TKLCL] " _
& "from [" & ActiveSheet.Name & "$A10:S500] " _
& "group by CLT " _
& "having CLT is not null " _
& "order by left(CLT,1)"
End With
i = 0
With ActiveSheet
For Each fld In adoRS.Fields
i = i + 1
.Cells(10, i + 36) = fld.Name
Next
.[AK11].CopyFromRecordset adoRS
End With

adoRS.Close
With adoRS
.ActiveConnection = adoConn
.Open "select sum(DTS) as [TDTS] " _
& "from [" & ActiveSheet.Name & "$A10:S500]"
End With
With ActiveSheet
eR = .Range("AE65000").End(xlUp).Row + 1
.Range("AE" & eR) = "T" & ChrW(7892) & "NG C" & ChrW(7896) & "NG"
.Range("AE" & eR + 1) = "T" & ChrW(7892) & "NG DI" & ChrW(7878) & "N TÍCH S" & ChrW(416) & "N (m2)"
.Range("AE" & eR + 2) = "T" & ChrW(7892) & "NG K. L" & ChrW(431) & ChrW(7906) & "NG QUE HÀN (kg)"
.Range("AG" & eR).FormulaR1C1 = "=SUM(R[-" & eR - 11 & "]C:R[-1]C)"
.Range("AH" & eR).FormulaR1C1 = "=SUM(R[-" & eR - 11 & "]C:R[-1]C)"
.Range("AG" & eR + 1).CopyFromRecordset adoRS
' .Cells.EntireColumn.AutoFit
.Range("AD11:AD" & eR - 1).FormulaR1C1 = "=ROW()-10"
adoRS.Close
With adoRS
.ActiveConnection = adoConn
.Open "select sum(QH) as [TQH] " _
& "from [" & ActiveSheet.Name & "$A10:S500]"
End With
.Range("AH" & eR + 2).CopyFromRecordset adoRS
End With
adoRS.Close: Set adoRS = Nothing
adoConn.Close: Set adoConn = Nothing

End Sub

[/GPECODE]

a có thể giúp e hiểu hơn cái đoạn "adoRS.Close" có tác dụng gì ko a? e chỉ biết là nó đóng thôi :)

Cảm ơn a!
Khi thực hiện mở 1 adoRS xong ta phải đóng nó lại rồi mới tiếp tục mở thêm cái mới.
 
Lần chỉnh sửa cuối:
Upvote 0
Nhìn cái code hoa cả mắt.
Cần hỗ trợ gì khác e sẽ lập topic mới.
Cảm ơn a nhiều!
 
Upvote 0
anh chị ơi nếu lọc dữ liệu từ cột này sang cột khác những dữ liệu bằng không thì không thể hiện những dữ liệu có giá trị thì được thể hiện và được sắp xếp lại .xin cảm ơn ạ
 
Upvote 0
anh chị ơi nếu lọc dữ liệu từ cột này sang cột khác những dữ liệu bằng không thì không thể hiện những dữ liệu có giá trị thì được thể hiện và được sắp xếp lại .xin cảm ơn ạ

Bạn đưa File cụ thể lên xem thế nào.
 
Upvote 0
Mình cũng rất quan tâm đến vụ code dò tìm này nhưng gà quá không làm được. Có bác nào rãnh giúp tôi với. Đa tạ rất rất nhiều (Cũng muốn tạo cái file để phục vụ công vc nhưng trình về excel kém quá mới lò dò làm việc với Hàm được thôi chứ code mù tịt, nhưng hàm nhiều khi khó làm và lỗi tùm lung, chậm-Bác nào có ý tưởng để công vc làm hs nhanh hơn nữa chỉ luôn mình với nhé)
 

File đính kèm

Upvote 0

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

Back
Top Bottom