VBA code thay thế cho pivot-table lấy top 10, bottom 10 (2 người xem)

  • Thread starter Thread starter eagle12
  • Ngày gửi Ngày gửi

Người dùng đang xem chủ đề này

Tôi tuân thủ nội quy khi đăng bài

eagle12

Thành viên mới
Tham gia
18/12/13
Bài viết
47
Được thích
14
Em hay dùng chức năng của pivot để lấy số liệu tóm tắt, nhưng với data nguồn có nhiều dòng, cột ~ 300K dòng thì các báo cáo pviot làm tăng dung lượng file lên đáng kể (do em để nhiều pivot khác nhau)

Xin nhờ anh chị giúp 1 code có thể lấy giá trị lọc thay cho bảng pivot bên phải, với các điều kiện tại ô màu vàng
Nguồn giá trị bảng pivot từ A6:AI

Cám ơn mọi người rất nhiều

1765189282931.png
 

File đính kèm

Có thể dùng lệnh SQL trong VBA để lọc top
 
Upvote 0
Em hay dùng chức năng của pivot để lấy số liệu tóm tắt, nhưng với data nguồn có nhiều dòng, cột ~ 300K dòng thì các báo cáo pviot làm tăng dung lượng file lên đáng kể (do em để nhiều pivot khác nhau)

Xin nhờ anh chị giúp 1 code có thể lấy giá trị lọc thay cho bảng pivot bên phải, với các điều kiện tại ô màu vàng
Nguồn giá trị bảng pivot từ A6:AI

Cám ơn mọi người rất nhiều

View attachment 310550ạn hi bạn,

bạn lọc top theo nhà giao dịch à ? nội dung này có thể coi trên fiintrade hoặc web chứng khoán khác
chi tiết bạn có thể trao đổi thêm với mình
Thân chào.
 
Lần chỉnh sửa cuối:
Upvote 0
Tại ô AM9 thử công thức sau:
=TAKE(SORT(CHOOSECOLS(FILTER(A7:X300000,(A7:A300000=AN5)*(X7:X300000=AN6)),4,3,9),3,-1),AN4)
 
Upvote 0
ProprietaryTotal TU DOANHVNINDEXtoday ForeignTotal NUOC NGOAIVNINDEXtoday
#fromtosymbolTop sellTop buysymbol #fromtosymbolTop sellTop buysymbol
1KDHVIX 1VPLSHB
2MWGPVD 2VICMBB
3MSNDXG 3SSIVPB
4HPGFPT 4GMDHPG
5SSITPB 5KBCCTG
6VICVPB 6VREMWG
7TCBVCI 7VCBGEX
8VHMTLG 8ACBPVD
9VNMGEE 9MSNVHM
10GMDSTB 10FRTVNM
11VREVCB 11VIXVND
12CIIVJC 12BIDVCI
13FUEVFVNDHDB 13PNJPLX
14MBBVTP 14BMPGVR
15DGCACB 15SABFUEVFVND
16SHBPNJ 16VJCDPG
17NAFREE 17VGCGAS
18VIBNLG 18STBCII
19CTGHDG 19VCGNAF
20FUESSVFLLPB 20VSCVPI
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-98,680,400,000​
[/td][td]
17,484,845,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-1,548,891,422,000​
[/td][td]
186,332,731,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-57,967,790,000​
[/td][td]
8,903,445,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-184,880,368,000​
[/td][td]
160,359,523,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-52,235,844,000​
[/td][td]
4,781,750,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-167,860,505,000​
[/td][td]
110,397,302,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-39,806,710,000​
[/td][td]
4,324,103,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-92,799,148,001​
[/td][td]
77,910,820,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-37,895,888,000​
[/td][td]
4,189,360,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-63,330,752,000​
[/td][td]
53,194,801,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-27,232,660,000​
[/td][td]
3,921,621,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-50,305,885,000​
[/td][td]
49,810,571,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-20,506,535,000​
[/td][td]
3,414,995,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-42,443,136,000​
[/td][td]
31,270,660,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-20,199,370,000​
[/td][td]
3,088,200,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-36,231,165,000​
[/td][td]
23,461,090,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-16,801,490,000​
[/td][td]
2,673,290,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-30,178,883,000​
[/td][td]
20,501,666,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-10,989,880,000​
[/td][td]
2,404,345,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-28,481,579,000​
[/td][td]
19,147,558,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-10,952,575,000​
[/td][td]
2,076,900,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-28,162,122,000​
[/td][td]
9,453,720,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-10,015,585,000​
[/td][td]
1,701,110,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-24,134,030,000​
[/td][td]
9,101,485,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-9,733,469,000​
[/td][td]
1,491,840,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-21,086,887,000​
[/td][td]
8,842,825,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-7,797,370,000​
[/td][td]
1,478,500,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-20,074,780,000​
[/td][td]
8,601,985,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-7,716,310,000​
[/td][td]
1,402,135,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-19,958,520,000​
[/td][td]
6,867,061,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-5,039,836,000​
[/td][td]
1,059,690,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-19,201,804,000​
[/td][td]
6,465,355,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-4,908,840,000​
[/td][td]
940,340,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-19,059,835,000​
[/td][td]
5,035,925,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-3,707,545,000​
[/td][td]
617,180,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-18,617,525,000​
[/td][td]
4,680,472,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-3,224,114,000​
[/td][td]
596,770,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-17,778,081,001​
[/td][td]
4,437,910,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-3,111,404,000​
[/td][td]
553,545,000​
[/td]​
[td]
08/12/2025​
[/td][td]
08/12/2025​
[/td]​
[td]
-17,678,394,000​
[/td][td]
4,129,320,000​
[/td]​
Bài đã được tự động gộp:

1765240732460.png

bạn có thê tham khảo
thân chào.
 
Upvote 0
Em hay dùng chức năng của pivot để lấy số liệu tóm tắt, nhưng với data nguồn có nhiều dòng, cột ~ 300K dòng thì các báo cáo pviot làm tăng dung lượng file lên đáng kể (do em để nhiều pivot khác nhau)

Xin nhờ anh chị giúp 1 code có thể lấy giá trị lọc thay cho bảng pivot bên phải, với các điều kiện tại ô màu vàng
Nguồn giá trị bảng pivot từ A6:AI

Cám ơn mọi người rất nhiều

View attachment 310550
Rich (BB code):
Sub GetTop10Records()
    Dim strSQL As String
    Dim Rec As Object, cnn As Object, dWB As Workbook
 
    Set dWB = ThisWorkbook
    Set cnn = CreateObject("ADODB.Connection")
    cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dWB.FullName & ";Extended Properties=""Excel 12.0 Xml;HDR=Yes"""
   
    strSQL = "SELECT TOP 10 Mã, Stock, SL FROM [Data$A6:AI12994] Where Loai = ""TD"" And [Buy/Sell today] = ""Today"" ORDER BY SL DESC;"
    'strSQL = "SELECT TOP 10 Mã, Stock, SL FROM [Data$A6:AI12994] Where Loai = ""TD"" And [Buy/Sell today] = ""Today"" ORDER BY SL ASC;"
 
    Set Rec = cnn.Execute(strSQL)
    Sheet2.Range("AM9").Resize(100, 3).ClearContents
    Sheet2.Range("AM9").CopyFromRecordset Rec
 
    cnn.Close
    Set cnn = Nothing
    Set Rec = Nothing
 
End Sub

2 dòng lệnh SQL cho top 10 lớn nhất và top 10 nhỏ nhất

P/S: ngay dòng đầu của cột Buy/Sale today bạn cần gõ thêm 1 ký tự chuỗi hoặc 1 khoảng trắng thì mới ra kết quả. Lý do là có quá nhiều giá trị rỗng ở đầu cột nên SQL không nhận diện được kiểu giá trị của cột.

(Đã thêm Imex=1 và Maxscanrow=0 nhưng cũng không ra kết quả. Có ai biết cách khắc phục nào khác không?)
 
Lần chỉnh sửa cuối:
Upvote 0
Tại ô AM9 thử công thức sau:
=TAKE(SORT(CHOOSECOLS(FILTER(A7:X300000,(A7:A300000=AN5)*(X7:X300000=AN6)),4,3,9),3,-1),AN4)
Em cám ơn anh nhiều

Hàm kết hợp em đưa vào ra KQ đúng như mong muốn, đẹp luôn anh ah

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

2 dòng lệnh SQL cho top 10 lớn nhất và top 10 nhỏ nhất

Em copy vào file và chạy thử, sub báo chỗ dòng này anh ah

1765246579981.png1765246610765.png
Bài đã được tự động gộp:

Cái này là vẽ kiểu biểu đồ excel ra 2 cột xanh đỏ hả anh
Em cũng có dùng excel thống kê, và cho KQ theo dõi, nhưng cái chèn thêm sắp xếp thứ tự xanh đỏ kia thì không biết

Em đang theo dõi thêm kiểu này trên excel
1765247164287.png
Bài đã được tự động gộp:

View attachment 310552

bạn có thê tham khảo
thân chào.
 
Lần chỉnh sửa cuối:
Upvote 0
Em cám ơn anh nhiều

Hàm kết hợp em đưa vào ra KQ đúng như mong muốn, đẹp luôn anh ah

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



Em copy vào file và chạy thử, sub báo chỗ dòng này anh ah

View attachment 310558View attachment 310559
Bài đã được tự động gộp:

Cái này là vẽ kiểu biểu đồ excel ra 2 cột xanh đỏ hả anh
Em cũng có dùng excel thống kê, và cho KQ theo dõi, nhưng cái chèn thêm sắp xếp thứ tự xanh đỏ kia thì không biết

Em đang theo dõi thêm kiểu này trên excel
View attachment 310560
Do sai tên cột chữ Loại á. Gõ chữ Loại trong VBA không được nên tôi sửa thành Loai

Ngoài ra xem lại vùng tham chiếu thử cho gì sai không
 
Upvote 0
Em cám ơn anh nhiều

Hàm kết hợp em đưa vào ra KQ đúng như mong muốn, đẹp luôn anh ah

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



Em copy vào file và chạy thử, sub báo chỗ dòng này anh ah

View attachment 310558View attachment 310559
Bài đã được tự động gộp:

Cái này là vẽ kiểu biểu đồ excel ra 2 cột xanh đỏ hả anh
Em cũng có dùng excel thống kê, và cho KQ theo dõi, nhưng cái chèn thêm sắp xếp thứ tự xanh đỏ kia thì không biết

Em đang theo dõi thêm kiểu này trên excel
View attachment 310560
mình lấy dữ liệu web có sẵn không có thông kê như bạn
bạn là nhà đầu tư hay làm cho công ty vậy ?
 
Upvote 0
mình lấy dữ liệu web có sẵn không có thông kê như bạn
bạn là nhà đầu tư hay làm cho công ty vậy ?
Em đầu tư cá nhân thôi anh ah, chứ không phải broker bên nào cả
Em cũng chủ yếu lấy data từ web hoặc từ sở về convert PDF đưa vài excel thống kê lại, nhưng cũng có 1 số hạn chế về lấy dữ liệu back-date của bảng giá điện tử nếu hôm nào đó quên không chạy sub sau 15:00 hết phiên
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Tại ô AM9 thử công thức sau:
=TAKE(SORT(CHOOSECOLS(FILTER(A7:X300000,(A7:A300000=AN5)*(X7:X300000=AN6)),4,3,9),3,-1),AN4)
Anh ơi, trong TH nếu em cột đk chọn nó có nhiều ngày, nhiều giá trị cho 1 mã thì có thể dùng hàm filter kết hợp với các hàm khác để cho KQ như pivot được không anh

Nhờ anh xem qua giúp em với ạ

Cám ơn a nhiều

1765770087000.png
 
Upvote 0
Anh ơi, trong TH nếu em cột đk chọn nó có nhiều ngày, nhiều giá trị cho 1 mã thì có thể dùng hàm filter kết hợp với các hàm khác để cho KQ như pivot được không anh

Nhờ anh xem qua giúp em với ạ

Cám ơn a nhiều

View attachment 310647
Bạn gửi kèm file lên lên nhé, mọi người sẽ hỗ trợ bạn. Nếu chỉ gửi hình, mọi người sẽ không xử lý giúp bạn được.
 
Upvote 0
Biết ngay là sẽ có chuyện này. Dữ liệu hiện tại mỗi mã chỉ 1 dòng nên ADO bài 6 và cả công thức bài 4 đều tạm đúng, nhưng chưa thay thế được Pivot table.
Nếu nói về công thức thì lồng thêm hàm GroupBy. Nếu là ADO thì phải thêm hàm Sum
 
Upvote 0
Bạn gửi kèm file lên lên nhé, mọi người sẽ hỗ trợ bạn. Nếu chỉ gửi hình, mọi người sẽ không xử lý giúp bạn được.

Úi em xem lại file nặng trên 2Mb bị báo không đính kèm được anh, em chỉnh lại cho nhẹ
File này anh ah

Em cám ơn anh
 

File đính kèm

Upvote 0
Dùng lại công thức bài 4 thêm GroupBy:
Mã:
AM9 =LET(a,CHOOSECOLS(FILTER(A7:X300000,(A7:A300000=AN5)*
(X7:X300000=AN6)),4,3,9),b,CHOOSECOLS(a,1,2),c,CHOOSECOLS(a,3),TAKE(SORT(GROUPBY(b,c,SUM,3),3,-1),AN4))

Code ADO bài 6 thêm Sum:

PHP:
Sub GetTop10Records()
    Dim strSQL As String
    Dim Rec As Object, cnn As Object, dWB As Workbook
 
    Set dWB = ThisWorkbook
    Set cnn = CreateObject("ADODB.Connection")
    cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dWB.FullName & _
    ";Extended Properties=""Excel 12.0 Xml;HDR=Yes"""
 
    strSQL = "SELECT  top 10 a.Ma, a.Stock, sum(a.SL) FROM [Data$A6:AI12995] a Where a.[Loai] =  'TD'" & _
    " And [Buy_Sell_today] = 'Today' Group by a.Ma,a.Stock ORDER BY sum(a.[SL]) DESC;"
 
    Set Rec = cnn.Execute(strSQL)
    Sheet2.Range("AM9").Resize(100, 3).ClearContents
    Sheet2.Range("AM9").CopyFromRecordset Rec
 
    cnn.Close
    Set cnn = Nothing
    Set Rec = Nothing
 
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Dùng lại công thức bài 4 thêm GroupBy:
Mã:
AM9 =LET(a,CHOOSECOLS(FILTER(A7:X300000,(A7:A300000=AN5)*(X7:X300000=AN6)),4,3,9),b,CHOOSECOLS(a,1,2),c,CHOOSECOLS(a,3),TAKE(SORT(GROUPBY(b,c,SUM,3),3,-1),AN4))
Cám ơn anh nhiều,
Em đưa công thức vào, nếu lấy đk = NN thì thấy hàm lấy cả thêm Total vào, lấy được top 9 theo từng mã (do tổng đk NN là số dương)

Còn nếu loại = TD, hàm cho KQ lấy được top 10 tổng theo từng mã (do tổng đk TD là số âm)

1765774176883.png
1765774201439.png
 

File đính kèm

Upvote 0
Muốn bỏ dòng tổng thì sửa GROUPBY(b,c,SUM,3) thành GROUPBY(b,c,SUM,0,0)
 
Upvote 0
Giải pháp
Cám ơn anh nhiều,
Em đưa công thức vào, nếu lấy đk = NN thì thấy hàm lấy cả thêm Total vào, lấy được top 9 theo từng mã (do tổng đk NN là số dương)

Còn nếu loại = TD, hàm cho KQ lấy được top 10 tổng theo từng mã (do tổng đk TD là số âm)

View attachment 310650
View attachment 310651
Chỗ Groupby bạn tắt total đi GROUPBY(b,c,SUM,3,0)
Hoặc muốn nằm dưới cùng thì có thể dùng công thức sau:
=LET(a,CHOOSECOLS(FILTER(A7:X300000,(A7:A300000=BA27)*(X7:X300000=BA26)),4,3,9),b,CHOOSECOLS(a,1,2),c,CHOOSECOLS(a,3),d,TAKE(SORT(GROUPBY(b,c,SUM,3,0),3,-1),BA25),e,HSTACK("","Total",SUM(TAKE(d,,-1))),VSTACK(d,e))

Cám ơn anh Mỹ đã hướng dẫn thêm Groupby.
 
Upvote 0
Chỗ Groupby bạn tắt total đi GROUPBY(b,c,SUM,3,0)
Hoặc muốn nằm dưới cùng thì có thể dùng công thức sau:
=LET(a,CHOOSECOLS(FILTER(A7:X300000,(A7:A300000=BA27)*(X7:X300000=BA26)),4,3,9),b,CHOOSECOLS(a,1,2),c,CHOOSECOLS(a,3),d,TAKE(SORT(GROUPBY(b,c,SUM,3,0),3,-1),BA25),e,HSTACK("","Total",SUM(TAKE(d,,-1))),VSTACK(d,e))

Cám ơn anh Mỹ đã hướng dẫn thêm Groupby.
Muốn bỏ dòng tổng thì sửa GROUPBY(b,c,SUM,3) thành GROUPBY(b,c,SUM,0,0)
Em cám ơn 2 anh @thanthanhan @ptm0412
Em đưa công thức lại vào file cho ra KQ đúng mong muôn rồi ah

Cám ơn 2 anh rất nhiều
1765779295398.png
 
Upvote 0
Chỗ Groupby bạn tắt total đi GROUPBY(b,c,SUM,3,0)
Hoặc muốn nằm dưới cùng thì có thể dùng công thức sau:
=LET(a,CHOOSECOLS(FILTER(A7:X300000,(A7:A300000=BA27)*(X7:X300000=BA26)),4,3,9),b,CHOOSECOLS(a,1,2),c,CHOOSECOLS(a,3),d,TAKE(SORT(GROUPBY(b,c,SUM,3,0),3,-1),BA25),e,HSTACK("","Total",SUM(TAKE(d,,-1))),VSTACK(d,e))

Cám ơn anh Mỹ đã hướng dẫn thêm Groupby.

Từ hàm của anh và anh @ptm0412 viết hộ em, em mày mò sửa lại để trình bày ghép cho cả tổng top & bottom nhưng không ra như ở post#12 e đã thực hành được

nhờ anh chỉnh giúp em ô

BG29=LET(a,CHOOSECOLS(FILTER(A7:X300000,(A7:A300000=BE27)*(X7:X300000=BE26)),9,4,3),b,CHOOSECOLS(a,1,2),c,CHOOSECOLS(a,3),d,TAKE(SORT(GROUPBY(b,c,SUM,3,0),1,1),BE25),e,HSTACK("","Total",SUM(TAKE(d,,1))),VSTACK(d,e))

Em mày mò chỉnh sắp xếp cột cho 10 giá trị nhỏ nhất (Vùng màu vàng) nhưng KQ không ra, nhờ anh xem giúp em ah

1765787436209.png
 

File đính kèm

Upvote 0

Bài viết mới nhất

Back
Top Bottom