Tìm giá trị NHỎ NHẤT sau khi tính các giá trị SUM theo điều kiện ngày tháng

Liên hệ QC

anhtb82

Thành viên mới
Tham gia
11/11/15
Bài viết
45
Được thích
9
Chào mọi người, rất mong được sự giúp đỡ của mọi người.

Em đang có một bài toán tìm giá trị MIN sau khi đã tính được nhiều giá trị TỔNG khác nhau theo điều kiện ngày tháng đối với từng mã hàng bằng thông tin trong Sheet "DATA".

Cứ 3 ngày sẽ tính tổng cho mã hàng 1 lần, và cuối cùng tính giá trị MIN đối với các tổng vừa tìm được.

Hình ảnh cho mọi người xem qua
1602747724134.png
Rất mong được sự chỉ giúp của các cao nhân và các bậc tiền bối ạ.
 

File đính kèm

  • Example.xlsx
    817.3 KB · Đọc: 17
Chào mọi người, rất mong được sự giúp đỡ của mọi người.

Em đang có một bài toán tìm giá trị MIN sau khi đã tính được nhiều giá trị TỔNG khác nhau theo điều kiện ngày tháng đối với từng mã hàng bằng thông tin trong Sheet "DATA".

Cứ 3 ngày sẽ tính tổng cho mã hàng 1 lần, và cuối cùng tính giá trị MIN đối với các tổng vừa tìm được.

Hình ảnh cho mọi người xem qua
View attachment 247468
Rất mong được sự chỉ giúp của các cao nhân và các bậc tiền bối ạ.
Tại sheet copy ô I2=MIN(IF(DATA!$A$2:$A$29343=Copy!A2,DATA!$D$2:$D$29343)) kết thúc bằng Ctrl + shift + Enter
Có lẽ đúng ý bạn
 
Upvote 0
Tại sheet copy ô I2=MIN(IF(DATA!$A$2:$A$29343=Copy!A2,DATA!$D$2:$D$29343)) kết thúc bằng Ctrl + shift + Enter
Có lẽ đúng ý bạn
Cảm ơn bạn nhwung cái đó thì chỉ tính giá trị MIN theo 1 ngày thôi bác ơi, đây mình muốn tính TỔNG theo 3 ngày cột K ý, sau đó mới tìm MIN của các giá trị Tổng đó ^^
 
Upvote 0
Cột ngày tháng trong file của bạn có các trị trong bảng sau:
Demand
11/2/2020​
11/3/2020​
11/4/2020​
11/5/2020​
11/6/2020​
11/9/2020​
. . .

Vậy iêu cầu của bạn tính trị tổng của từng mắt hàng trong 3 ngày liên tiếp; Cứ cho sẽ tính ra Ví dụ tính cho tính cho ngày 2 đến ngày 4 tháng 11
Xong sau đó tính 3 ngày kế tiếp là ngày 3 đến ngày 5/11 hay tính từ 5/11 đến 7/11 (hoặc tính 3 ngày từ 5/11 đến 9/11) vậy bạn?
Tính có vẻ dễ hơn muốn hiểu rõ ý của bạn!
 
Lần chỉnh sửa cuối:
Upvote 0
T
Cột ngày tháng trong file của bạn có các trị trong bảng sau:
Demand
11/2/2020​
11/3/2020​
11/4/2020​
11/5/2020​
11/6/2020​
11/9/2020​
. . .

Vậy iêu cầu của bạn tính trị tổng của từng mắt hàng trong 3 ngày liên tiếp; Cứ cho sẽ tính ra Ví dụ tính cho tính cho ngày 2 đến ngày 4 tháng 11
Xong sau đó tính 3 ngày kế tiếp là ngày 3 đến ngày 5/11 hay tính từ 5/11 đến 7/11 (hoặc tính 3 ngày từ 5/11 đến 9/11) vậy bạn?
Tính có vẻ dễ hơn muốn hiểu rõ ý của bạn!
Cột ngày tháng trong file của bạn có các trị trong bảng sau:
Demand
11/2/2020​
11/3/2020​
11/4/2020​
11/5/2020​
11/6/2020​
11/9/2020​
. . .

Vậy iêu cầu của bạn tính trị tổng của từng mắt hàng trong 3 ngày liên tiếp; Cứ cho sẽ tính ra Ví dụ tính cho tính cho ngày 2 đến ngày 4 tháng 11
Xong sau đó tính 3 ngày kế tiếp là ngày 3 đến ngày 5/11 hay tính từ 5/11 đến 7/11 (hoặc tính 3 ngày từ 5/11 đến 9/11) vậy bạn?
Tính có vẻ dễ hơn muốn hiểu rõ ý của bạn!
Tính theo các ngày có trong cột K ấy bác. Cứ nằm trong 3 ngày đó thì gộp tổng
VD:
Tổng 1: 2,3,4/11
Tổng 2: 5,6,9/11
Tổng 3:10,11,12/11
Cứ thếđó bác ạ
 
Upvote 0
Mình chỉ dám thực hiện với khoảng 100 mã hàng thôi, tuy vậy đã ngốn ~ 20gy rồi, hết biết
Bạn thử kiểm xem sao.
 

File đính kèm

  • CSDL.rar
    800.5 KB · Đọc: 10
Upvote 0
Macro bài trên chỉ mới thực hiện công đoạn 1, đó là liệt kê số liệu từng mặt hàng trong 3 ngay gần nhất;
Kết quả trích của 3 mặt hàng giả lập như sau:

STTMã VLTừĐếnTổng
1301952740111/2/202011/4/202020
2
3019527401​
11/3/2020​
11/5/2020​
17​
3
3019527401​
11/4/2020​
11/6/2020​
15​
4
3019527401​
11/5/2020​
11/9/2020​
12​
5
3019527401​
11/6/2020​
11/10/2020​
8​
6
3019527401​
11/9/2020​
11/11/2020​
2​
7
3019527401​
11/12/2020​
11/16/2020​
3​
8
3019527401​
11/13/2020​
11/17/2020​
3​
9
3019527401​
11/16/2020​
11/18/2020​
3​
10
3019527401​
11/19/2020
11/23/2020
1
11
3019527401​
11/20/2020
11/24/2020
1
12
3019527401​
11/23/2020
11/25/2020
1
13302D925060
11/2/2020​
11/4/2020​
23​
14302D925060
11/3/2020​
11/5/2020​
12​
15302D925060
11/5/2020​
11/9/2020​
10​
16302D925060
11/6/2020​
11/10/2020​
10​
17302D925060
11/9/2020​
11/11/2020​
10​
18302D925060
11/19/2020​
11/23/2020​
9​
19302D925060
11/20/2020​
11/24/2020​
9​
20302D925060
11/23/2020​
11/25/2020​
9​
21302DY04080
11/2/2020​
11/4/2020​
48​
22. . . .

Mình muốn đưa bảng số liệu này ra để ta cùng nhau thỏa thuận công việc cho công đoạn tiếp (& biết đâu sau thỏa thuận ta có thể kết hợp 2 công đoạn làm 1)

Thứ nhất tại mã hàng có 2 số cuối là 01 có 3 dòng đều là tối thiểu ( bằng 1); Vậy ta chỉ lấy 1 dòng dữ liệu trong 3 dòng này hay lấy hết cả 3
Thêm nữa: Các giá trị trong file của bạn toàn âm, đó là những trị thực tế của bạn hay giả lập?

Thứ nhì: Có khi nào không có số liệu trong 3 ngày liên tiếp trong năm hay không? Mình cho rằng việc này quan trọng khi bảng số liệu của bạn quá vĩ đại. . . .

. . . . .
 
Upvote 0
Macro bài trên chỉ mới thực hiện công đoạn 1, đó là liệt kê số liệu từng mặt hàng trong 3 ngay gần nhất;
Kết quả trích của 3 mặt hàng giả lập như sau:

STTMã VLTừĐếnTổng
1301952740111/2/202011/4/202020
2
3019527401​
11/3/2020​
11/5/2020​
17​
3
3019527401​
11/4/2020​
11/6/2020​
15​
4
3019527401​
11/5/2020​
11/9/2020​
12​
5
3019527401​
11/6/2020​
11/10/2020​
8​
6
3019527401​
11/9/2020​
11/11/2020​
2​
7
3019527401​
11/12/2020​
11/16/2020​
3​
8
3019527401​
11/13/2020​
11/17/2020​
3​
9
3019527401​
11/16/2020​
11/18/2020​
3​
10
3019527401​
11/19/2020
11/23/2020
1
11
3019527401​
11/20/2020
11/24/2020
1
12
3019527401​
11/23/2020
11/25/2020
1
13302D925060
11/2/2020​
11/4/2020​
23​
14302D925060
11/3/2020​
11/5/2020​
12​
15302D925060
11/5/2020​
11/9/2020​
10​
16302D925060
11/6/2020​
11/10/2020​
10​
17302D925060
11/9/2020​
11/11/2020​
10​
18302D925060
11/19/2020​
11/23/2020​
9​
19302D925060
11/20/2020​
11/24/2020​
9​
20302D925060
11/23/2020​
11/25/2020​
9​
21302DY04080
11/2/2020​
11/4/2020​
48​
22. . . .

Mình muốn đưa bảng số liệu này ra để ta cùng nhau thỏa thuận công việc cho công đoạn tiếp (& biết đâu sau thỏa thuận ta có thể kết hợp 2 công đoạn làm 1)

Thứ nhất tại mã hàng có 2 số cuối là 01 có 3 dòng đều là tối thiểu ( bằng 1); Vậy ta chỉ lấy 1 dòng dữ liệu trong 3 dòng này hay lấy hết cả 3
Thêm nữa: Các giá trị trong file của bạn toàn âm, đó là những trị thực tế của bạn hay giả lập?

Thứ nhì: Có khi nào không có số liệu trong 3 ngày liên tiếp trong năm hay không? Mình cho rằng việc này quan trọng khi bảng số liệu của bạn quá vĩ đại. . . .

. . . . .
Mình xin phép trả lời bác như sau:
Thứ nhất: Nếu tổng có nhiều giá trị bằng nhau (ở đây là = 1) thì chỉ cần lấy 1 dòng là được
Thứ nữa: Các giá trị trong file mình toàn âm (vì theo như bàng tính của mình là lượng sử dụng, lượng dương sẽ là lượng hàng cung cấp và mình k nêu ra ở đây, ở đây hoàn toàn là những trị thực tế). Mình muốn tính lượng sử dụng lớn nhất ↔ giá trị phải tính = MIN
Thêm nữa: "không có số liệu trong 3 ngày liên tiếp" là có khả năng xảy ra.
Ngoài ra: Một cái quan trọng trong công thức của bác khiến số liệu của mình nó hơi vĩ đại quá đó là khoảng thời gian bác set, có vẻ hôm qua e và bác vẫn chưa hiểu đúng ý nhau. Tất nhiên là nếu làm như bác số liệu càng nhiều thì xác suất chính xác cho kết quả e mong muốn càng OK nhưng chỉ cần như dưới đây thì đã là đúng mong muốn của em rồi ạ
Ví dụ:
MaterialTừĐếnTổng
302TA17040
11/2/2020​
11/4/2020​
9261.00
302TA17040
11/5/2020​
11/9/2020​
9261​
302TA17040
11/10/2020​
11/12/2020​
9261​
302TA17040
11/13/2020​
11/17/2020​
9262​
302TA17040
11/18/2020​
11/20/2020​
9262​
302TA17040
11/23/2020​
11/25/2020​
9262​
 
Upvote 0
. . . . .
Thứ nữa: Các giá trị trong file mình toàn âm (vì theo như bàng tính của mình là lượng sử dụng, lượng dương sẽ là lượng hàng cung cấp và mình k nêu ra ở đây, ở đây hoàn toàn là những trị thực tế). Mình muốn tính lượng sử dụng lớn nhất ↔ giá trị phải tính = MIN
OK!
Thêm nữa: "không có số liệu trong 3 ngày liên tiếp" là có khả năng xảy ra.
. . . Sau hẵn hay
Ngoài ra: Một cái quan trọng trong công thức của bác khiến số liệu của mình nó hơi vĩ đại quá đó là khoảng thời gian bác set, có vẻ hôm qua e và bác vẫn chưa hiểu đúng ý nhau. Tất nhiên là nếu làm như bác số liệu càng nhiều thì xác suất chính xác cho kết quả e mong muốn càng OK nhưng chỉ cần như dưới đây thì đã là đúng mong muốn của em rồi ạ
Ví dụ:. . .
Để có bảng số liệu như bạn cần, cũng trãi qua 2 công đoạn:
1./ Tạo danh sách từng 3 ngày 1 cho mỗi mặt hàng (CĐ 1)
2./ Xác định MIN trong chúng (CĐ 2)
Thực tế mình đã làm rồi

Với ~200 mặt hàng chỉ thực hiện CĐ 1 cân ~35 gy; Nhưng với từng ý mặt hàng xài 2 CĐ sẽ tiêu tốn ~ 88 gy

Bạn có thể nạp ~ 200 mặt hàng (duy nhất) vô file của bạn & chạy thử macro này (Lưu ý thiết kế giống như file của mình bên trên vê 200 mặt hàng, bảng danh sách các ngày duy nhất đã sắp xếp & vùng mình gọi là Crit cho hàm CSDL nha
PHP:
Sub SanLuongNhoNhatCua3Ngay()
Dim J As Long, Tong As Double, Rws As Long, W As Long, Tmr As Double, Min_ As Double, fDat As Date, lDat As Date
Dim WF As Object, Cls As Range, Crit As Range, CSDL As Range
Dim MaVL As String

Sheets("Data").Select:                         ReDim Arr(1 To 99999, 1 To 4)
Application.ScreenUpdating = False:            Set Crit = [L1:N2]
Rws = [D1].CurrentRegion.Rows.Count:           Set CSDL = [D1].CurrentRegion
Set WF = Application.WorksheetFunction:        Sheets("Tong").[A2].Resize(99999, 4).Value = Arr()
Tmr = Timer()
For Each Cls In Range([h2], [h2].End(xlDown))
    MaVL = Cls.Value
    [M2].Value = MaVL:                          Min_ = (10) ^ 6
    For J = 2 To ([J2].End(xlDown).Row - 2)
        [L4].Value = Cells(J, "J").Value:       [N4].Value = Cells(J + 2, "J").Value
        Tong = WF.DSum(CSDL, [D1], Crit)
        If Tong <> 0 And Tong < Min_ Then
            fDat = Cells(J, "J").Value:         lDat = Cells(J + 2, "J").Value
            Min_ = Tong
        End If
    Next J
    If Min_ < (10) ^ 6 Then
        W = W + 1:                              Arr(W, 1) = MaVL
        Arr(W, 2) = fDat:                       Arr(W, 3) = lDat
        Arr(W, 4) = Min_:                       Min_ = (10) ^ 6
    End If
Next Cls
If W Then
    With Sheets("Tong")
        .[A2].Resize(W, 4).Value = Arr():       .[f1].Value = Timer() - Tmr
    End With
End If
MsgBox "Xin Chào & Chúc Vui!", , Timer() - Tmr
GPE:
Application.ScreenUpdating = True
End Sub
Bài đã được tự động gộp:

Hãy tải lên tập tin có kết quả mong muốn của bạn.
Nó giống như sau:
MaterialTừĐếnTổng
80.1582​
301952740111/19/202011/23/20201
302D925060
11/19/2020​
11/23/2020​
9​
302DY04080
11/19/2020​
11/23/2020​
13​
302DY04130
11/9/2020​
11/11/2020​
18​
302DY04140
11/19/2020​
11/23/2020​
21​
302DY34070
11/9/2020​
11/11/2020​
24​
302DY34080
11/5/2020​
11/9/2020​
32​
302DY34090
11/9/2020​
11/11/2020​
34​
302DY34180
11/5/2020​
11/9/2020​
42​
302DY34190
11/17/2020​
11/19/2020​
48​
302DY34340
11/19/2020​
11/23/2020​
58​
302DY34460
11/9/2020​
11/11/2020​
66​
302DY34930
11/17/2020​
11/19/2020​
74​
302DY44040
11/19/2020​
11/23/2020​
80​
302DY50670
11/5/2020​
11/9/2020​
89​
302F928330
11/5/2020​
11/9/2020​
91​
302F939101
11/19/2020​
11/23/2020​
93​
302FV45020
11/9/2020​
11/11/2020​
101​
302FZ44010
11/19/2020​
11/23/2020​
111​
302FZ44060
11/19/2020​
11/23/2020​
119​
302GR44150
11/19/2020​
11/23/2020​
127​
302H722A70
11/9/2020​
11/11/2020​
135​
302HG11190
11/19/2020​
11/23/2020​
142​
302HG12510
11/9/2020​
11/11/2020​
149​
302HG12520
11/9/2020​
11/11/2020​
154​
302HG12530
11/9/2020​
11/11/2020​
161​
302HG14E00
11/9/2020​
11/11/2020​
166​
302HG14E10
11/9/2020​
11/11/2020​
171​
302HG19A70
11/17/2020​
11/19/2020​
179​
302HG44120
11/12/2020​
11/16/2020​
186​
302HN02A00
11/9/2020​
11/11/2020​
193​
302HN06200
11/23/2020​
11/25/2020​
200​
302HN08240
11/9/2020​
11/11/2020​
211​
302HN12420
11/9/2020​
11/11/2020​
218​
302HN14C60
11/9/2020​
11/11/2020​
225​
302HN14C70
11/19/2020​
11/23/2020​
230​
302HN19610
11/17/2020​
11/19/2020​
237​
(Theo file #6)
 
Lần chỉnh sửa cuối:
Upvote 0
OK!
. . . Sau hẵn hay

Để có bảng số liệu như bạn cần, cũng trãi qua 2 công đoạn:
1./ Tạo danh sách từng 3 ngày 1 cho mỗi mặt hàng (CĐ 1)
2./ Xác định MIN trong chúng (CĐ 2)
Thực tế mình đã làm rồi

Với ~200 mặt hàng chỉ thực hiện CĐ 1 cân ~35 gy; Nhưng với từng ý mặt hàng xài 2 CĐ sẽ tiêu tốn ~ 88 gy

Bạn có thể nạp ~ 200 mặt hàng (duy nhất) vô file của bạn & chạy thử macro này (Lưu ý thiết kế giống như file của mình bên trên vê 200 mặt hàng, bảng danh sách các ngày duy nhất đã sắp xếp & vùng mình gọi là Crit cho hàm CSDL nha
PHP:
Sub SanLuongNhoNhatCua3Ngay()
Dim J As Long, Tong As Double, Rws As Long, W As Long, Tmr As Double, Min_ As Double, fDat As Date, lDat As Date
Dim WF As Object, Cls As Range, Crit As Range, CSDL As Range
Dim MaVL As String

Sheets("Data").Select:                         ReDim Arr(1 To 99999, 1 To 4)
Application.ScreenUpdating = False:            Set Crit = [L1:N2]
Rws = [D1].CurrentRegion.Rows.Count:           Set CSDL = [D1].CurrentRegion
Set WF = Application.WorksheetFunction:        Sheets("Tong").[A2].Resize(99999, 4).Value = Arr()
Tmr = Timer()
For Each Cls In Range([h2], [h2].End(xlDown))
    MaVL = Cls.Value
    [M2].Value = MaVL:                          Min_ = (10) ^ 6
    For J = 2 To ([J2].End(xlDown).Row - 2)
        [L4].Value = Cells(J, "J").Value:       [N4].Value = Cells(J + 2, "J").Value
        Tong = WF.DSum(CSDL, [D1], Crit)
        If Tong <> 0 And Tong < Min_ Then
            fDat = Cells(J, "J").Value:         lDat = Cells(J + 2, "J").Value
            Min_ = Tong
        End If
    Next J
    If Min_ < (10) ^ 6 Then
        W = W + 1:                              Arr(W, 1) = MaVL
        Arr(W, 2) = fDat:                       Arr(W, 3) = lDat
        Arr(W, 4) = Min_:                       Min_ = (10) ^ 6
    End If
Next Cls
If W Then
    With Sheets("Tong")
        .[A2].Resize(W, 4).Value = Arr():       .[f1].Value = Timer() - Tmr
    End With
End If
MsgBox "Xin Chào & Chúc Vui!", , Timer() - Tmr
GPE:
Application.ScreenUpdating = True
End Sub
Bài đã được tự động gộp:


Nó giống như sau:
MaterialTừĐếnTổng
80.1582​
301952740111/19/202011/23/20201
302D925060
11/19/2020​
11/23/2020​
9​
302DY04080
11/19/2020​
11/23/2020​
13​
302DY04130
11/9/2020​
11/11/2020​
18​
302DY04140
11/19/2020​
11/23/2020​
21​
302DY34070
11/9/2020​
11/11/2020​
24​
302DY34080
11/5/2020​
11/9/2020​
32​
302DY34090
11/9/2020​
11/11/2020​
34​
302DY34180
11/5/2020​
11/9/2020​
42​
302DY34190
11/17/2020​
11/19/2020​
48​
302DY34340
11/19/2020​
11/23/2020​
58​
302DY34460
11/9/2020​
11/11/2020​
66​
302DY34930
11/17/2020​
11/19/2020​
74​
302DY44040
11/19/2020​
11/23/2020​
80​
302DY50670
11/5/2020​
11/9/2020​
89​
302F928330
11/5/2020​
11/9/2020​
91​
302F939101
11/19/2020​
11/23/2020​
93​
302FV45020
11/9/2020​
11/11/2020​
101​
302FZ44010
11/19/2020​
11/23/2020​
111​
302FZ44060
11/19/2020​
11/23/2020​
119​
302GR44150
11/19/2020​
11/23/2020​
127​
302H722A70
11/9/2020​
11/11/2020​
135​
302HG11190
11/19/2020​
11/23/2020​
142​
302HG12510
11/9/2020​
11/11/2020​
149​
302HG12520
11/9/2020​
11/11/2020​
154​
302HG12530
11/9/2020​
11/11/2020​
161​
302HG14E00
11/9/2020​
11/11/2020​
166​
302HG14E10
11/9/2020​
11/11/2020​
171​
302HG19A70
11/17/2020​
11/19/2020​
179​
302HG44120
11/12/2020​
11/16/2020​
186​
302HN02A00
11/9/2020​
11/11/2020​
193​
302HN06200
11/23/2020​
11/25/2020​
200​
302HN08240
11/9/2020​
11/11/2020​
211​
302HN12420
11/9/2020​
11/11/2020​
218​
302HN14C60
11/9/2020​
11/11/2020​
225​
302HN14C70
11/19/2020​
11/23/2020​
230​
302HN19610
11/17/2020​
11/19/2020​
237​
(Theo file #6)
Cảm ơn bác, mình đã chạy thử 200 mã duy nhất nhưng máy mình hơn 5p rồi vẫn chưa ra kết quả, có thể là do máy không đủ khỏe để chạy được với tốc độ như của bác
 
Upvote 0
Hãy tải lên tập tin có kết quả mong muốn của bạn.
Mình thực hiện các phép tính theo kiểu Pivot dữ liệu "DATA" vào Sheet "tính toán", sau khi pivot được tổng 3 ngày thì sẽ tính ra MIN. kết quả sẽ Vlookup vào Sheet "copy
bác nhé.
 

File đính kèm

  • Example.xlsx
    1.7 MB · Đọc: 7
Upvote 0
Chào mọi người, rất mong được sự giúp đỡ của mọi người.

Em đang có một bài toán tìm giá trị MIN sau khi đã tính được nhiều giá trị TỔNG khác nhau theo điều kiện ngày tháng đối với từng mã hàng bằng thông tin trong Sheet "DATA".

Cứ 3 ngày sẽ tính tổng cho mã hàng 1 lần, và cuối cùng tính giá trị MIN đối với các tổng vừa tìm được.

Hình ảnh cho mọi người xem qua
View attachment 247468
Rất mong được sự chỉ giúp của các cao nhân và các bậc tiền bối ạ.
Tạo bảng thời gian cột N:O
Mã:
Sub XYZ()
 Dim aHang(), aThoiGian(), aNgay(), sArr(), Res(), Dic As Object
  Dim fR&, eR&, sRow&, sCol&, i&, iR&, j&, jC&, Ngay&, iMin#

  With Sheets("Copy")
    aHang = .Range("A2", .Range("A" & Rows.Count).End(3)).Value
    aThoiGian = .Range("N2", .Range("O" & Rows.Count).End(3)).Value
  End With
  sRow = UBound(aThoiGian)
  fR = CLng(aThoiGian(1, 1))
  eR = CLng(aThoiGian(sRow, 2))
  ReDim aNgay(fR To eR)
  ReDim Preserve aHang(1 To UBound(aHang), 1 To sRow + 1)
 
  For i = 1 To sRow
    For j = CLng(aThoiGian(i, 1)) To CLng(aThoiGian(i, 2))
      aNgay(j) = i + 1
    Next j
  Next i
  Set Dic = CreateObject("scripting.dictionary")
  sRow = UBound(aHang, 1)
  For i = 1 To sRow
    Dic.Item(aHang(i, 1)) = i
  Next i
 
  With Sheets("Data")
    sArr = .Range("A2", .Range("D" & Rows.Count).End(3)).Value
  End With
  sRow = UBound(sArr)
  For i = 1 To sRow
    Ngay = sArr(i, 3)
    If Ngay >= fR And Ngay <= eR Then
      iR = Dic.Item(sArr(i, 1))
      If iR > 0 Then
        jC = aNgay(Ngay)
        If jC > 0 Then
          aHang(iR, jC) = aHang(iR, jC) + sArr(i, 4)
        End If
      End If
    End If
  Next i
  sRow = UBound(aHang)
  sCol = UBound(aHang, 2)
  ReDim Res(1 To sRow, 1 To 1)
  For i = 1 To sRow
    iMin = 9999 '*****
    For j = 2 To sCol
      If iMin > aHang(i, j) Then iMin = aHang(i, j)
    Next j
    If iMin < 9999 Then Res(i, 1) = iMin
  Next i
  With Sheets("Copy")
    .Range("I2").Resize(sRow, 1) = Res
  End With
End Sub
 

File đính kèm

  • Example.xlsb
    379.5 KB · Đọc: 6
Upvote 0
OK!
. . . Sau hẵn hay

Để có bảng số liệu như bạn cần, cũng trãi qua 2 công đoạn:
1./ Tạo danh sách từng 3 ngày 1 cho mỗi mặt hàng (CĐ 1)
2./ Xác định MIN trong chúng (CĐ 2)
Thực tế mình đã làm rồi

Với ~200 mặt hàng chỉ thực hiện CĐ 1 cân ~35 gy; Nhưng với từng ý mặt hàng xài 2 CĐ sẽ tiêu tốn ~ 88 gy

Bạn có thể nạp ~ 200 mặt hàng (duy nhất) vô file của bạn & chạy thử macro này (Lưu ý thiết kế giống như file của mình bên trên vê 200 mặt hàng, bảng danh sách các ngày duy nhất đã sắp xếp & vùng mình gọi là Crit cho hàm CSDL nha
PHP:
Sub SanLuongNhoNhatCua3Ngay()
Dim J As Long, Tong As Double, Rws As Long, W As Long, Tmr As Double, Min_ As Double, fDat As Date, lDat As Date
Dim WF As Object, Cls As Range, Crit As Range, CSDL As Range
Dim MaVL As String

Sheets("Data").Select:                         ReDim Arr(1 To 99999, 1 To 4)
Application.ScreenUpdating = False:            Set Crit = [L1:N2]
Rws = [D1].CurrentRegion.Rows.Count:           Set CSDL = [D1].CurrentRegion
Set WF = Application.WorksheetFunction:        Sheets("Tong").[A2].Resize(99999, 4).Value = Arr()
Tmr = Timer()
For Each Cls In Range([h2], [h2].End(xlDown))
    MaVL = Cls.Value
    [M2].Value = MaVL:                          Min_ = (10) ^ 6
    For J = 2 To ([J2].End(xlDown).Row - 2)
        [L4].Value = Cells(J, "J").Value:       [N4].Value = Cells(J + 2, "J").Value
        Tong = WF.DSum(CSDL, [D1], Crit)
        If Tong <> 0 And Tong < Min_ Then
            fDat = Cells(J, "J").Value:         lDat = Cells(J + 2, "J").Value
            Min_ = Tong
        End If
    Next J
    If Min_ < (10) ^ 6 Then
        W = W + 1:                              Arr(W, 1) = MaVL
        Arr(W, 2) = fDat:                       Arr(W, 3) = lDat
        Arr(W, 4) = Min_:                       Min_ = (10) ^ 6
    End If
Next Cls
If W Then
    With Sheets("Tong")
        .[A2].Resize(W, 4).Value = Arr():       .[f1].Value = Timer() - Tmr
    End With
End If
MsgBox "Xin Chào & Chúc Vui!", , Timer() - Tmr
GPE:
Application.ScreenUpdating = True
End Sub
Bài đã được tự động gộp:


Nó giống như sau:
MaterialTừĐếnTổng
80.1582​
301952740111/19/202011/23/20201
302D925060
11/19/2020​
11/23/2020​
9​
302DY04080
11/19/2020​
11/23/2020​
13​
302DY04130
11/9/2020​
11/11/2020​
18​
302DY04140
11/19/2020​
11/23/2020​
21​
302DY34070
11/9/2020​
11/11/2020​
24​
302DY34080
11/5/2020​
11/9/2020​
32​
302DY34090
11/9/2020​
11/11/2020​
34​
302DY34180
11/5/2020​
11/9/2020​
42​
302DY34190
11/17/2020​
11/19/2020​
48​
302DY34340
11/19/2020​
11/23/2020​
58​
302DY34460
11/9/2020​
11/11/2020​
66​
302DY34930
11/17/2020​
11/19/2020​
74​
302DY44040
11/19/2020​
11/23/2020​
80​
302DY50670
11/5/2020​
11/9/2020​
89​
302F928330
11/5/2020​
11/9/2020​
91​
302F939101
11/19/2020​
11/23/2020​
93​
302FV45020
11/9/2020​
11/11/2020​
101​
302FZ44010
11/19/2020​
11/23/2020​
111​
302FZ44060
11/19/2020​
11/23/2020​
119​
302GR44150
11/19/2020​
11/23/2020​
127​
302H722A70
11/9/2020​
11/11/2020​
135​
302HG11190
11/19/2020​
11/23/2020​
142​
302HG12510
11/9/2020​
11/11/2020​
149​
302HG12520
11/9/2020​
11/11/2020​
154​
302HG12530
11/9/2020​
11/11/2020​
161​
302HG14E00
11/9/2020​
11/11/2020​
166​
302HG14E10
11/9/2020​
11/11/2020​
171​
302HG19A70
11/17/2020​
11/19/2020​
179​
302HG44120
11/12/2020​
11/16/2020​
186​
302HN02A00
11/9/2020​
11/11/2020​
193​
302HN06200
11/23/2020​
11/25/2020​
200​
302HN08240
11/9/2020​
11/11/2020​
211​
302HN12420
11/9/2020​
11/11/2020​
218​
302HN14C60
11/9/2020​
11/11/2020​
225​
302HN14C70
11/19/2020​
11/23/2020​
230​
302HN19610
11/17/2020​
11/19/2020​
237​
(Theo file #6)
Lúc đầu mình chạy được nhưng sau đó vài lần thì báo lỗi này. Rất mong bác chỉ giáo ạ

1602822016400.png
 
Upvote 0
Tạo bảng thời gian cột N:O
Mã:
Sub XYZ()
Dim aHang(), aThoiGian(), aNgay(), sArr(), Res(), Dic As Object
  Dim fR&, eR&, sRow&, sCol&, i&, iR&, j&, jC&, Ngay&, iMin#

  With Sheets("Copy")
    aHang = .Range("A2", .Range("A" & Rows.Count).End(3)).Value
    aThoiGian = .Range("N2", .Range("O" & Rows.Count).End(3)).Value
  End With
  sRow = UBound(aThoiGian)
  fR = CLng(aThoiGian(1, 1))
  eR = CLng(aThoiGian(sRow, 2))
  ReDim aNgay(fR To eR)
  ReDim Preserve aHang(1 To UBound(aHang), 1 To sRow + 1)

  For i = 1 To sRow
    For j = CLng(aThoiGian(i, 1)) To CLng(aThoiGian(i, 2))
      aNgay(j) = i + 1
    Next j
  Next i
  Set Dic = CreateObject("scripting.dictionary")
  sRow = UBound(aHang, 1)
  For i = 1 To sRow
    Dic.Item(aHang(i, 1)) = i
  Next i

  With Sheets("Data")
    sArr = .Range("A2", .Range("D" & Rows.Count).End(3)).Value
  End With
  sRow = UBound(sArr)
  For i = 1 To sRow
    Ngay = sArr(i, 3)
    If Ngay >= fR And Ngay <= eR Then
      iR = Dic.Item(sArr(i, 1))
      If iR > 0 Then
        jC = aNgay(Ngay)
        If jC > 0 Then
          aHang(iR, jC) = aHang(iR, jC) + sArr(i, 4)
        End If
      End If
    End If
  Next i
  sRow = UBound(aHang)
  sCol = UBound(aHang, 2)
  ReDim Res(1 To sRow, 1 To 1)
  For i = 1 To sRow
    iMin = 9999 '*****
    For j = 2 To sCol
      If iMin > aHang(i, j) Then iMin = aHang(i, j)
    Next j
    If iMin < 9999 Then Res(i, 1) = iMin
  Next i
  With Sheets("Copy")
    .Range("I2").Resize(sRow, 1) = Res
  End With
End Sub

Cảm ơn bác rất nhiều, em đã chạy được. Được mọi người giúp đỡ nhiệt tình em rất cảm kích. Về cơ bản e thích code của bác SA_DQ nhất vì code này cho e được xác suất kết quả đẹp nhất e mong muốn.
Em sẽ nghiên cứu thêm code của mn để có thể áp dụng sâu hơn cho những biểu tính tiếp theo của em.
SA_DQ
 
Upvote 0
Được mọi người giúp đỡ nhiệt tình em rất cảm kích. Về cơ bản e thích code của bác SA_DQ nhất vì code này cho e được xác suất kết quả đẹp nhất e mong muốn.
Em sẽ nghiên cứu thêm code của mn để có thể áp dụng sâu hơn cho những biểu tính tiếp theo của em.
Code của rùa cụ ý mà; mà không biết bạn có thể cải tiến thêm hơn theo dữ liệu thật của bạn không nửa, mong được vậy!
 
Upvote 0
OK!
. . . Sau hẵn hay

Để có bảng số liệu như bạn cần, cũng trãi qua 2 công đoạn:
1./ Tạo danh sách từng 3 ngày 1 cho mỗi mặt hàng (CĐ 1)
2./ Xác định MIN trong chúng (CĐ 2)
Thực tế mình đã làm rồi

Với ~200 mặt hàng chỉ thực hiện CĐ 1 cân ~35 gy; Nhưng với từng ý mặt hàng xài 2 CĐ sẽ tiêu tốn ~ 88 gy

Bạn có thể nạp ~ 200 mặt hàng (duy nhất) vô file của bạn & chạy thử macro này (Lưu ý thiết kế giống như file của mình bên trên vê 200 mặt hàng, bảng danh sách các ngày duy nhất đã sắp xếp & vùng mình gọi là Crit cho hàm CSDL nha
PHP:
Sub SanLuongNhoNhatCua3Ngay()
Dim J As Long, Tong As Double, Rws As Long, W As Long, Tmr As Double, Min_ As Double, fDat As Date, lDat As Date
Dim WF As Object, Cls As Range, Crit As Range, CSDL As Range
Dim MaVL As String

Sheets("Data").Select:                         ReDim Arr(1 To 99999, 1 To 4)
Application.ScreenUpdating = False:            Set Crit = [L1:N2]
Rws = [D1].CurrentRegion.Rows.Count:           Set CSDL = [D1].CurrentRegion
Set WF = Application.WorksheetFunction:        Sheets("Tong").[A2].Resize(99999, 4).Value = Arr()
Tmr = Timer()
For Each Cls In Range([h2], [h2].End(xlDown))
    MaVL = Cls.Value
    [M2].Value = MaVL:                          Min_ = (10) ^ 6
    For J = 2 To ([J2].End(xlDown).Row - 2)
        [L4].Value = Cells(J, "J").Value:       [N4].Value = Cells(J + 2, "J").Value
        Tong = WF.DSum(CSDL, [D1], Crit)
        If Tong <> 0 And Tong < Min_ Then
            fDat = Cells(J, "J").Value:         lDat = Cells(J + 2, "J").Value
            Min_ = Tong
        End If
    Next J
    If Min_ < (10) ^ 6 Then
        W = W + 1:                              Arr(W, 1) = MaVL
        Arr(W, 2) = fDat:                       Arr(W, 3) = lDat
        Arr(W, 4) = Min_:                       Min_ = (10) ^ 6
    End If
Next Cls
If W Then
    With Sheets("Tong")
        .[A2].Resize(W, 4).Value = Arr():       .[f1].Value = Timer() - Tmr
    End With
End If
MsgBox "Xin Chào & Chúc Vui!", , Timer() - Tmr
GPE:
Application.ScreenUpdating = True
End Sub
Xin phép hỏi thêm bác một chút ạ, nếu ở đây mình muốn tính tổng luôn cả tháng thì sửa như thế nào cho hợp lý ạ?
Em có thể dùng bằng hàm SUMIF nhưng cảm giác nó chạy hơi chậm, lag. Công thức của bác chạy thế kia đã nhanh rồi thì chắc nếu chỉ tính 1 tổng thôi chắc rất nhanh :D
 
Upvote 0
Bạn phải địng nghĩa thế nào là 1 tháng trong các trường hợp sau:
1 tháng tính từ ngày 1;
1 tháng tính là 30 ngày kể từ 1 ngày bất kỳ?
1 tháng tính đủ 30 ngày có trong danh sách?
 
Upvote 0
Bạn xem cách mình thực hiện 2 cách liệt kê theo tháng:
1./ Liệt kê chỉ ~ 200 mặt hàng
2./ Liệt kê tất thẩy các mặt hàng có giao dịch trong tháng
 

File đính kèm

  • CSDL.rar
    811.3 KB · Đọc: 6
Upvote 0
Web KT
Back
Top Bottom