Doanh7
Thành viên mới

- Tham gia
- 13/7/16
- Bài viết
- 32
- Được thích
- 2
Hình như trong file số lượng nhập không hẳn là lấy 1 dòng cũng không phải lấy tất cả thì phảiTham khảo File đính kèm:
1. Nếu "ngày" & "Tên Sản phẩm" của các dòng giống nhau
-> Thì "số lượng nhập" chỉ lấy của 1 dòng, nhưng số lượng lỗi thì lấy của tất.
"Tham khảo kết quả mong muốn bên trên"
"Lấy số lượng nhập của 1 dòng trong một ngày của một sản phẩm".Hình như trong file số lượng nhập không hẳn là lấy 1 dòng cũng không phải lấy tất cả thì phải
Trong file nếu để được kết quả số lượng nhập thì phải cộng 1 dòng của ngày 1 và 1 dòng của ngày 2 thì mới đúng là 1100 như trong file ghi đó bác,nên mới khó hiểu là rõ là điều kiện là phân theo ngày và sản phẩm sao lại cộng hai ngày với nhau được.còn chỉ tính sp A của ngày 1 số lượng nhập là 400 ,ngày hai là 2000"Lấy số lượng nhập của 1 dòng trong một ngày của một sản phẩm".
Tức là:Trong file nếu để được kết quả số lượng nhập thì phải cộng 1 dòng của ngày 1 và 1 dòng của ngày 2 thì mới đúng là 1100 như trong file ghi đó bác,nên mới khó hiểu là rõ là điều kiện là phân theo ngày và sản phẩm sao lại cộng hai ngày với nhau được.còn chỉ tính sp A của ngày 1 số lượng nhập là 400 ,ngày hai là 2000
hơi châm tiêu,giờ thì đã hiểu rồi bácTức là:
1/ "Lấy số lượng nhập của 1 dòng trong một ngày của một sản phẩm".
2/ Có bao nhiêu ngày nhập sản phẩm đó thì tính tổng số lượng nhập lại.
Đúng ý em đó bác.Tức là:
1/ "Lấy số lượng nhập của 1 dòng trong một ngày của một sản phẩm".
2/ Có bao nhiêu ngày nhập sản phẩm đó thì tính tổng số lượng nhập lại.
Đúng ý em đó bác.
Không cần số chứng từ vì chắc chắc 1 ngày 1 sp chỉ xuất hiện 1 lần (data này được xử lý 1 lần rồi)
-> có cách nào không bác
Option Explicit
Sub Tong_Hop()
Dim SQL(), KQ()
Dim i As Long, K As Long, Rws As Long, DK As String, MH As String, Date1 As Date
Dim Dic As Object
Set Dic = CreateObject("Scripting.Dictionary")
With Sheet1
SQL = .Range("C4", .Range("C" & Rows.Count).End(xlUp)).Resize(, 5).Value
ReDim KQ(1 To UBound(SQL), 1 To 4)
For i = 1 To UBound(SQL)
MH = Trim(SQL(i, 2))
DK = Trim(SQL(i, 1)) & Trim(SQL(i, 2))
If Not Dic.exists(MH) Then
K = K + 1
Dic.Add MH, K
Dic.Add DK, SQL(i, 1)
KQ(K, 1) = SQL(i, 2)
KQ(K, 2) = SQL(i, 3)
KQ(K, 3) = SQL(i, 5)
Else
Rws = Dic.Item(MH)
Date1 = Dic.Item(DK)
KQ(Rws, 3) = KQ(Rws, 3) + SQL(i, 5)
If SQL(i, 1) <> Date1 Then
KQ(Rws, 2) = KQ(Rws, 2) + SQL(i, 3)
Dic.Item(DK) = Dic.Item(DK) & SQL(i, 1)
End If
End If
Next
For i = 1 To K
KQ(i, 4) = KQ(i, 3) / KQ(i, 2)
Next
.Range("L18").Resize(K, 4) = KQ
End With
Set Dic = Nothing
End Sub
VBA Excel không có SQL. Khỏi nói chuyện giải quyết....
-> SQL trong VBA Excel có các giải quyết yêu cầu này không ạ?
Thử code sau, tôi không chắc là sẽ đúng yêu cầu của bạn.View attachment 251803
Nhờ các bác giúp em
Tham khảo File đính kèm:
1. Nếu "ngày" & "Tên Sản phẩm" của các dòng giống nhau
-> Thì "số lượng nhập" chỉ lấy của 1 dòng, nhưng số lượng lỗi thì lấy của tất.
"Tham khảo kết quả mong muốn bên trên"
-> SQL trong VBA Excel có các giải quyết yêu cầu này không ạ?
Sub LayDL_HLMT1()
With CreateObject("ADODB.Connection")
.Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=""Excel 12.0 Xml;HDR=No"";Data Source=" & ThisWorkbook.FullName
Sheet1.Range("L17").CopyFromRecordset .Execute("Select F2,Sum(F3),Sum(F5),Sum(F5)/Sum(F3) From (Select Distinct F2,F3,0 As F5 from [Sheet1$A4:G15] Union All Select F2,0,Sum(F5) from [Sheet1$A4:G15] Group By F2) Group By F2")
End With
End Sub
Góp vui luôn đi bácDữ liệu này nếu sắp xếp Key1 =tên sản phẩm, Key2 = ngày thì code không cần dùng Dic.
Sub xxx()
Dim cn As New Connection, rs As New Recordset, s As String
s = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=""Excel 12.0 Xml;HDR=No"";Data Source=" & ThisWorkbook.FullName
cn.Open s
s = "SELECT Ten,sum(SLN) as SLN,sum(SoLoi) as SoLoi,sum(SoLoi)/sum(SLN) as TyLe FROM (SELECT F2 as Ten,max(F3) as SLN,sum(F5) as SoLoi FROM [Sheet1$C4:G15] GROUP BY F1,F2) GROUP BY Ten"
rs.Open s, cn
Sheet1.Range("A20").CopyFromRecordset rs
rs.Close
cn.Close
End Sub
Cái này dùng Pivot cũng được ạ. Chỗ công thức item ấy ạ, add được thêm cột công thứcView attachment 251803
Nhờ các bác giúp em
Tham khảo File đính kèm:
1. Nếu "ngày" & "Tên Sản phẩm" của các dòng giống nhau
-> Thì "số lượng nhập" chỉ lấy của 1 dòng, nhưng số lượng lỗi thì lấy của tất.
"Tham khảo kết quả mong muốn bên trên"
-> SQL trong VBA Excel có các giải quyết yêu cầu này không ạ?
Nó là sql - ADODB đó bácVBA Excel không có SQL. Khỏi nói chuyện giải quyết.
Chỉ khi dùng đến ADODB thì cái COM này nó mới dùng SQL để truy vấn dữ liệu.
Code này thì chương trình sẽ rất chậm.Vậy thử code nàyMã:Option Explicit Sub Tong_Hop() Dim SQL(), KQ() Dim i As Long, K As Long, Rws As Long, DK As String, MH As String, Date1 As Date Dim Dic As Object Set Dic = CreateObject("Scripting.Dictionary") With Sheet1 SQL = .Range("C4", .Range("C" & Rows.Count).End(xlUp)).Resize(, 5).Value ReDim KQ(1 To UBound(SQL), 1 To 4) For i = 1 To UBound(SQL) MH = Trim(SQL(i, 2)) DK = Trim(SQL(i, 1)) & Trim(SQL(i, 2)) If Not Dic.exists(MH) Then K = K + 1 Dic.Add MH, K Dic.Add DK, SQL(i, 1) KQ(K, 1) = SQL(i, 2) KQ(K, 2) = SQL(i, 3) KQ(K, 3) = SQL(i, 5) Else Rws = Dic.Item(MH) Date1 = Dic.Item(DK) KQ(Rws, 3) = KQ(Rws, 3) + SQL(i, 5) If SQL(i, 1) <> Date1 Then KQ(Rws, 2) = KQ(Rws, 2) + SQL(i, 3) Dic.Item(DK) = Dic.Item(DK) & SQL(i, 1) End If End If Next For i = 1 To K KQ(i, 4) = KQ(i, 3) / KQ(i, 2) Next .Range("L18").Resize(K, 4) = KQ End With Set Dic = Nothing End Sub
Cái e hỏi chỉ là 1 mắt xích trong các câu lệnh tính toán sql khác(còn nhiều sự kết hợp khác) nên em cần giải quyết bằng SQL.
Cùng file, dùng mảng tốc độ nhanh hơn ADO, Chỉnh code bài #12 tí xíuNó là sql - ADODB đó bác
Bài đã được tự động gộp:
Code này thì chương trình sẽ rất chậm.
* data đến vài nghìn dòng
* yêu cầu trên chỉ 1 mắt xích trong câu lệch tổng thể
Bài đã được tự động gộp:
Cái e hỏi chỉ là 1 mắt xích trong các câu lệnh tính toán sql khác(còn nhiều sự kết hợp khác) nên em cần giải quyết bằng SQL.
e có nghĩ ra cách làm 1 cột phụ số lượng xuất hiện của mỗi sp, trong câu lệnh sql sẽ chia cho cộ này. Nhưng e muốn xem có cánh nào khac hay hơn khoing
Sub LayDL()
Dim strSQL$
With CreateObject("ADODB.Connection")
.Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=""Excel 12.0 Xml;HDR=No"";Data Source=" & ThisWorkbook.FullName
strSQL = "(Select Distinct F1 & ""_"" & F2 as t1 ,F3 as t2 ,0 As t3 from [Sheet1$A4:G15] Union All " & _
"Select F1 & ""_"" & F2,0,Sum(F5) from [Sheet1$A4:G15] Group By F1 & ""_"" & F2)"
strSQL = "Select Right(t1,1) ,Sum(t2) as a2,Sum(t3) as a3 ,a3/a2 From " & strSQL & " Group By right(t1,1)"
Sheet1.Range("L17").CopyFromRecordset .Execute(strSQL)
End With
End Sub
Cho em hỏi chút là sao trong lệnh tìm kiếm mình cứ F1, F2, F3....Em không hiểu vì thường SQL là lấy tiêu đề còn ở đây các F này là gì ạ ?Cùng file, dùng mảng tốc độ nhanh hơn ADO, Chỉnh code bài #12 tí xíu
Mã:Sub LayDL() Dim strSQL$ With CreateObject("ADODB.Connection") .Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=""Excel 12.0 Xml;HDR=No"";Data Source=" & ThisWorkbook.FullName strSQL = "(Select Distinct F1 & ""_"" & F2 as t1 ,F3 as t2 ,0 As t3 from [Sheet1$A4:G15] Union All " & _ "Select F1 & ""_"" & F2,0,Sum(F5) from [Sheet1$A4:G15] Group By F1 & ""_"" & F2)" strSQL = "Select Right(t1,1) ,Sum(t2) as a2,Sum(t3) as a3 ,a3/a2 From " & strSQL & " Group By right(t1,1)" Sheet1.Range("L17").CopyFromRecordset .Execute(strSQL) End With End Sub