Bạn dùng PivotTable . . .Chào các bác,
Em đang có một bài toán là tách ra dữ liệu có giá trị lớn nhất
Bài toán này có thể giải quyết bằng Maxif nhưng mà vì dữ liệu quá lớn nên nó chạy rất chậm
Các bác giúp em một cái code để tách ra với nhé
Em cảm ơn ạ
Pivot table luôn là cái chậm nhất.Bạn dùng PivotTable . . .
Em cảm ơn bác, nhưng em dùng hàm thì phải lọc mã duy nhất ra sau đó mới chạy hàm được, em muốn nhờ các bác cái code nó tự tách các dữ liệu tương ứng với giá trị lớn nhất với ạDùng aggregate chạy cũng nhanh đó bạn:
=AGGREGATE(14,6,$B$1:$B$12/($A$1:$A$12=D1),1)
View attachment 295532
Em cảm ơn bác, chỉ là Em lại chưa biết dùng cái Data model này bác ạPivot table luôn là cái chậm nhất.
Gặp dữ liệu lớn thì phải dùng data model và power pivot.
Data Model được thiết kế để làm việc với dữ liệu [mà nó đã tự] chuẩn rồi cho nên rất hiệu quả.
Lọc mã duy nhất nếu dữ liệu lớn thì sẽ gây chậm máy.Em cảm ơn bác, nhưng em dùng hàm thì phải lọc mã duy nhất ra sau đó mới chạy hàm được, em muốn nhờ các bác cái code nó tự tách các dữ liệu tương ứng với giá trị lớn nhất với ạ
Em cũng có thử dùng pivot max nhưng dữ liệu biến động khá lớn các giá trị kia cũng được đưa vào từ công thức nên lại pivot nữa nên cũng hơi nặng ạ.Bạn dùng PivotTable . . .
Vâng bác, em để mấy nghìn dòng, bác giúp em với ạLọc mã duy nhất nếu dữ liệu lớn thì sẽ gây chậm máy.
Bạn post file (để vài ngàn dòng thôi) lên mình sẽ giúp phần code VBA nhé
Option Explicit
Sub test()
Dim lr&, i&, rng, dic As Object
Set dic = CreateObject("Scripting.Dictionary")
lr = Cells(Rows.Count, "B").End(xlUp).Row
rng = Range("B3:C" & lr)
For i = 1 To UBound(rng)
If Not dic.exists(rng(i, 1)) Then
dic.Add rng(i, 1), rng(i, 2)
Else
If dic(rng(i, 1)) < rng(i, 2) Then dic(rng(i, 1)) = rng(i, 2)
End If
Next
Range("E3").Resize(dic.Count, 2).Value = WorksheetFunction.Transpose(Array(dic.keys, dic.items))
End Sub
Tuyệt vời luôn bác ạ,OK. Chạy thử code này:
PHP:Option Explicit Sub test() Dim lr&, i&, rng, dic As Object Set dic = CreateObject("Scripting.Dictionary") lr = Cells(Rows.Count, "B").End(xlUp).Row rng = Range("B3:C" & lr) For i = 1 To UBound(rng) If Not dic.exists(rng(i, 1)) Then dic.Add rng(i, 1), rng(i, 2) Else If dic(rng(i, 1)) < rng(i, 2) Then dic(rng(i, 1)) = rng(i, 2) End If Next Range("E3").Resize(dic.Count, 2).Value = WorksheetFunction.Transpose(Array(dic.keys, dic.items)) End Sub
Nghiên cứu? Bạn đùa hơi dai.Thêm giải pháp nữa dành cho thớt nghiên cứu;
SQL cho Excel...
...
Em cảm ơn bác nhiều ạThêm giải pháp nữa dành cho thớt nghiên cứu;
SQL cho Excel...
Thử click nút Clear, Maxx...
Vâng, rất chi tiết, em cảm ơn bác rất nhiều ạ, em sẽ dành thời gian nghiên cứuDữ liệu lớn thì dùng Data Model:
1.Hàm đơn giản:
Giá trị lớn nhất = max('Table1'[Giá trị])
2.Nếu cần viết bảng ảo trong quá trình tính toán dữ liệu lớn:
Giá trị lớn nhất 2 = MAXX(GROUPBY('Table1', 'Table1'[Loại], "MaxValue", MAXX(CURRENTGROUP(), 'Table1'[Giá trị])), [MaxValue])
3.Nếu cần phân tách và sử dụng lại biến:
Giá trị lớn nhất 3 =
VAR SummaryTable =
SUMMARIZE('Table1', 'Table1'[Loại], "MaxValue", MAX('Table1'[Giá trị]))
RETURN
MAXX(SummaryTable, [MaxValue])
4.Có thể sử dụng cách thức xếp hạng sau đó lấy giá trị lớn nhất:
MaxValueByGroup7 =
VAR RankingTable = ADDCOLUMNS('Table1', "Rank", RANKX(FILTER('Table1', 'Table1'[Loại] = EARLIER('Table1'[Loại])), 'Table1'[Giá trị], , DESC))
RETURN
SUMX(FILTER(RankingTable, [Rank] = 1), 'Table1'[Giá trị])
//Tìm giá trị lớn nhất
5.Có thể sử dụng TopN để xếp hạng và lấy giá trị lớn nhất:
MaxValueByGroup9 =
VAR TopNTable = TOPN(1, SUMMARIZE('Table1', 'Table1'[Loại]), [Tổng giá trị], DESC)
RETURN
SUMX(TopNTable, [Tổng giá trị])
Vâng ạ,Nghiên cứu? Bạn đùa hơi dai.
Làm việc với dữ liệu khủng mà không chịu học Data Model thì còn nghiên cứu cái chi nữa.