VBA Pivot (1 người xem)

  • Thread starter Thread starter lmtuyen
  • Ngày gửi Ngày gửi
Liên hệ QC

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

lmtuyen

Thành viên chính thức
Tham gia
14/3/09
Bài viết
71
Được thích
12
Chào Anh/Chị
mình làm file, dùng pivot, ở Field "WEEk" mình có rất nhiều tuần, mục đích là khi nhấn F5 (nút "command"), thì sẽ sort tuần hiện tại là một biến tại ô A1, các tuần khác sẽ ần đi +blank. code bị lỗi chỗ mình tô màu đen, không thực hiện được lệnh. A/Chị giúp với.

Private Sub CommandButton1_Click()
Application.ScreenUpdating = False
ActiveWorkbook.RefreshAll
Sheet5.PivotTables("PivotTable3").PivotFields("WEEK").ClearAllFilters
With Sheet5.PivotTables("PivotTable3").PivotFields("WEEK")
.PivotItems("(blank)").Visible = False
.CurrentPage = Range("a1").Value
End With
Application.ScreenUpdating = True
End Sub

 
Lần chỉnh sửa cuối:
PHP:
Private Sub CommandButton1_Click()
Application.ScreenUpdating = False
With Sheet5.PivotTables("PivotTable3").PivotFields("WEEK")
cnt = .PivotItems.Count
.PivotItems(cnt).Visible = True

For i = 1 To cnt
    If Val(.PivotItems(i)) <> [A1] Then
        .PivotItems(i).Visible = False
    Else
        .PivotItems(i).Visible = True
    End If
Next
End With
  Application.ScreenUpdating = True
End Sub
 
Upvote 0
Chào Anh/Chị
mình làm file, dùng pivot, ở Field "WEEk" mình có rất nhiều tuần, mục đích là khi nhấn F5 (nút "command"), thì sẽ sort tuần hiện tại là một biến tại ô A1, các tuần khác sẽ ần đi +blank. code bị lỗi chỗ mình tô màu đen, không thực hiện được lệnh. A/Chị giúp với.

Private Sub CommandButton1_Click()
Application.ScreenUpdating = False
ActiveWorkbook.RefreshAll
Sheet5.PivotTables("PivotTable3").PivotFields("WEEK").ClearAllFilters
With Sheet5.PivotTables("PivotTable3").PivotFields("WEEK")
.PivotItems("(blank)").Visible = False
.CurrentPage = Range("a1").Value
End With
Application.ScreenUpdating = True
End Sub



Để tạo mới PivotTable, trước tiên xóa cột D đến E, sau đó nhấn nút Tạo PivotTable.

Để chọn 1 tuần: Tại E2 bạn chọn 1 tuần sẽ được kết quả của tuần đó, xem code trong File.
 

File đính kèm

Upvote 0
Để tạo mới PivotTable, trước tiên xóa cột D đến E, sau đó nhấn nút Tạo PivotTable.

Để chọn 1 tuần: Tại E2 bạn chọn 1 tuần sẽ được kết quả của tuần đó, xem code trong File.

Pivot table có sẵn, việc gì phải tạo rồi xóa, rồi lại tạo hả anh Be09?
 
Upvote 0
Pivot table có sẵn, việc gì phải tạo rồi xóa, rồi lại tạo hả anh Be09?

Đúng là nếu sử dụng cho 1 nút thì không cần đến Code dài dòng như vậy, nhưng tôi lường trước bạn ấy sẽ hỏi muốn thêm 1 nút nữa để tổng hợp vấn đề khác, thì việc hướng dẫn sẽ dễ dàng hơn mà không cần thay đổi Code.
 
Upvote 0
Đúng là nếu sử dụng cho 1 nút thì không cần đến Code dài dòng như vậy, nhưng tôi lường trước bạn ấy sẽ hỏi muốn thêm 1 nút nữa để tổng hợp vấn đề khác, thì việc hướng dẫn sẽ dễ dàng hơn mà không cần thay đổi Code.
"Tổng hợp vấn đề khác" thì sẽ phải tạo pivot table dạng khác, field nào bỏ vào đâu, Sum hay count, ... thì lúc này cái code đó cũng bỏ đi. Nếu viết code cho Pivot table, chỉ nên viết code điều khiển nó, chứ không phải vẽ ra nó. Vì code vẽ là 1 code cứng.
 
Upvote 0
Thanks Các bạn nhiều,Pivot là công cụ khá mạnh, mình đang ngâm cứu để phân tích dữ liệu sx.và đang tập viết code VBA cho tiện hơn.
 
Upvote 0
"Tổng hợp vấn đề khác" thì sẽ phải tạo pivot table dạng khác, field nào bỏ vào đâu, Sum hay count, ... thì lúc này cái code đó cũng bỏ đi. Nếu viết code cho Pivot table, chỉ nên viết code điều khiển nó, chứ không phải vẽ ra nó. Vì code vẽ là 1 code cứng.

Nếu bạn nêu cái code đó cũng bỏ đi và nêu 1 code cứng là 1 đánh giá quá thấp đối với người sử dụng, người ta không biết mới hỏi, có người giúp đỡ là quý lắm rồi.

Vấn đề này tôi không muốn tranh luận, nhưng với code đó tôi sẽ ứng biến ngay tức khắc cái người dùng cần mà không cần sửa đổi gì nhiều, còn việc bạn hỏi field nào bỏ vào đâu thì thực là nực cười vì code viết ra để chạy chứ đâu phải rê thả mà hỏi bỏ vào đâu.

Còn việc ứng dụng nó như thế nào thì tùy người sử dụng, mục đích chính của tôi là đóng góp cho diễn đàn, chứ không muốn bon chen, còn ai muốn bon chen là tùy.

Với việc đóng góp như thế này thì sẽ chẳng có bao giờ ai có đóng góp cho diễn đàn nữa, bản tính tôi lớn tuổi nên nói thật, chẳng vòng vo tam quốc gì cả, nếu có mết lòng ai thì ráng chịu.

Tôi chẳng nói móc, nói méo ai cả, việc này để các thành viên tự đọc và tự hiểu, còn các Mod nếu cho rằng bài viết này không hữu ích và mang tính đã kích thì hãy khóa bài viết và nêu ý kiến rõ ràng để các thành viên khác biết mà tránh xa.
 
Lần chỉnh sửa cuối:
Upvote 0
Việc đóng góp như thế này tôi đã thấy nhiều rồi nhưng tôi chẳng bao giờ để ý hay có ý kiến, ý cò nhưng khi tiếp xúc với các thành viên khác thì tôi mới hiểu là các thành viên nói đúng, anh em nói ptm0412 nghĩ lúc nào mình cũng là thầy, nên lời phát biểu ra lúc nào cũng mang tính kẻ cả.

Nhưng hãy nhớ đây là diễn đàn chẳng ai là thầy cả, chẳng qua là người biết nhiều, giúp người biết ít, người biết ít giúp người không biết, chứ chẳng ai tài giỏi gì cả, chẳng ai nói mình giỏi tất cả các thứ, nếu giỏi và hiểu biết nhiều thì ở ngoài kinh doanh chứ chẳng ai vào đây bon chen làm gì để mang tiếng thị phi.

Hôm nay tôi nói thẳng để các thành viên tham khảo và rút kinh nghiệm để cùng nhau đóng góp cho diễn đàn thật tốt, chứ không gì lợi ích riêng tư mà đã kích, gây mất đoàn kết, nếu thành viên nào giỏi không muốn đoàn kết thì hãy ra biển đông chơi với thằng Tàu khịa, tôi đồng ý cả 2 tay.
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu bạn nêu cái code đó cũng bỏ đi và nêu 1 code cứng là 1 đánh giá quá thấp đối với người sử dụng, người ta không biết mới hỏi, có người giúp đỡ là quý lắm rồi.

Vấn đề này tôi không muốn tranh luận, nhưng với code đó tôi sẽ ứng biến ngay tức khắc cái người dùng cần mà không cần sửa đổi gì nhiều, còn việc bạn hỏi field nào bỏ vào đâu thì thực là nực cười vì code viết ra để chạy chứ đâu phải rê thả.
Anh Be09 yên tâm là tôi cũng thích nói thẳng và nghe nói thẳng. Và nói thẳng thì không cần tuổi tác, nên dù tôi nhỏ tuổi hơn anh 1 chút tôi cũng nói. Việc tôi nói rằng "phải tạo pivot table dạng khác, field nào bỏ vào đâu, Sum hay count, ... thì lúc này cái code đó cũng bỏ đi." là có cơ sở, và mong anh phản biện chứ không phải là giận dỗi:

Trong code tạo Pivot table sẽ có những dòng lệnh cơ bản:

1. Gán dữ liệu nguồn:

Set PTCache = ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:=Sheets("Data").Range("A3").CurrentRegion.Address)

Nếu cần tạo Pivot table với dữ liệu nguồn khác, thì phải sửa câu lệnh này.

2. Gán trường cần tính toán (Sum, Count, Max) vào Pivot table:

ActiveSheet.PivotTables("PivotTable3").AddDataField ActiveSheet.PivotTables( _
"PivotTable3").PivotFields("BALANCE"), "Sum BALANCE", xlSum

a. Nếu không phải Sum mà là Max thì phải sửa code
b. Nếu trường cần tính không phải "BALANCE" mà là trường khác thì phải sửa code
c. Nếu cần tính 2, 3 trường thì phải viết thêm câu lệnh


3. Gán các trường tổng hợp vào RowField, các trường phân tích vào ColumnField, và các trường lọc vào Report Filter:

(Bài của tôi không nói là kéo thả, vì chạy code chứ có kéo thả đâu, nhưng cũng là gán "trường nào vào chỗ nào", bằng tay là kéo thả, bằng code là gán)

With ActiveSheet.PivotTables("PivotTable3").PivotFields("BALANCE")
.Orientation = xlRowField
.Position = 1
End With


- Code của anh gán 3 trường vào Rowfield, nếu cần gán chỉ 1, 2 trường sẽ phải xóa bớt
- Nếu muốn gán 4 trường, sẽ phải viết thêm 1 đoạn.
- Nếu không phải này mà là trường khác, thì phải sửa câu lệnh
- Nếu trong 3 trường, muốn 1 trường gán vào Columnfield, 1 trường vào Rowfield, 1 trường vào Report Filter, thì phải viết lại các câu lệnh

Tóm lại, Code tạo pivot table nhiều lắm thì dùng cho 1 nguồn dữ liệu, và 1 dạng Pivot table. Nếu thay đổi dạng Pivot: hoán vị, chuyển cột/ dòng, thêm bớt trường tính toán, thay đổi dạng tính toán, phải sửa khá nhiều. Anh nói "ứng biến ngay tức khắc cái người dùng cần mà không cần sửa đổi gì nhiều" thì tôi không tin. Trước đó anh còn nói thế này cơ: hướng dẫn sẽ dễ dàng hơn mà không cần thay đổi Code.

Không những thế, nếu đổi dữ liệu nguồn với tên field khác, code phải sửa toàn bộ hoặc viết lại từ đầu.

Cái mạnh của công cụ Pivot table là tạo dễ dàng bằng cách kéo thả. Thí dụ tôi có thể tạo PV trong 1 phút với database chuẩn. Còn viết code mất 15 phút (cao thủ viết nhanh), và chỉ xài 1 lần, cho 1 dạng, cho 1 vùng dữ liệu nguồn. Thay đổi thì sửa code 5 phút (nhanh hơn viết). Còn tôi thay đổi dạng, hoán vị, ... chậm cũng chỉ 1 phút.
 
Lần chỉnh sửa cuối:
Upvote 0
Xin lỗi các Mod hôm nay cho tôi được ý kiến hơi nhiều, tại vì các thành viên khác nêu nhiều ý kiến về ptm0412 nhưng tôi không tin, hôm nay mới thấy rõ được tất cả ý kiến của các thành viên khác đều đúng 99% và tôi đóng góp thêm 1 ý là đủ 100%, ý là như thế này ptm0412 xa rời anh em nên chẳng ai thích vì vậy mà chỉ chơi có 1 mình.
 
Upvote 0
Xin lỗi các Mod hôm nay cho tôi được ý kiến hơi nhiều, tại vì các thành viên khác nêu nhiều ý kiến về ptm0412 nhưng tôi không tin, hôm nay mới thấy rõ được tất cả ý kiến của các thành viên khác đều đúng 99% và tôi đóng góp thêm 1 ý là đủ 100%, ý là như thế này ptm0412 xa rời anh em nên chẳng ai thích vì vậy mà chỉ chơi có 1 mình.

Hy vọng anh đọc lại bài tôi viết và phản biện, chỉ ra chỗ tôi nói sai, thay vì giận dỗi.
 
Upvote 0
Xin lỗi các Mod hôm nay cho tôi được ý kiến hơi nhiều, tại vì các thành viên khác nêu nhiều ý kiến về ptm0412 nhưng tôi không tin, hôm nay mới thấy rõ được tất cả ý kiến của các thành viên khác đều đúng 99% và tôi đóng góp thêm 1 ý là đủ 100%, ý là như thế này ptm0412 xa rời anh em nên chẳng ai thích vì vậy mà chỉ chơi có 1 mình.

Đối với tôi chủ yếu là giúp đỡ cho các thành viên trên diễn đàn ứng dụng tốt vào công việc tại đơn vị mình cần, và ghét nhất là việc tranh luận, nhưng bạn nêu việc ứng biến thì tôi xin nêu rõ về câu lệnh:

Set PTCache = ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:=Sheets("Data").Range("A3").CurrentRegion.Address)

Với câu lệnh này tôi có thể lấy nguồn dữ liệu bất cứ sheet nào và bất cứ dòng nào, ví dụ:


Sheets("Data"), nếu muốn lấy dữ liệu từ sheet khác thì tôi thay Data bằng tên sheet khác.

Range("A3"), nếu muốn lấy dữ liệu từ tiêu đề cột ở dòng số mấy là tôi sửa A3 thành A....bất kỳ là xong, bây giờ chỉ việc nhấn nút tạo PivotTable là được kết quả của sheet khác mà tôi không cần sửa và thay đổi Code gì cả.

Còn tên Field là tự động lấy bất kỳ tiêu đề cột, thành ra đối với Code trên tôi chỉ cần 30 giây là có thể ứng biến từ cái này qua cái khác mà không cần nhiều thời gian (chỉ Copy tiêu đề cột hoặc Copy tên sheet Paste vào thay thế là được kết quả mới ngay mà không cần sửa code gì cả).

Các bạn nếu đã từng sử dụng những File do tôi Up lên diễn đàn, thì hôm nay các bạn có thể thử để biết được ứng dụng của nó mà thực hiện tốt trong công việc.
 
Lần chỉnh sửa cuối:
Upvote 0
Hy vọng anh đọc lại bài tôi viết và phản biện, chỉ ra chỗ tôi nói sai, thay vì giận dỗi.

Đối với tôi thì chẳng giận dỗi ai bao giờ cả và ghét nhất là việc tranh luận, mục đích chính của tôi là giúp đỡ anh em nên chỉ đưa ra giải pháp, còn anh em ứng dụng được vào công việc gì thì tùy, còn việc anh em cám ơn hay không cũng chẳng quan trọng, nhưng xét thấy công sức mình bỏ ra để giúp đỡ mà không thấy cám ơn thì phải suy nghĩ lại (có nên tốn nhiều công sức cho những thành viên như thế này hay không).

Tính tôi rất thẳng nên nói hoạch toẹt móng heo ra luôn chứ chẳng giấu giếm gì cả, ở đây tôi không muốn tranh luận và cũng chẳng muốn chỉ trích hoặc nói ra cái sai của người khác, mà tôi chỉ nói cụ thể cái mình giúp anh em và anh em suy nghĩ gì về mình.

Vấn đề tôi nêu ở bài #8 và tôi đã giải thích ở bài #13 các bạn hãy thử thực hiện xem.
 
Lần chỉnh sửa cuối:
Upvote 0
...
Range("A3"), nếu muốn lấy dữ liệu từ tiêu đề cột ở dòng số mấy là tôi sửa A3 thành A....bất kỳ là xong, bây giờ chỉ việc nhấn nút tạo PivotTable là được kết quả của sheet khác mà tôi không cần sửa và thay đổi Code gì cả.

Còn tên Field là tự động lấy bất kỳ tiêu đề cột, thành ra đối với Code trên tôi chỉ cần 30 giây là có thể ứng biến từ cái này qua cái khác mà không cần nhiều thời gian (chỉ Copy tiêu đề cột hoặc Copy tên sheet Paste vào thay thế là được kết quả mới ngay mà không cần sửa code gì cả).

Mỗi cái copy paste anh làm bao nhiêu giây? Giả sử:
- Đổi Sum thành max
- Đổi trường tính toán A thành trường B
- Thêm trường tính toán C
- Đổi trường tổng hợp X thành Y trong Row
- Lôi trường Z từ Row lên Column
- Thêm trường T vào Column

Sẽ mất 6 x số giây = bao nhiêu phút? Chưa nói là group trường ngày tháng, tạo calculated field, hoặc cái gì khác mà code chưa có, sẽ phải viết thêm, và chắc chắn không phải 30 giây 1 dòng lệnh.

Ban đầu anh nói không cần sửa code, và bây giờ anh vẫn khẳng định không cần sửa code. Vậy copy thay vào không phải là sửa? Nếu thêm trường anh copy nguyên đoạn lệnh rồi thay tên trường không phải là sửa? Xóa chữ xRowField thay bằng xlColumnField không phải là sửa?

Ngoài ra, nếu thành viên chủ topic cần thay đổi 1 lần, anh sẽ theo để copy 1 lần, cần thay đổi 3 lần anh theo copy 3 lần?
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi đã nói rồi tôi không muốn tranh luận, nhưng ở đây theo quan điểm của tôi nêu vấn đề sửa Code như sau:

Nếu thay đổi cấu trúc thì gọi là sửa.

Nếu không thay đổi cấu trúc thì gọi là thay thế, vì tên sheet này tôi thay bằng tên sheet khác, tiêu đề của dòng này tôi thay bằng tiêu đề của dòng khác.

Tôi không phải là giáo viên nên chẳng cần giải thích nhiều, theo quan điểm của tôi Copy và Paste tên sheet hoặc tiêu đề cột tôi gọi là thay thế vì tôi chẳng thay đổi gì về cấu trúc cũng như nội dung của Sheet hay sửa câu cú của Code.

Tôi thấy rằng Code trên rất hữu ích cho các thành viên chưa am hiểu nhiều về VBA, qua những vấn đề tôi nêu ở trên hy vọng giúp ích cho các bạn thay thế tên sheet và thay thế tiêu đề cột và nhấn nút để xem kết quả mà không cần thay đổi cấu trúc của bất cứ dòng code nào.
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi không phủ nhận thiện chí giúp đỡ mọi người của anh. Tôi chỉ phản biện câu anh nói:
thêm 1 nút nữa để tổng hợp vấn đề khác, thì việc hướng dẫn sẽ dễ dàng hơn mà không cần thay đổi Code.

Té ra anh chỉ "copy thay thế" và không gọi là "sửa", cũng không phải "thay đổi". Kể cả thêm bớt trường, hoán vị trường, dời vị trí trường, thay đổi trường, anh cũng chỉ "copy thay thế". Nếu thay xlRow bằng xlColumn, anh cũngsẽ tìm chỗ nào có chữ xlColumn để copy (trong code không có sẵn).

Và vậy thì tôi cũng không phản biện làm gì nữa.
 
Lần chỉnh sửa cuối:
Upvote 0

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

Back
Top Bottom