Áp dụng VBA vào Pivot table để lập báo cáo theo mẫu

Liên hệ QC
Status
Không mở trả lời sau này.

ptm0412

Bad Excel Member
Thành viên BQT
Administrator
Tham gia
4/11/07
Bài viết
13,777
Được thích
36,276
Donate (Momo)
Donate
Giới tính
Nam
Nghề nghiệp
Consultant
Áp dụng VBA vào Pivot table để lập báo cáo theo mẫu quy định

Như đã nói trong sách Pivot Table 2003, Pivot Table là 1 công cụ rất mạnh để phân tích, nhưng để nguyên Pivot table thì không in ra như 1 báo cáo đúng chuẩn được.

Hôm nay tôi viết bài này, giới thiệu 1 số thủ thuật trong đó có dùng VBA để định dạng Pivot table lại thành 1 báo cáo hoàn chỉnh có thể in ra được.

Có thể dùng VBA cho đối tượng Pivot Table trong các việc:

- Refresh
- Filter trường Page
- Filter trường Row
- Filter trường Column
- Hoán vị trường trong dòng, cột
- Thêm bớt trường vào dòng, cột
- Dời trường từ dòng sang cột, hoặc Page
- Thay đổi dữ liệu cần tổng hợp, phân tích.
- Thay đổi field setting
- Group trường
- ...


Đối với Excel 2007 - 2010, có thể Filter các field Page với multiple selection (2003 chỉ filter multiselect với row field và column field)

Ngoài ra, kết hợp công thức với thù thuật dấu dòng, thêm cột, dùng VBA đánh số thứ tự, kẻ khung, ... ta sẽ có báo cáo hoàn chỉnh.

Việc dùng VBA để filter, còn để tiết kiệm. Thí dụ với báo cáo công nợ chi tiết 1 khách hàng từ ngày A đến ngày B, dùng 1 combobox chọn tên khách hàng và filter trường KH theo combobox này, ta sẽ dùng 1 sheet, 1 pivot table duy nhất để in báo cáo cho cả trăm khách hàng lần lượt từng KH một.

Đối với báo cáo tổng hợp công nợ tất cả KH, ta có thể chọn in chỉ các khách hàng dư nợ, hoặc các khách hàng dư có (trả tiền trước), in các khách hàng hết nợ, và dĩ nhiên, cả in hết.

PivotVBA01.jpg


Khi chọn 1 option button khác, ta sẽ có 1 báo cáo khác.

PivotVBA02.jpg

Code chính của việc tác động vào Pivot table như sau:

PHP:
Sub Pivot01()
Dim Status, EndR As Long, BeginR As Long
Select Case ActiveSheet.[I1]
    Case 1
        Status = "(All)"
    Case 2
        Status = "1"
    Case 3
        Status = "2"
    Case 4
        Status = "0"
    End Select
    With ActiveSheet.PivotTables("PivotTable1").PivotFields("TinhtrangNo")
        .CurrentPage = Status
    End With
End Sub
Trong đó, "TinhtrangNo" là 1 field bổ sung thêm vào dữ liệu nguồn.

Ngoài ra các code khác để đánh số thứ tự, kẻ khung, ...

Có sự khác biệt của vài dòng lệnh giữa 2003 và 2007:

Trong 2007 - 2010, nếu Pivot table đã định dạng theo 1 style, thì VBA không can thiệp được vào định dạng kẻ khung, đổi chữ đậm, nghiêng, ... cho các thành phần của Pivot table.

Trong file kèm theo tôi có ghi chú.

__________________________

Tiếp theo (bài sau) sẽ là ứng dụng combobox chọn 1 khách hàng trong danh sách để in chi tiết khách hàng đó.
 

File đính kèm

  • Pivot-VBA-01.rar
    26.2 KB · Đọc: 2,841
Sổ chi tiết khách hàng (chọn khách hàng bằng combobox)

Tiếp theo bài trên, tôi làm 1 báo cáo chi tiết từng khách hàng cũng bằng Pivot table, dùng 1 Combobox để chọn khách hàng, dùng VBA để lọc Pivot table với khách hàng đó.

Câu lệnh lọc theo tên khách hàng và refresh pivot table là:

PHP:
    With ActiveSheet.PivotTables("PivotTable1")
        .PivotFields("Mskh").CurrentPage = [J1].Value
        .PivotCache.Refresh
    End With
Với J1 là linkedCell của combobox.

Tôi có dùng VBA để:

- Đánh số thứ tự
- Kẻ khung, tô đậm, tính số dư cuối kỳ.
- tính thêm 2 cột Dư nợ, dư có
- Set Print Area (để khỏi in mấy object)
- Đánh số trang trong Page Footer
- Gán Page Footer bằng tên khách hàng vừa chọn.
- Định dạng trang in vừa với bề ngang trang A4

Những code này có cái trên GPE đã có, có cái chưa. Các bạn cứ tham khảo và tuỳ biến mà dùng. (Cũng là record macro thôi, không có gì ghê gớm).

PivotVBA03.jpg

________________________

Đây chỉ mới lọc có 1 trường là khách hàng, bài sau tôi sẽ làm báo cáo lọc theo khách hàng và lọc theo tháng, năm hoặc thời gian từ ngày ... đến ngày... (Từ dễ đến khó mà)
 

File đính kèm

  • Pivot-VBA-02.rar
    49.5 KB · Đọc: 1,493
Trong bài 2 "Báo cáo chi tiết khách hàng lọc từ giá trị của combobox", do đặc diểm của Pivot table, sinh ra 1 lỗi.
Đặc điểm đó là: Pivot table tổng hợp phân tích từ 1 bảng dữ liệu nguồn, nên nếu 1 khách hàng nào không có giao dịch trong kỳ, dữ liệu không có, thì Pivot không thể hiện. Cụ thể là khi nhấn nút lọc trường mã khách hàng, sẽ không thấy mã KH đó trong danh sách xổ xuống.
Trong khi đó, danh sách KH trong combobox lại là danh sách đầy đủ. Nếu chọn 1 khách hàng trong combobox mà khách hàng đó không phát sinh giao dịch, thì Pivot table không có KH đó để lọc.
Vậy khắc phục ra sao? Tôi giải quyết 1 cách đơn giản là: Nếu bị lỗi đó, không lọc gì cả, mà dấu quách cái pivot đi, cho yên nhà lợi nước. Bên dưới ghi 1 dòng: Không phát sinh. Nhẹ nhàng!

PivotVBA04.jpg

Từ dòng 9 đến dòng 13 là mấy dòng tên field của Pivot, trước nay vẫn dấu. Nay khách hàng KH06 không phát sinh, dấu luôn cả bảng pivot từ 15 đến 20 luôn. Dòng 21, ghi chữ Không phát sinh. Chọn khách hàng khác có phát sinh, cho hiện ra lại. Phẻ re.
 

File đính kèm

  • Pivot-VBA-03.rar
    56.1 KB · Đọc: 1,094
Sổ chi tiết khách hàng (chọn khách hàng bằng combobox, chọn tháng bằng validation)

Bài này dành riêng cho 2003. Excel 2007 - 2010 lọc theo thời gian hay hơn 2003.

1. Nếu bạn chỉ muốn lọc theo tháng, và không có nhu cầu lọc theo khoảng thời gian:

Bạn tạo 1 trường tháng trong dữ liệu, bằng hàm Month(), quá dễ. Kéo thả trường này vào Page.
Code sẽ đơn giản như những file trên.

PHP:
With ActiveSheet.PivotTables("PivotTable1")[/COLOR][/SIZE][/COLOR][/SIZE]
[SIZE=3][COLOR=red][SIZE=2][COLOR=black]    .PivotFields("Thg").CurrentPage = ActiveSheet.[K3].Value
            .PivotCache.Refresh
    End With
Dùng validation tạo list cho ô K3 để chọn tháng. Trong List sẽ có 1 dòng để chọn (All), để xem hết dữ liệu cả năm.


PivotVBA07.jpg

Tất nhiên khi chọn tháng 2 trở đi, số dư đầu kỳ sẽ là số dư cuối tháng trước, chứ không phải lấy số dư đầu năm.

PivotVBA05.jpg

Nhắc lại, khi chọn mã KH, nếu KH không có phát sinh, thì bị lỗi, ta xử lý lỗi đó.
khi chọn tháng, nếu trong tháng, khách hàng đó không phát sinh, không bị lỗi. Pivot chỉ hiện lên dòng Total bằng 0 mà thôi. Ta cũng sẽ xử lý riêng trường hợp này.

PivotVBA06.jpg

Về râu ria, tôi đã gắn tháng hiện hành vào page footer. Và cả trên tiêu đề báo cáo.

Ghi chú:

Loạt bài này chủ yếu giới thiệu code điều khiển Pivot table, nên dữ liệu từ đâu mà có ta không quan tâm lắm. Dữ liệu có thể bất kỳ, bất cứ ngành nghề nào. Tuỳ theo yêu cầu của báo cáo, ta tạo những cột phụ cho Data nguồn, hoặc không cần.

Miễn là đủ điều kiện tiêu chuẩn CSDL là có thể tạo pivot, in báo cáo. Trình bày báo cáo thế nào là tuỳ ngành nghề quy định, nhưng, từ Pivot, ta có những code râu ria để bổ sung cột, dòng, để pivot với thế mạnh tính toán nhanh của nó có thể làm cho file nhẹ bớt và nhanh hơn so với dùng rất nhiều những công thức. Và với VBA xử lý Pivot sau khi chọn tiêu chí báo cáo, cũng chỉ cần 1 sheet cho mọi tiêu chí. Thậm chí kết hợp nhiều tiêu chí.
______________

Bài sau sẽ chọn từ ngày đến ngày. Code sẽ phức tạp hơn 1 chút, vì vẫn dùng Excel 2003.
 

File đính kèm

  • Pivot-VBA-04.rar
    83.2 KB · Đọc: 1,145
Sổ chi tiết khách hàng (lọc theo khách hàng và lọc theo thời gian tuỳ ý)

2. Nếu bạn muốn lọc theo quý 3 tháng, hoặc muốn lọc thời gian bất kỳ (thí dụ từ tháng 2 đến tháng 7):


Code VBA sẽ phải duyệt qua tất cả các items, Item nào thoả điều kiện thì cho hiện, không thoả thì dấu đi.
Đây là dạng multiple Select, nến với 2003 phải đưa xuống Rows fileds Area mới có thể multi select.
Còn 2007 - 2010, để nguyên trên Page cũng được.

File đính kèm tạo cho 2003.

Code như sau:
PHP:
    With ActiveSheet.PivotTables("PivotTable1").PivotFields("thg")
    .PivotItems(BeginD).Visible = True
    For i = 1 To .PivotItems.Count
        With .PivotItems(i)
            .Visible = (i >= BeginD And i <= EndD)
        End With
    Next
End With

Vẽ 3 Option button để chọn cách lọc: Théo tháng, theo quý, và theo số tháng bất kỳ
Vẽ 2 combobox, 1 cái chọn tháng, 1 cái chọn quý.
Chọn tháng bất kỳ thì dùng 2 ô trên bảng tính.

PivotVBA08.jpg

PivotVBA09.jpg

PivotVBA10.jpg

Các cái râu ria như cũ.

PivotVBA11.jpg
 

File đính kèm

  • Pivot-VBA-05.rar
    92 KB · Đọc: 1,166
Dùng VBA hoán vị và dời các fields

Thế mạnh của Pivot Table là hoán vị các field để tạo ra các mẫu báo cáo khác nhau.

Code hoán vị rất đơn giản:

PHP:
    Field = "Mathang"
    With ActiveSheet.PivotTables("PivotTable1").PivotFields(Field)
        ' Hoán đổi qua lại vị trí 2 trường cùng 1 Area (Row Fields, Column Fields, hoặc Page Fields)'
        .Position = IIf(.Position = 1, 2, 1)
        ' Dời đến Row Area'
        .Orientation = xlRowField
        ' Dời đến Column Area'
        .Orientation = xlColumnField
        ' Dời đến Page Area'
         .Orientation = xlPageField
        ' Dời Row field qua trái hoặc Column Field lên trên'
        .Position =  .Position - 1
        ' Dời Row field qua phải hoặc Column Field xuống dưới'
        .Position =  .Position + 1
    End With
Ở đây ta dùng lại file trong topic "Pivot Table 2003" về Doanh thu và lợi nhuận.

Dùng 3 Option Button để chọn field đưa vào Column Area, 2 fields còn lại đưa xuống Row Area
Dùng 1 checkbox để cộng 3 khu vực trong nước thành 1 tiêu chí là "nội địa", thực chất là ẩn hiện field. Trong đó "Nội địa" là 1 calculated Item của trường khu vực.
Dùng 1 Command Button để hoán vị 2 field trong Row Area: trái qua phải, phải qua trái.

PivotVBA12.jpg

Thế là ta có cả chục mẫu báo cáo theo các yêu cầu khác nhau:

Field "Năm" cho vào Column, Cộng 3 khu vực thành "Nội địa"

PivotVBA13.jpg

Bỏ không cộng nội địa để nguyên Bắc Trung Nam:

PivotVBA14.jpg

Nhấn thử nút "Đổi cấp": 2 cột Khu vực và Mặt hàng đổi chỗ cho nhau (nếu nhấn lần nữa sẽ đổi ngược lại):

PivotVBA15.jpg

Dời trường khu vực lên Column, trường Năm xuống Row:

PivotVBA16.jpg

Kết hợp với dấu dòng, dấu cột, đánh số thứ tự, kẻ khung, ta có báo cáo theo ý muốn.
 

File đính kèm

  • Pivot-VBA-06.rar
    34.5 KB · Đọc: 988
Giải thích một vài điểm trong bài #06, file đính kèm Pivot-VBA-06.xls

1. Mục "Nội địa" là 1 Calculated Item của trường Khu vực.

Đặc điểm của Pivot table là khi insert 1 calculated Item vào pivot table, và set data là SUM, thì cột tổng hoặc dòng tổng (kể cả Grand Total lẫn Sub Total), sẽ cộng luôn cả Item này vào. Do đó, nếu Nội địa được tính từ tổng 3 items Bắc, Trung, Nam, thì khi thể hiện Grand Total for Columns hoặc Grand Total for Rows, tổng sẽ bị tính trùng.

Cách giải quyết là:

- Hoặc không thể hiện dòng, cột tổng của Pivot table, nếu cùng lúc muốn thể hiện 3 khu vực và cả cột nội địa (tổng con 3 khu vực). Nếu vẫn muốn thể hiện Grand Total, thì khi thể hiện 3 khu vực, phải filter không thể hiện Item "nội địa", và ngược lại, thể hiện Item "nội địa" thì phải filter không thể hiện 3 khu vực con. Ghi nhớ là filter không thể hiện khác với thể hiện mà dấu dòng dấu cột,Grand total vẫn tính mọi item "có thể hiện"

- Hoặc tự tạo Item "Tổng cộng" và thể hiện Item này 1 cách độc lập như trong file bài #06

2. VBA không hỗ trợ tiếng Việt có dấu.

Tên field theo quy ước là nên đặt ngắn gọn, không có dấu tiếng Việt. Đặc biệt là code VBA không hỗ trợ Unicode, nên không gõ trực tiếp tên field có dấu vào code được.
Tên field thì ta có thể dễ dàng dấu dòng và thay vào bằng tiêu đề của báo cáo, như tất cả các file ở trên đều làm.

Tuy nhiên, Calculated Item và cả Item gốc, không dễ gì mà dấu được. Nên khi dùng VBA điều khiển ẩn hiện các items, ta phải sử dụng các ô trên sheet chứa tên Item làm trung gian, như trong bài #06.
 
Thay đổi dữ liệu cần phân tích:

Dữ liệu của ta không chỉ có doanh thu, mà còn có lợi nhuận. Sếp bắt ta phân tích cả lợi nhuận nữa. Không nhất thiết phải có 2 sheet cho các báo cáo doanh thu riêng, lợi nhuận riêng. VBA có thể làm được điều này.

Bảng điều khiển dùng thêm 2 Option button để chọn 1 trong 2: Doanh thu hoặc Lợi nhuận.

PivotVBA17.jpg

Code gỡ field data hiện thời (Doanh thu) ra:

PHP:
    With ActiveSheet.PivotTables("PivotTable1")
    .PivotFields("Sum of Doanhthu").Orientation = xlHidden
    End With

Code gắn Field khác ("Loinhuan") vô:

PHP:
    With ActiveSheet.PivotTables("PivotTable1")
    .AddDataField ActiveSheet.PivotTables("PivotTable1").PivotFields("Loinhuan"), _
    "Sum of Loinhuan", xlSum
    End With
Chú ý:

1. Tên trường trong vùng Data:

Trường hiện hữu ta kéo vào vùng Data là "Doanhthu", nhưng tên trường thực sự để xử lý là tên mà Pivot table đặt tự động mà ta có thể thấy, và sửa đổi trong Field setting. Thường là Sum of hoặc Count of, ... nối vào tên trường dữ liệu chính thức. Như hình, ta có thể sửa tên field trong field setting từ Sum of Loinhuan thành LN, thì khi gỡ ra phải gỡ field LN chứ không phải field "Loinhuan". Tên "LN" này cũng có thể đặt bằng VBA.

PivotVBA18.jpg

Nếu gộp 2 code trên lại, đồng thời dùng chung cho cả 2 option button thì code sẽ là:

PHP:
Sub SelectField()
InField = IIf([N1] = 1, "Doanhthu", "Loinhuan")

    With ActiveSheet.PivotTables("PivotTable1")
    .PivotFields(IIf([N1] = 2, "DT", "LN")).Orientation = xlHidden
    .AddDataField ActiveSheet.PivotTables("PivotTable1").PivotFields(InField), _
    IIf([N1] = 1, "DT", "LN"), xlSum
    End With
End Sub
Với N1 là linkedcell của cả 2 option.

2. 2 Option dùng riêng nhóm với những option còn lại:

Nếu không làm gì cả, thì 2 Option vẽ thêm sẽ chung nhóm với 3 Option trước đó. Và ta chỉ có thể chọn 1 trong 5 Option mà thôi. Nhưng ta muốn nhóm 2 Option này có thể chọn 1, nhóm 3 Option khác có thể chọn 1 khác.

Vậy ta phải bao quanh ít nhất 1 trong 2 nhóm đó bằng 1 control là GroupBox.
Với mỗi Group Box có nhiều Option, ta có thể chọn 1.
 

File đính kèm

  • Pivot-VBA-07.rar
    34.7 KB · Đọc: 854
VBA điều khiển Field setting, dùng Phân tích đa năng

Pivot table không chỉ có Sum, Min, Max, ...Pivot table còn tính mức tăng giảm, tỷ lệ tăng giảm, dựa vào kỳ gốc hoặc dựa vào kỳ trước.

Pivot Table còn tính tỷ lệ đóng góp của từng mục trong tổng số (tổng số theo dòng, tổng số theo cột, và tổng số toàn bảng.

Excel 2010, lại còn tính tỷ lệ % đóng góp của 1 mục con so với mục cha.

Với bảng điều khiển sau, ta có thể phân tích ít nhất 12 kiểu trên 1 bảng tính. Nếu tính cả Group 3 khu vực thành nội địa, thành 24 kiểu, tính cả đổi cấp thành 40 kiểu. Thay đổi 3 nội dung phân tích: Doanh thu, Lợi nhuận, và tỷ suất lợi nhuận trên doanh thu, thành 120 kiểu!

PivotVBA19.jpgPivotVBA19a.jpg

Do đang mệt, nên để giải thích sau.
 

File đính kèm

  • Pivot-VBA-08.rar
    73.8 KB · Đọc: 1,056
Giải thích 1 số điểm trong bài #09, file Pivot-VBA-08

1. Code dùng để thay đổi field setting:


PHP:
   With ActiveSheet.PivotTables("PivotTable1").PivotFields(CurrentField)
      ' Sum:'
         .Calculation = xlSum
     'Max:'
         .Calculation = xlMax
     'Mức tăng giảm so với kỳ trước:'
        .Calculation = xlDifferenceFrom
        .BaseField = "Nam"
        .BaseItem = "(previous)"
        .NumberFormat = "#,###"
     'Mức tăng giảm so với kỳ gốc (2000):'
        .Calculation = xlDifferenceFrom
        .BaseField = "Nam"
        .BaseItem = "2000"
        .NumberFormat = "#,###"
    'Tỷ lệ tăng giảm so với kỳ trước:'
        .Calculation = xlPercentDifferenceFrom
        .BaseField = "Nam"
        .BaseItem =  "(previous)"
    'Tỷ lệ tăng giảm so với kỳ gốc (2000):'
        .Calculation = xlPercentDifferenceFrom
        .BaseField = "Nam"
        .BaseItem = "2000"
        .NumberFormat = "0.00%"
    'Tỷ lệ thành phần trong cột:'
        .Calculation = xlPercentOfColumn
    'Tỷ lệ thành phần trong hàng:'
        .Calculation = xlPercentOfRow
    'Tỷ lệ thành phần trong cả bảng:'
        .Calculation = xlPercentOfTotal
    'Excel 2010:Tỷ lệ thành phần so với subtotal Dòng (parent Row)'
        .Calculation = xlPercentOfParentRow
    'Excel 2010:Tỷ lệ thành phần so với subtotal cột (parent Column)'
        .Calculation = xlPercentOfParentColumn
    End With
2. Ý nghĩa phân tích:

Mặc dù Pivot table có rất nhiều cách phân tích khác nhau như thế, nhưng với mỗi loại dữ liệu, ta chỉ chọn những phân tích phù hợp. Chủ yếu với dữ liệu doanh thu lợi nhuận, người ta chỉ phân tích mức tăng trưởng và tỷ lệ tăng trưởng theo năm. Nếu có thêm, thì phân tích tỷ lệ đóng góp của các mặt hàng hoặc các khu vực trong tổng thể. Và phân tích thành phần như vậy, tỷ lệ đóng góp trong từng năm sẽ chỉ ra được xu hướng phát triển của từng mặt hàng hoặc từng khu vực, còn tỷ lệ đóng góp của 1 năm so với 5 năm đôi khi là vô nghĩa. Do đó, nút xoay bảng đã bị vô hiệu đối với mục này.

3. Các control sử dụng:

- Toggle Button: trong vài trường hợp, toggle thay thế cho Option button để tránh sự đơn điệu.
- Sử dụng Combobox của form hay combobox của control toolbox: Tuỳ ý đồ của ta. Nếu cần lấy giá trị trong danh sách xổ xuống, dùng control toolbox. Nếu khôngcần lấy giá trị, chỉ cần phân biệt loại 1, 2, 3, ... thì dùng Combobox của form.
- Group Box: dùng để phân nhóm các option chọn lựa như đã nói ở bài trên. Nếu khéo sử dụng, nó trở thành công cụ trang trí.

Vài lời chia sẻ kinh nghiệm.
 
Lần chỉnh sửa cuối:
Dùng VBA điều khiển Group ngày tháng

Còn mục cuối cùng tôi giới thiệu về VBA cho Pivot table là dùng VBA điều khiển Group ngày tháng.

Code:

PHP:
'Group theo tháng:'
    [C16].Group Start:=39448, End:=True, Periods:=Array(False, False, False _
        , False, True, False, False)

'Group theo quý'
    [C16].Group Start:=True, End:=True, Periods:=Array(False, False, False, _
        False, False, True, False)

'Group theo 6 tháng (tức group theo ngày, 183 ngày)'
    [C16].Group Start:=39448, End:=39813, By:=183, Periods:=Array(False, _
        False, False, True, False, False, False)

Note:
Array(False, False, False, False, True, False, False) theo thứ tự là Seconds, Minutes, Hours, Days, Months, Quarters, Years.
Mục nào True là mục được chọn. Nếu Group 2 cấp, thì 2 mục được True.

Ta sẽ phân tích hoặc doanh số bán hàng, hoặc tiền thu được theo từng kỳ 1 tháng, 3 tháng, 6 tháng.

PivotVBA20.jpg
 

File đính kèm

  • Pivot-VBA-09.rar
    73.4 KB · Đọc: 879
TỔNG KẾT: DÙNG VBA ĐIỀU KHIỂN PIVOT TABLE ĐỂ TẠO BÁO CÁO:

I. Điều khiển các chức năng cơ bản và nâng cao:

1. Hoán đổi vị trí các fields trong cùng Area


PHP:
With ActiveSheet.PivotTables("<PivotTableName>") 
    .PivotFields("<FieldName>").Position = IIf(.Position = 1, 2, 1)
        ' Dời Row field qua trái hoặc Column Field lên trên:'
        .PivotFields("<FieldName1>").Position =  .Position - 1 
        ' Dời Row field qua phải hoặc Column Field xuống dưới:'
        .PivotFields("<FieldName2>").Position =  .Position + 1
End With


2. Chuyển vị trí fields từ Area này qua Area khác

PHP:
     With ActiveSheet.PivotTables("<PivotTableName>")
        .PivotFields("<FieldName1>").Orientation = xlRowField 'Row Area'
        .PivotFields("<FieldName2>").Orientation = xlColumnField 'Column Area'
        .PivotFields("<FieldName3>").Orientation = xlPageField 'Page Area'
    End With


3. Thêm & thay đổi dữ liệu cần phần tích trong Data Area

PHP:
    With ActiveSheet.PivotTables("<PivotTableName>")
        .PivotFields("Alias of <FieldName1>").Orientation = xlHidden 'gỡ field ra khỏi Data Area'
        .AddDataField ActiveSheet.PivotTables("<PivotTableName>").PivotFields("<FieldName2>"), _
         "Alias of <FieldName2>", xlSum/ xlMax/ xlMin/ ... 'Thêm field vào Data Area'
    End With
4. Show - Hide GrandTotal

PHP:
With ActiveSheet.PivotTables("PivotTable1")
     .RowGrand = True/ False
        .ColumnGrand = True/ False
End With
5. Filter single selection
PHP:
ActiveSheet.PivotTables("<PivotTableName>").PivotFields("<FieldName>").CurrentPage = <FieldItem>
6. Filter Multiple selection:

PHP:
With ActiveSheet.PivotTables("<PivotTableName>").PivotFields("<FieldName>")
    For i = 1 To .PivotItems.Count
        With .PivotItems(i)
            .Visible = (Condition1 And/Or Condition2 And/Or Condition3 ...)
        End With
    Next
End With
7. Thay đổi field setting

PHP:
   With ActiveSheet.PivotTables("PivotTable1").PivotFields(CurrentField)
      ' Sum:'
         .Calculation = xlSum
     'Max:'
         .Calculation = xlMax
     'Mức tăng giảm so với kỳ trước:'
        .Calculation = xlDifferenceFrom
        .BaseField = "Nam"
        .BaseItem = "(previous)"
        .NumberFormat = "#,###"
     'Mức tăng giảm so với kỳ gốc (2000):'
        .Calculation = xlDifferenceFrom
        .BaseField = "Nam"
        .BaseItem = "2000"
        .NumberFormat = "#,###"
    'Tỷ lệ tăng giảm so với kỳ trước:'
        .Calculation = xlPercentDifferenceFrom
        .BaseField = "Nam"
        .BaseItem =  "(previous)"
    'Tỷ lệ tăng giảm so với kỳ gốc (2000):'
        .Calculation = xlPercentDifferenceFrom
        .BaseField = "Nam"
        .BaseItem = "2000"
        .NumberFormat = "0.00%"
    'Tỷ lệ thành phần trong cột:'
        .Calculation = xlPercentOfColumn
    'Tỷ lệ thành phần trong hàng:'
        .Calculation = xlPercentOfRow
    'Tỷ lệ thành phần trong cả bảng:'
        .Calculation = xlPercentOfTotal
    'Excel 2010:Tỷ lệ thành phần so với subtotal Dòng (parent Row)'
        .Calculation = xlPercentOfParentRow
    'Excel 2010:Tỷ lệ thành phần so với subtotal cột (parent Column)'
        .Calculation = xlPercentOfParentColumn
    End With
8. Group trường ngày tháng:

PHP:
'Group theo tháng:'
    [C16].Group Start:=True, End:=True, Periods:=Array(False, False, False _
        , False, True, False, False)

'Group theo quý'
    [C16].Group Start:=True, End:=True, Periods:=Array(False, False, False, _
        False, False, True, False)

'Group theo quý và tháng (2 cấp)'
    [C16].Group Start:=True, End:=True, Periods:=Array(False, False, False, _
        False, True, True, False)

'Group theo 6 tháng (tức group theo ngày, 183 ngày)'
    [C16].Group Start:=39448, End:=39813, By:=183, Periods:=Array(False, _
        False, False, True, False, False, False)


II. Sử dụng các control của Form và của Control toolbox:


- OptionButton
- Groupbox
- Checkbox
- Toggle Button
- Combobox (Form Control)
- Combobox (ActiveX control)
- Command Button

Xin cám ơn đã theo dõi!

Mọi đóng góp, góp ý, thắc mắc xin vui lòng Post trong topic http://www.giaiphapexcel.com/forum/...c-mắc-về-topic-Ứng-dụng-VBA-trong-Pivot-Table
 
Lần chỉnh sửa cuối:
Status
Không mở trả lời sau này.
Web KT
Back
Top Bottom