


bạn tham khảo công cụ Consolidate có sẵn của Excel, nếu không đáp ứng được thì chuyển sang phương án dùng codeChào các bác
em có bài này do dùng công thức thì dữ liệu nặng quá chạy chậm quá, vậy nhờ các bác giúp e cái code cho nó nhẹ cái file tí nhé.
Yêu cầu là tìm giá trị ngày nhỏ nhất, lớn nhất theo điều kiện.
Cám ơn



cám ơn bạn nhưng trong trường hợp này mình cần cái code bạn giúp mình nhébạn tham khảo công cụ Consolidate có sẵn của Excel, nếu không đáp ứng được thì chuyển sang phương án dùng code




Chào các bác
em có bài này do dùng công thức thì dữ liệu nặng quá chạy chậm quá, vậy nhờ các bác giúp e cái code cho nó nhẹ cái file tí nhé.
Yêu cầu là tìm giá trị ngày nhỏ nhất, lớn nhất theo điều kiện.
Cám ơn
Sub MinAndmax()
Dim arr(), D1 As Object, D2 As Object, i, tem
Set D1 = CreateObject("scripting.dictionary")
Set D2 = CreateObject("scripting.dictionary")
With Sheet1
arr = .Range("A4", .[D65536].End(3)).Value
End With
For i = 1 To UBound(arr)
tem = arr(i, 1)
If Not D1.exists(arr(i, 1)) Then
D1.Add tem, arr(i, 4)
D2.Add tem, arr(i, 4)
Else
If D1.Item(tem) < arr(i, 4) Then D1.Item(tem) = arr(i, 4)
If D2.Item(tem) > arr(i, 4) Then D2.Item(tem) = arr(i, 4)
End If
Next
Sheet2.[A4].Resize(D1.Count) = Application.Transpose(D1.keys)
Sheet2.[B4].Resize(D1.Count) = Application.Transpose(D1.items)
Sheet2.[C4].Resize(D1.Count) = Application.Transpose(D2.items)
End Sub
chào anh hải, code của anh dùng ok lắm, tuy nhiên không hiểu sao lại tại chổ cho ra kết quả thì nó định dạng tháng trước ngày, mặc dù e đã định dạng lại là dd/mm/yyy rồi , a xem giúp em lỗi này vơi nhéPHP:Sub MinAndmax() Dim arr(), D1 As Object, D2 As Object, i, tem Set D1 = CreateObject("scripting.dictionary") Set D2 = CreateObject("scripting.dictionary") With Sheet1 arr = .Range("A4", .[D65536].End(3)).Value End With For i = 1 To UBound(arr) tem = arr(i, 1) If Not D1.exists(arr(i, 1)) Then D1.Add tem, arr(i, 4) D2.Add tem, arr(i, 4) Else If D1.Item(tem) < arr(i, 4) Then D1.Item(tem) = arr(i, 4) If D2.Item(tem) > arr(i, 4) Then D2.Item(tem) = arr(i, 4) End If Next Sheet2.[A4].Resize(D1.Count) = Application.Transpose(D1.keys) Sheet2.[B4].Resize(D1.Count) = Application.Transpose(D1.items) Sheet2.[C4].Resize(D1.Count) = Application.Transpose(D2.items) End Sub




chào anh hải, code của anh dùng ok lắm, tuy nhiên không hiểu sao lại tại chổ cho ra kết quả thì nó định dạng tháng trước ngày, mặc dù e đã định dạng lại là dd/mm/yyy rồi , a xem giúp em lỗi này vơi nhé
Sub MinAndmax()
Dim arr(), i, x, tem
Dim kq(1 To 10000, 1 To 5), k
With Sheet1
arr = .Range("A4", .[D65536].End(3)).Value
End With
With CreateObject("scripting.dictionary")
For i = 1 To UBound(arr)
tem = arr(i, 1)
If Not .exists(arr(i, 1)) Then
k = k + 1
.Add tem, k
kq(k, 1) = tem
kq(k, 4) = arr(i, 4)
kq(k, 5) = arr(i, 4)
Else
x = .Item(tem)
If kq(x, 4) < arr(i, 4) Then kq(x, 4) = arr(i, 4)
If kq(x, 5) > arr(i, 4) Then kq(x, 5) = arr(i, 4)
End If
Next
End With
Sheet2.[A4].Resize(k, 5) = kq
End Sub
cám ơn anh , code chạy ok lắm thật là tuyệt vời, tuy nhiên anh ơi, có thể bỏ cái lọc duy nhất tại cột A sheet 2 được không, vì e muốn cột đó là sẽ tự nhập tay vào.PHP:Sub MinAndmax() Dim arr(), i, x, tem Dim kq(1 To 10000, 1 To 5), k With Sheet1 arr = .Range("A4", .[D65536].End(3)).Value End With With CreateObject("scripting.dictionary") For i = 1 To UBound(arr) tem = arr(i, 1) If Not .exists(arr(i, 1)) Then k = k + 1 .Add tem, k kq(k, 1) = tem kq(k, 4) = arr(i, 4) kq(k, 5) = arr(i, 4) Else x = .Item(tem) If kq(x, 4) < arr(i, 4) Then kq(x, 4) = arr(i, 4) If kq(x, 5) > arr(i, 4) Then kq(x, 5) = arr(i, 4) End If Next End With Sheet2.[A4].Resize(k, 5) = kq End Sub




Nếu dữ liệu cột A là duy nhất thì code thế này.cám ơn anh , code chạy ok lắm thật là tuyệt vời, tuy nhiên anh ơi, có thể bỏ cái lọc duy nhất tại cột A sheet 2 được không, vì e muốn cột đó là sẽ tự nhập tay vào.
Sub MinMax()
Dim Tam(), Kq(), Arr(), i, j, k, x
Tam = Sheet2.Range("A4", Sheet2.[A65536].End(3)).Value
ReDim Kq(1 To UBound(Tam), 1 To 2)
Arr = Sheet1.Range("A4", Sheet1.[D65536].End(3)).Value
With CreateObject("scripting.dictionary")
For i = 1 To UBound(Tam)
.Item(Tam(i, 1)) = i
Kq(i, 2) = Date + 100000
Next
For i = 1 To UBound(Arr)
If .exists(Arr(i, 1)) Then
x = .Item(Arr(i, 1))
If Arr(i, 4) > Kq(x, 1) Then
Kq(x, 1) = Arr(i, 4)
End If
If Arr(i, 4) < Kq(x, 2) Then
Kq(x, 2) = Arr(i, 4)
End If
End If
Next
End With
Sheet2.[B4].Resize(UBound(Tam), 2) = Kq
End Sub
chắc cả 2 anh ơi mình hỏi người ta vào hỏi thêmCho thắc mắc chút: Ai là người hỏi trong bài này vậy?
anh làm ơn cho em hỏi tí đoạn này "Kq(i, 2) = Date + 100000" có nghĩa là thế nào vậy ko hiểu 100000 là để làm gì nhờ anh giải thích giúpNếu dữ liệu cột A là duy nhất thì code thế này.
PHP:Sub MinMax() Dim Tam(), Kq(), Arr(), i, j, k, x Tam = Sheet2.Range("A4", Sheet2.[A65536].End(3)).Value ReDim Kq(1 To UBound(Tam), 1 To 2) Arr = Sheet1.Range("A4", Sheet1.[D65536].End(3)).Value With CreateObject("scripting.dictionary") For i = 1 To UBound(Tam) .Item(Tam(i, 1)) = i Kq(i, 2) = Date + 100000 Next For i = 1 To UBound(Arr) If .exists(Arr(i, 1)) Then x = .Item(Arr(i, 1)) If Arr(i, 4) > Kq(x, 1) Then Kq(x, 1) = Arr(i, 4) End If If Arr(i, 4) < Kq(x, 2) Then Kq(x, 2) = Arr(i, 4) End If End If Next End With Sheet2.[B4].Resize(UBound(Tam), 2) = Kq End Sub




Ai biết đâu. Sao không thử bỏ nó ra hoặc thay con số khác vào coi nó ra cái quái gì. Từ từ nghiên cứu nha.anh làm ơn cho em hỏi tí đoạn này "Kq(i, 2) = Date + 100000" có nghĩa là thế nào vậy ko hiểu 100000 là để làm gì nhờ anh giải thích giúp
cám ơn
Sub MinMax()
Dim Tam(), Kq(), Arr(), i, x
Tam = Sheet2.Range("A4", Sheet2.[A65536].End(3)).Value
ReDim Kq(1 To UBound(Tam), 1 To 2)
Arr = Sheet1.Range("A4", Sheet1.[D65536].End(3)).Value
With CreateObject("scripting.dictionary")
For i = 1 To UBound(Tam)
.Item(Tam(i, 1)) = i
Next
For i = 1 To UBound(Arr)
If .exists(Arr(i, 1)) Then
x = .Item(Arr(i, 1))
If Arr(i, 4) > Kq(x, 1) Then
Kq(x, 1) = Arr(i, 4)
End If
If Kq(x, 2) = "" Then Kq(x, 2) = Arr(i, 4)
If Arr(i, 4) < Kq(x, 2) Then
Kq(x, 2) = Arr(i, 4)
End If
End If
Next
End With
Sheet2.[B4].Resize(UBound(Tam), 2) = Kq
End Sub



cám ơn anh , code chạy ok lắm thật là tuyệt vời, tuy nhiên anh ơi, có thể bỏ cái lọc duy nhất tại cột A sheet 2 được không, vì e muốn cột đó là sẽ tự nhập tay vào.
anh hải ơi, code của anh chạy ok luôn cám ơn anh nhiềuAi biết đâu. Sao không thử bỏ nó ra hoặc thay con số khác vào coi nó ra cái quái gì. Từ từ nghiên cứu nha.
..............
Thật ra viết như thế là viết ẩu, nên sửa lại thế này
PHP:Sub MinMax() Dim Tam(), Kq(), Arr(), i, x Tam = Sheet2.Range("A4", Sheet2.[A65536].End(3)).Value ReDim Kq(1 To UBound(Tam), 1 To 2) Arr = Sheet1.Range("A4", Sheet1.[D65536].End(3)).Value With CreateObject("scripting.dictionary") For i = 1 To UBound(Tam) .Item(Tam(i, 1)) = i Next For i = 1 To UBound(Arr) If .exists(Arr(i, 1)) Then x = .Item(Arr(i, 1)) If Arr(i, 4) > Kq(x, 1) Then Kq(x, 1) = Arr(i, 4) End If If Kq(x, 2) = "" Then Kq(x, 2) = Arr(i, 4) If Arr(i, 4) < Kq(x, 2) Then Kq(x, 2) = Arr(i, 4) End If End If Next End With Sheet2.[B4].Resize(UBound(Tam), 2) = Kq End Sub
code này thi đúng rồi anh ơi, mà công nhận cái ado đọc khó hiểu thậttại sheet3 trong file đính kèm,bạn lần lượt gõ q1, q2 ,q3 vào các ô tại cột a thử xem!
Lưu ý : Khi mở file nhớ enable contents nhé !