Sử dụng mảng tính Minifs và Maxifs với dữ liệu lớn

Liên hệ QC

anhbanvuitinh9x

Thành viên mới
Tham gia
4/10/14
Bài viết
43
Được thích
14
Giới tính
Nam
Em chào anh/chị!
Em đang có 1 file khá nhiều dữ liệu, em đang muốn lấy dữ liệu từ sheet "Data" sang sheet1 với những dữ liệu muốn lấy như sau:
- Tính ngày mua đầu tiên của KH: với 3 điều kiện: Mã cửa hàng, mã khách hàng và thời gian nhỏ hơn tháng 4/2022
- Tính ngày mua cuối cùng của KH: với 3 điều kiện: Mã cửa hàng, mã khách hàng và thời gian nhỏ hơn tháng 4/2022
- Đếm ngày: Ngày cuối - Ngày đầu

Do dữ liệu nhiều nên em đang sử dụng hàm và code (Minifs và Maxifs) của em chạy bị treo máy.
Nên nhờ anh/chị hỗ trợ code mảng để có thể chạy hiệu quả hơn.
Em cảm ơn!
file: https://docs.google.com/spreadsheet...ouid=106960914218320658553&rtpof=true&sd=true
Đây là code em đang viết:

Sub DEMNGAY()
Dim i As Long
Dim lr As Long
lr = Sheet2.Cells(Rows.Count, 2).End(xlUp).Row
For i = 2 To lr
Sheet2.Range("D" & i) = Application.WorksheetFunction.MinIfs(Sheet1.Range("C:C"), Sheet1.Range("A:A"), Sheet2.Range("B" & i), Sheet1.Range("E:E"), "<=01/07/2022", Sheet1.Range("c:c"), Sheet2.Range("D" & i))
Sheet2.Range("E" & i) = Application.WorksheetFunction.MaxIfs(Sheet1.Range("C:C"), Sheet1.Range("A:A"), Sheet2.Range("B" & i), Sheet1.Range("E:E"), "<=01/07/2022", Sheet1.Range("c:c"), Sheet2.Range("D" & i))
Sheet2.Range("F" & i) = Sheet2.Range("G" & i) - Sheet2.Range("F" & i)
Next i
End Sub
 
Lần chỉnh sửa cuối:
Post file đi bạn. Làm chay thế này sao làm được.
 
Upvote 0
Em gửi file anh nhé!
Post file đi bạn. Làm chay thế này sao làm được.
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn cắt bớt dòng đi, chỉ để lại 1 hay 200 dòng thôi. Chọn dòng sao cho có đủ ít nhất 2 KH nhé
 
Upvote 0
dùng hàm maxifs của excel 365 luôn, viết làm rề
 
Upvote 0
dữ liệu của mình nếu sử dụng công thức khoảng 10tr nên không dùng được công thức bạn à.
Code phía dưới mình cũng đang dùng Minifs và Maxifs nhưng cũng không chạy được
10tr dữ liệu đem chia cho 7 cột (A đến G) thì mỗi cột là bao nhiêu dòng?
Vậy mà cũng "không chạy được".
 
Upvote 0
...
Mỗi cột của em hiện tại khoảng hơn 300 nghìn
Bạn muốn nhờ người ta làm giùm thì phải nói chuyện rõ rệt một chút.
Nếu mỗi cột có hơn 300 ngàn dòng thì tối thiểu phải 30 cột mới chứa hết 10 triệu. Bài #1 của bạn chỉ nói đến 7 cột, nhân 2 sheets là 14 cột.
 
Upvote 0
Bạn muốn nhờ người ta làm giùm thì phải nói chuyện rõ rệt một chút.
Nếu mỗi cột có hơn 300 ngàn dòng thì tối thiểu phải 30 cột mới chứa hết 10 triệu. Bài #1 của bạn chỉ nói đến 7 cột, nhân 2 sheets là 14 cột.
vâng bác em lấy dữ liệu từ 2019 chia theo tháng nên sẽ khá nhiều.
bên trên em chỉ để demo 1 tháng để mọi người hỗ trợ thôi bác à.
Mọi người hỗ trợ 1 tháng chạy ok em thay sang các tháng khác thôi mà
Bài đã được tự động gộp:

Bạn muốn nhờ người ta làm giùm thì phải nói chuyện rõ rệt một chút.
Nếu mỗi cột có hơn 300 ngàn dòng thì tối thiểu phải 30 cột mới chứa hết 10 triệu. Bài #1 của bạn chỉ nói đến 7 cột, nhân 2 sheets là 14 cột.
à em hiểu ý bác rồi. lượng data em cung cấp đủ số cột rồi bác à.

chỉ là dữ liệu em đang cắt bớt đi để mọi người dễ hỗ trợ thôi
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn mói chuyện tùm lum quá nên khó đưa ra giải đáp đúng đắn.

MS có đưa ra Data Model để làm việc với dữ liệu lớn.
Tìm hiểu Data Model và cái mớ Power Pivot, Power Query,...
 
Upvote 0
Bạn mói chuyện tùm lum quá nên khó đưa ra giải đáp đúng đắn.

MS có đưa ra Data Model để làm việc với dữ liệu lớn.
Tìm hiểu Data Model và cái mớ Power Pivot, Power Query,...
Tóm lại em đang viết công thức và cả VBA nhưng máy em đang không chạy được do dữ liệu nhiều quá.
em đang nghĩ nếu sử dụng mảng thì nó sẽ chạy hiệu quả hơn và nhờ mọi người hỗ trợ.
Còn bác bảo giờ em đi tìm hiểu, học Power Pivot, Power Query viết công thức em không biết bao lâu nữa em mới giải quyết được vấn đề bên trên bác à.
 
Upvote 0
Upvote 0
Tóm lại em đang viết công thức và cả VBA nhưng máy em đang không chạy được do dữ liệu nhiều quá.
em đang nghĩ nếu sử dụng mảng thì nó sẽ chạy hiệu quả hơn và nhờ mọi người hỗ trợ.
Không hẳn do dữ liệu nhiều quá.
Lỗi chính là do bạn MinIfs/MaxIfs cả cột . Nên nhớ là một cột có cả triệu dòng.

Còn bác bảo giờ em đi tìm hiểu, học Power Pivot, Power Query viết công thức em không biết bao lâu nữa em mới giải quyết được vấn đề bên trên bác à.
Bạn làm việc với dữ liệu bao lâu rồi mà nói chuyện con số còn lủng củng. Làm việc với Excel bao lâu rồi mà không biết cả việc căn bản là dùng A:A là tính cả triệu dòng.
Đó là do bạn lười bổ sung kiến thức trong thời gian làm việc chứ cái Data Model mà tôi nói đâu có khó gì. Bạn dự định bao giờ mới có thể tạm tự lập?

"em không biết bao lâu nữa em mới giải quyết được vấn đề bên"
Người làm việc với dữ liệu khủng thì người ta biết xoay sở từ lâu rồi. Đâu đợi nước đến chân mới nhảy.
 
Upvote 0
Không hẳn do dữ liệu nhiều quá.
Lỗi chính là do bạn MinIfs/MaxIfs cả cột . Nên nhớ là một cột có cả triệu dòng.


Bạn làm việc với dữ liệu bao lâu rồi mà nói chuyện con số còn lủng củng. Làm việc với Excel bao lâu rồi mà không biết cả việc căn bản là dùng A:A là tính cả triệu dòng.
Đó là do bạn lười bổ sung kiến thức trong thời gian làm việc chứ cái Data Model mà tôi nói đâu có khó gì. Bạn dự định bao giờ mới có thể tạm tự lập?

"em không biết bao lâu nữa em mới giải quyết được vấn đề bên"
Người làm việc với dữ liệu khủng thì người ta biết xoay sở từ lâu rồi. Đâu đợi nước đến chân mới nhảy.
Không hẳn do dữ liệu nhiều quá.
Lỗi chính là do bạn MinIfs/MaxIfs cả cột . Nên nhớ là một cột có cả triệu dòng.

=> dạ thưa bác em xin nói lại là em đã cắt bớt dữ liệu để đưa lên mọi người hỗ trợ.
dữ liệu chính thức trên file data của em từ 2019 khoảng hơn 900k dòng, nên em đặt A:A làm việc cả cột là sai à bác?
Bạn làm việc với dữ liệu bao lâu rồi mà nói chuyện con số còn lủng củng. Làm việc với Excel bao lâu rồi mà không biết cả việc căn bản là dùng A:A là tính cả triệu dòng.
Đó là do bạn lười bổ sung kiến thức trong thời gian làm việc chứ cái Data Model mà tôi nói đâu có khó gì. Bạn dự định bao giờ mới có thể tạm tự lập?

=> Nói như bác thì em nghĩ web này không nên lập ra để làm gì. Em không biết thì em mới lên đây để hỏi chứ nếu em có thể tự làm thì em cũng không lên đây hỏi và tranh luận với bác làm gì
"em không biết bao lâu nữa em mới giải quyết được vấn đề bên"
Người làm việc với dữ liệu khủng thì người ta biết xoay sở từ lâu rồi. Đâu đợi nước đến chân mới nhảy.
=> vẫn như trên em nói, em đang cần gấp nên mới nhờ mọi người. còn đương nhiên em có cách học và phát triển riêng của em

Chỉ là hỗ trợ thôi mà sao em thấy bác khó khăn với em thế? dữ liệu em đưa lên đầy đủ, trình bày nguyện vọng rõ ràng. Em không hiểu là bác muốn gì nữa?

Bài đã được tự động gộp:

Máy báo có thể có virus, Nên gởi file dạng .xlsx. Cần tính 3 cột hay chỉ 1 cột đếm ngày?
Em gửi bác lại file bác hỗ trợ em nhé!

Em tính cả 3 cột tại sheet1 bác à
 
Lần chỉnh sửa cuối:
Upvote 0
=> Nói như bác thì em nghĩ web này không nên lập ra để làm gì.
Để cho người rảnh tập làm công thức và viết code.
Toi khong thích tập viết code cho nên tôi chỉ làm về giải thuật.
Với vấn đề này nói chung thì tại tầm nhìn của bạn chỉ tới VBA cho nên bạn không màng đến các giải pháp khác.
Với VBA thì tại trình bạn chỉ biết viết code cho nên chưa thấu đáo điểm quan trọng của đi tìm giải thuật trước khi code.

Em không biết thì em mới lên đây để hỏi chứ nếu em có thể tự làm thì em cũng không lên đây hỏi và tranh luận với bác làm gì
...
Tôi chỉ mượn bạn để chỉ dẫn cho người khác trên diễn đàn thôi.
Trình độ và địa vị của tôi tranh luận với bạn không xứng. Quên cái từ "tranh luận" đi. Để giành đầu óc mà tỏ bày vấn đề rõ rệt cho người muốn giúp - điển hình bài #13. Tranh luận thì hăng lắm mà diễn giải vấn đề chính của mình thì nhỏ giọt.

=> vẫn như trên em nói, em đang cần gấp nên mới nhờ mọi người. còn đương nhiên em có cách học và phát triển riêng của em
Tôi cũng có cách chỉ dẫn riêng của tôi.

Chỉ là hỗ trợ thôi mà sao em thấy bác khó khăn với em thế? dữ liệu em đưa lên đầy đủ, trình bày nguyện vọng rõ ràng. Em không hiểu là bác muốn gì nữa?
...
Như đã nói ở trên. Toi chỉ mượn bạn để chỉ dẫn học trò tôi thôi. Học trò nào thấy khó khăn thì chúng không theo dõi tôi nữa. Giản dị.
 
Upvote 0
Để cho người rảnh tập làm công thức và viết code.
Toi khong thích tập viết code cho nên tôi chỉ làm về giải thuật.
vâng em biết bác rất giỏi cũng hỗ trợ rất nhiều vấn đề trên nhóm và giờ chỉ tập trung vào những vấn đề cao siêu.
em gà nên chỉ biết chút về công thức và ít code, không biết gì về giải thuật.
Với vấn đề này nói chung thì tại tầm nhìn của bạn chỉ tới VBA cho nên bạn không màng đến các giải pháp khác.
Với VBA thì tại trình bạn chỉ biết viết code cho nên chưa thấu đáo điểm quan trọng của đi tìm giải thuật trước khi code.
Biết gì thì tầm nhìn tới đó bác à. Giờ như em chỉ biết về công thức và 1 chút code đơn giản mà bác lại bảo em đi học giải thuật với Data model, Power query, power pivot (đương nhiên sau em sẽ học thêm). Nhưng giờ vấn đề của em là giải quyết bài toán bên trên chứ không phải là đi học ngàn thứ và không biết tới bao giờ mới giải quyết xong
Tôi chỉ mượn bạn để chỉ dẫn cho người khác trên diễn đàn thôi.
Trình độ và địa vị của tôi tranh luận với bạn không xứng. Quên cái từ "tranh luận" đi. Để giành đầu óc mà tỏ bày vấn đề rõ rệt cho người muốn giúp - điển hình bài #13. Tranh luận thì hăng lắm mà diễn giải vấn đề chính của mình thì nhỏ giọt.
Theo cách nói của bác thì mọi người nên cứ đi học thêm đi đừng lên đây hỏi làm gì phải không?
Em thì biết ít sao dám tranh luận kiến thức với bác. "Tranh luận" ở đây là "Tranh luận cách giúp đỡ người khác bác à. giúp kiểu hạnh hoẹ, mượn em để nói người khác thì mong bác next dùm. Em không rảnh.
Như đã nói ở trên. Toi chỉ mượn bạn để chỉ dẫn học trò tôi thôi. Học trò nào thấy khó khăn thì chúng không theo dõi tôi nữa. Giản dị.
Em mong bác đăng bài nói với những học trò của bác dùm em. Chứ đừng vào bài viết của em để chỉ dẫn. em thấy thừa thãi lắm
 
Upvote 0
Em chào anh/chị!
Em đang có 1 file khá nhiều dữ liệu, em đang muốn lấy dữ liệu từ sheet "Data" sang sheet1 với những dữ liệu muốn lấy như sau:
- Tính ngày mua đầu tiên của KH: với 3 điều kiện: Mã cửa hàng, mã khách hàng và thời gian nhỏ hơn tháng 4/2022
- Tính ngày mua cuối cùng của KH: với 3 điều kiện: Mã cửa hàng, mã khách hàng và thời gian nhỏ hơn tháng 4/2022
- Đếm ngày: Ngày cuối - Ngày đầu

Do dữ liệu nhiều nên em đang sử dụng hàm và code (Minifs và Maxifs) của em chạy bị treo máy.
Nên nhờ anh/chị hỗ trợ code mảng để có thể chạy hiệu quả hơn.
Em cảm ơn!
file: https://docs.google.com/spreadsheet...ouid=106960914218320658553&rtpof=true&sd=true
Đây là code em đang viết:

Sub DEMNGAY()
Dim i As Long
Dim lr As Long
lr = Sheet2.Cells(Rows.Count, 2).End(xlUp).Row
For i = 2 To lr
Sheet2.Range("D" & i) = Application.WorksheetFunction.MinIfs(Sheet1.Range("C:C"), Sheet1.Range("A:A"), Sheet2.Range("B" & i), Sheet1.Range("E:E"), "<=01/07/2022", Sheet1.Range("c:c"), Sheet2.Range("D" & i))
Sheet2.Range("E" & i) = Application.WorksheetFunction.MaxIfs(Sheet1.Range("C:C"), Sheet1.Range("A:A"), Sheet2.Range("B" & i), Sheet1.Range("E:E"), "<=01/07/2022", Sheet1.Range("c:c"), Sheet2.Range("D" & i))
Sheet2.Range("F" & i) = Sheet2.Range("G" & i) - Sheet2.Range("F" & i)
Next i
End Sub
Kiểm tra lại . . .
Mã:
Option Explicit
Sub ABC()
  Dim arr(), aData(), res(), S, dic As Object, key$
  Dim tmp$, dk As Date, ngay As Date, srData&, srRes&, i&, k&
  With Sheets("Data")
    i = .Range("A" & Rows.Count).End(xlUp).Row
    If i < 2 Then MsgBox ("Khong co du lieu!"): Exit Sub
    aData = .Range("A2:C" & i).Value
  End With
  With Sheets("Sheet1")
    On Error Resume Next
    S = Split(.Range("A1").Value, " ")
    S = Split(S(UBound(S)), "/")
    dk = DateValue(S(1) & "/" & S(0) & "/1")
    If Err.Number > 0 Then MsgBox ("Nhap lai cell A1 theo dung mau!"): Exit Sub
    On Error GoTo 0
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i < 2 Then MsgBox ("Khong co du lieu!"): Exit Sub
    arr = .Range("B2:C" & i).Value
  End With
  srData = UBound(aData): srRes = UBound(arr)
  ReDim res(1 To srRes, 1 To 3)
  Set dic = CreateObject("scripting.dictionary")
  For i = 1 To srRes
    dic(arr(i, 1) & "|" & arr(i, 2)) = i
  Next i
  For i = 1 To srData
    ngay = aData(i, 3)
    If ngay < dk Then
      key = aData(i, 1) & "|" & aData(i, 2)
      If dic.exists(key) Then
        k = dic(key)
        If res(k, 1) > ngay Then
          res(k, 1) = ngay
        ElseIf res(k, 1) = Empty Then
          res(k, 1) = ngay
        End If
        If res(k, 2) < ngay Then res(k, 2) = ngay
      End If
    End If
  Next i
  For i = 1 To srRes
    If res(i, 1) <> Empty Then res(i, 3) = res(i, 2) - res(i, 1)
  Next i
  Sheets("Sheet1").Range("D2").Resize(srRes, 3) = res
End Sub
 
Upvote 0
Kiểm tra lại . . .
Mã:
Option Explicit
Sub ABC()
  Dim arr(), aData(), res(), S, dic As Object, key$
  Dim tmp$, dk As Date, ngay As Date, srData&, srRes&, i&, k&
  With Sheets("Data")
    i = .Range("A" & Rows.Count).End(xlUp).Row
    If i < 2 Then MsgBox ("Khong co du lieu!"): Exit Sub
    aData = .Range("A2:C" & i).Value
  End With
  With Sheets("Sheet1")
    On Error Resume Next
    S = Split(.Range("A1").Value, " ")
    S = Split(S(UBound(S)), "/")
    dk = DateValue(S(1) & "/" & S(0) & "/1")
    If Err.Number > 0 Then MsgBox ("Nhap lai cell A1 theo dung mau!"): Exit Sub
    On Error GoTo 0
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i < 2 Then MsgBox ("Khong co du lieu!"): Exit Sub
    arr = .Range("B2:C" & i).Value
  End With
  srData = UBound(aData): srRes = UBound(arr)
  ReDim res(1 To srRes, 1 To 3)
  Set dic = CreateObject("scripting.dictionary")
  For i = 1 To srRes
    dic(arr(i, 1) & "|" & arr(i, 2)) = i
  Next i
  For i = 1 To srData
    ngay = aData(i, 3)
    If ngay < dk Then
      key = aData(i, 1) & "|" & aData(i, 2)
      If dic.exists(key) Then
        k = dic(key)
        If res(k, 1) > ngay Then
          res(k, 1) = ngay
        ElseIf res(k, 1) = Empty Then
          res(k, 1) = ngay
        End If
        If res(k, 2) < ngay Then res(k, 2) = ngay
      End If
    End If
  Next i
  For i = 1 To srRes
    If res(i, 1) <> Empty Then res(i, 3) = res(i, 2) - res(i, 1)
  Next i
  Sheets("Sheet1").Range("D2").Resize(srRes, 3) = res
End Sub
Em cảm ơn rất nhiều. Để em kiểm tra lại ạ
 
Upvote 0
...

Theo cách nói của bác thì mọi người nên cứ đi học thêm đi đừng lên đây hỏi làm gì phải không?
Em thì biết ít sao dám tranh luận kiến thức với bác. "Tranh luận" ở đây là "Tranh luận cách giúp đỡ người khác bác à. giúp kiểu hạnh hoẹ, mượn em để nói người khác thì mong bác next dùm. Em không rảnh.
Bạn có vấn đề về cách đọc bài của người khác.
Bạn khong phân biệt được "hỏi bài" và tranh luận".

Đáng lẽ tôi làm nngow vì mục đích tôi đã xong rồi. Nhưng baiof trước tôi quên cảm ơn bạn đã tạo bài học cho hiojc trò tôi. Cho nên lần này tôi chỉ cho bạn những điều dưới đây coi như cảm ơn.

Đọc kỹ lại đi. Tôi có nói rõ là "tranh luận" vô ích. Thì giờ than là không đủ học mà ở đấy lo tranh luận.
Tôi cũng có chỉ rõ ra là chú tâm vào cái người ở bài #13. Người ta cần hỏi lại mà bạn trả lời quá vắn tắt. Chịu khó để tâm trí vào "tại sao ngwoif ta hỏi vậy?", và mình đã "diễn tả hết vấn đề chưa?"
Ở trên tôi có bôi đậm, tô đỏ điểm này mà bạn đang lên cơn tự ái, để cho mờ lý trí.
 
Upvote 0
Web KT
Back
Top Bottom